|
刚学习的同学,有些还不会,我这里贴点C和asm的代码。只供参考。, v2 T' V$ P; ?4 G/ t9 ~* d
6 `! I0 h; g2 N- s* h! p
这是C的- /********************************************************************
, t# R6 w7 ~3 b* B9 a# M - * File: DOS4G.H *# G6 U4 W# r A5 o
- * Compile with BC 3.1 ( Editor: Tab size = 4 ) *: u& G3 U# K# K0 K+ j" e% }5 m
- * *0 r: G* s" N) X" E: J+ A7 B+ t
- * ========================Title=============================== *
4 i, O/ C3 O/ F& x# G. @/ n - * 这个函数是让系统进入DOS 4G模式 * h f2 z0 s& W, i: q
- * 程序参考了:陈家琪《DOS实方式下直接访问4GB》 *
$ G6 v) ^" K! [4 v- y - * *
4 M2 j/ I4 q- Z. \7 _7 F, r, g) A - * 使用: openA20(); set4gb(); *
; @* {$ }) E2 ~. h; }: G" l; e+ l3 w# r - * *2 V3 _9 J: i9 m6 p3 [
- * ===========================History========================== *% s( p. g; t4 Q* I
- * author: bini *" z# G0 H9 ~5 Q; T$ @, G5 @% a/ f
- * date: 2004-11-30 Frist version. *, I6 r7 A/ c8 A2 B: }, q1 e, a
- ********************************************************************/
f: ~6 y3 e) `! }+ o$ w S, i
+ u8 ^/ @! Z( {; O p7 @( a- #include <conio.h>
+ a' C. L' n8 Z* {4 I8 E/ N6 B6 f - #pragma inline1 J& V6 M# r3 `! U% X. h
- $ C; S# f9 U# e M& v1 J$ V
- /***********************************************
3 C; A3 J O6 u$ P6 { H' o. ~2 F - * 两个GDT,第一个为系统使用,不管,默认为0 *# ^6 _( l- m9 y+ B
- * 第二个为一个数据段,没有代码段。 *
( k9 {( O7 f+ Z' |" K' r - ***********************************************/
5 L( r6 w2 a( |6 Q& R - unsigned long GDT_def[ ]={0,0, /*系统使用*/2 n' I% z5 H$ |& V* P
- 0x0000FFFF, /* hi16bit( 0~15 ) is base low=0,
1 t) I3 Y+ W( A) X& z2 A. K- @ - low16bit( 0~15 ) is limit low=0xFFFF
$ T' f" R5 i4 W% w - */
/ z& J7 x$ }! g5 J - 0x008F9200};/* 最低字节为 base( bit 16~23 )4 p0 C3 T* g1 M- \9 d! A# M# z, Z0 r
- 最高字节为 base( bit 24~31 )
5 n8 t7 E v) R1 W1 l$ Y - ) |' ]: ~+ `3 x2 X4 }" X0 y# ]
- 属性Attrib = 0x8F92
. i# K: D+ f( X9 A: t7 V0 k -
# W$ ?4 ~' N+ l. f - 属性位Hibyte低四位为 ' y) W# `0 ^1 G- X* K
- Limit( 16~19 )=F; ]7 u; {1 H% ] }( G' C7 t; z
- 属性位Hibyte bit7 为粒度
& K: z9 V: Z! j; x2 S6 g/ G - (值1=4KB粒度)
$ j0 S) E& ?9 f! I# r4 t - 8F & 0x80 = 1/ T3 M5 E2 u' `8 F5 F
- # b( w3 O" C7 Z; M# F4 U
- 属性位Lowbyte低四位为段类型,值=2
J8 b* h" P4 T - 表示为可读/写段" |% _8 M7 l6 |
- 属性位Hibyte高四位=9,bit3=1表示: U0 x* m6 e2 {! l" J- U
- 描述符对地址转换是有效的。, P% S" u* Q6 O h$ ]* e
- bit0=1表示为:: A- e9 `+ W& r
- 系统段描述符。而不是门描述符。
; q" @$ U! [4 W& d - # J: Z8 D9 w2 d& j# i
- */+ ?7 N8 j( e; t% x1 ?
- ( u0 J, v; I8 N8 h6 R2 g: Y! G
- /****************************************
" \* h7 ]2 A# i) E - * GDTR寄存器, 48bit=6bytes *4 v2 ?6 r' s# l6 V. Z- Y9 m
- * +-------------------------------+ *
. L# L4 o( o8 s4 D - * | 32bit基地址 |16bit界限| *- _5 u: R0 B8 e
- * +-------------------------------+ *2 F) C0 i* t( M5 d
- ****************************************/1 O" a4 j/ v6 o0 |9 c8 v2 P
- unsigned char GDT_Addr[6]={0};
) d2 K: ]# j' d - & H9 g& J3 ^+ K! h1 k
- /****************
, w( D& A& h. ~0 o" ? - * 打开A20门 *7 b- P6 r4 r4 N' j5 e4 {. H! C& @
- ****************/
% B4 [6 h& D7 Q) {6 }, ]8 d - void openA20(void)
6 G. t7 I' @; U' I/ U - {
9 k6 B: ^/ _1 r8 W - asm{
1 Z8 v+ J4 w4 B7 Z, M - pusha* w& h: C4 C1 O1 r1 B0 I) i1 z3 }
- in al, 92H+ |' {) F5 L% y+ \& x) Y: G
- or al, 0x020 G/ k ?, H( S/ X0 q. N
- out 0x92, al/ A1 U% a& B5 v, q, p: J
- out 0xed, al# B, c- Q# N3 D2 n4 }) r
- popa
8 T% S6 ?# Q) i- |3 s) c" g# T - }) |8 `0 x! W! Y( i7 G
- }
* \) }; h: |: M E: z+ m
% e# m, K i" V% K: b. \6 g- /***********************************************
0 B( c; d$ X' _: T! ~: n2 I( J - * 函数功能:进入DOS4G *
1 z0 |* E9 z% Z) h0 |3 E8 W - * ==================== *7 K0 `( e |$ \- ]; b
- * *7 F/ P8 E) \7 t; W* A% n* C. b/ X5 d/ m, i
- * GDT描述符界限计算方式:描述符个数*8-1 *
3 X% \' ]5 Q2 l( i - * 如: *
/ m6 s1 b: a9 T8 Q. V, a - * mov word ptr GDT_Addr[0], (2*8-1); * m) X8 }$ I+ D- [: f# M$ ? G
- * 表示为 2个GTD *5 @# k7 z( ?: K/ n4 z
- * *
3 X9 A4 J: m9 @3 j$ T - * 选择子为所在描述符内的字节偏移。 ** d! W/ d. M" z9 @3 v8 {9 ~
- * *
2 v, f E- D6 T: q" X2 M3 l - ***********************************************/( k H9 O0 f2 W! r, j7 P, x6 W
- void set4gb(void)
4 {+ D! X; m( q' L+ y9 m1 z6 ^ - {5 _5 z `1 H t! X/ d+ c$ X
- asm{
" i# s. E" ]9 h" H8 h7 j0 N; \ - cli
, S) P* l/ P" J7 Z - /****************************************! t/ J: a( J! a5 o6 X$ N9 {% f
- * GDTR寄存器 *
/ l4 {: q3 s! x - * +-------------------------------+ *
) U7 {/ p9 m+ d( j - * | 32bit基地址 |16bit界限| *
+ ~* p& l! z8 S/ P; Y" D1 W) b. i - * +-------------------------------+ *
( I' Q8 [( ?* k" q - *****************************************/
" h! m; C& s2 j ~' I: {" | - /*********************
) p9 ~" T t; [. ?$ K/ c: J1 G - * 得出段界限 *% A& \+ p( h) _) C8 b2 O
- *********************/' U+ N4 w( y7 ?& r# e
- mov word ptr GDT_Addr[0], (2*8-1);. G( T1 E' k% @" o8 u' o5 \
- /********************************************
5 W& i, p. M: X& i5 ^ - * 计算GDT表的32位基地址,存入GDTR *' O# T0 d% G2 L# X; l- O, g& k
- ********************************************/9 u9 C$ C1 u( L5 P
- mov eax, ds1 Q) `# v ?4 T/ x
- shl eax, 4
! q) |" o' m; I& R - xor ebx, ebx
7 r4 v U4 s% |. D - mov bx, offset GDT_def
: h. S7 {$ d' X- D" U3 Q$ d' S - add eax, ebx m+ {2 R4 ?0 Y1 A3 f
- mov dword ptr GDT_Addr[2], eax. b9 @3 t* i& X2 O
- lgdt fword ptr GDT_Addr# g+ u' C R9 K4 A, I0 N& C
- /********************/ R1 f0 ?3 v x
- * 选择子偏移 *
, r S7 e( P% o! ?3 c i - ********************/
3 c. Z; N0 K6 E4 F' I1 I2 N - mov bx, 86 t% e5 B; R1 |5 i1 I
- mov eax, cr0
; x3 p! X# h% |: B: t3 f - or al, 1
4 B# s/ A7 X) V% s# `2 W - /**********************" L. _# x! ~5 H+ l' R* q
- * 进入保护模式 *
# M) o1 u K0 I: o# J - **********************/' q9 P( P* F9 q8 S) `6 t2 C* m* X3 F
- mov cr0, eax. `+ E/ M. a- B% ~( c0 o- [
- jmp pMod, {) Z' T- q9 C& t
- }/ X' u- m$ S" C9 A3 D; _, b @
/ I4 |( {0 z; l* D% x- pMod: asm{/ N+ x5 m: a+ l: f
- /************************************************************8 c7 @; B% F1 A2 d
- * 让fs与gs加载选择子,使其能访问 0xFFFFF * 4K (4GB) 空间 *
0 \3 [9 C. s: M4 g7 W* F: Q - ************************************************************/
) J" N x# Q4 x7 L& j& V - mov fs, bx
6 D" L5 n; P- T/ i. G - mov gs, bx7 h, J) k. E- A5 ~: t8 {- U
- and al, 0x0FE
7 C, N, J7 _9 K; ^ - /******************% @0 D" P1 ^' g. X! H
- * 进入实模式 *$ D' I! j& r4 t
- ******************/
h+ e5 k2 [4 {6 ^7 X/ @ - mov cr0, eax
/ j- R7 T0 Q: C+ o9 Y* v - jmp rMod
( E$ i: q0 f1 Z/ \ - }7 S* s, g% P/ H7 ~
- 0 m4 }" P! e x
- rMod: asm{
! c& T, z5 d2 F- r1 G+ f/ x L3 \ - /* ******************************************************************% M4 a. U' U8 M- T1 q( c& E
- * 退出,fs、gs清0,访问系统内存可用: gs[32位,相对于0的偏移地址] *
- ~! |- t: |2 n9 h8 Z9 v; w+ k% f - ********************************************************************/
9 C! T) t7 a3 G: X - mov ax, 0
3 j1 L- N7 S0 a1 Z1 a1 T/ C- p - mov fs, ax) S1 O7 [* p/ Y& M5 u! c) g) O! p: g
- mov gs, ax
3 h) M& p- l3 \0 ? T - sti3 c d- E" H+ H5 H9 q" }$ P
- }5 o: K$ d J+ t u
- }
复制代码 这是asm的- ;/********************************************************************! t0 P3 ^7 v. p$ g$ {8 I$ r2 D
- ;* File: DOS4G.asm *1 a( _2 H9 K( V2 F1 c6 p
- ;* Compile with masm ( Editor: Tab size = 4 ) *; Z* ?5 z/ q0 w% B
- ;* *
$ M+ s0 W$ s, _" j& U% w - ;* ========================Title=============================== *
& B! e+ F# t) a) f5 O! d+ K - ;* 这个demo是让系统进入DOS 4G模式,进行数据访问 * f+ g: C2 S& U
- ;* *
; D. h8 J/ d0 m% T; q& c - ;* ===========================History========================== *
8 G! ^6 H! P8 t8 k: w* Y' k - ;* author: bini *
# o- ]4 B; C- E7 v, ]2 U - ;* date: 2008-10-08 Frist version. *
3 F. n; u( {, m9 { - ;********************************************************************/ 0 C7 c* C! {2 p7 {1 Y
- .model small# ? X, }% G" L4 Q' b
- .586p
$ t! Y% v! h8 C9 _ -
. P: M/ u2 ]8 ^7 m% h - DSEG SEGMENT USE16 ;16位数据段
8 h3 W$ A8 F; j' I9 W( R% H - 5 L; g7 \( g/ P' Z. v8 J) _
- DESC STRUC
! T% i6 b6 C3 M. K2 Z0 k - LimitL DW 0 ;段界限(BIT0-15)
: i) u, d/ N% V - BaseL DW 0 ;段基地址(BIT0-15)
9 E4 D) }& K8 B, i' k, r& [" D* N - BaseM DB 0 ;段基地址(BIT16-23)
$ m; P% a5 t! V. ]$ Y - Attributes DB 0 ;段属性5 o8 M0 F2 f3 \! z) n0 z2 M& P# R
- LimitH DB 0 ;段界限(BIT16-19)(含段属性的高4位)
3 g+ b5 j. U% L2 M! z; l - BaseH DB 0 ;段基地址(BIT24-31)
' u5 e$ y, d, h' w3 p0 K) M+ M8 a - DESC ENDS
' Q3 F" J! \- f - ! N+ q$ f: W: V9 Z+ V* b, ~
- PDesc STRUC& k3 F# e0 t' `1 w
- Limit DW 0 ;16位界限
5 m4 [+ m G( I- f- u# B0 f. K - Base DD 0 ;32位基地址1 t5 d3 u: m, b1 Q3 U. ?+ g
- PDesc ENDS/ S7 @% h. y4 C* z# N
- * K- S+ ~6 \* p3 @: S
- GDT_def Label Fword
( z" l1 D0 v1 R) X5 M. ^ - Null_Desc DESC < 0h, 0h, 00h, 00h, 000h, 0>* |1 F) y6 R: a+ O* a: V
- Data_Desc DESC < 0FFFFh, 0h, 00h, 92h, 08Fh, 0>& C( e5 A" Y. b0 @' c
* @& J3 u7 C" x6 X c5 e; [- GDT_Addr PDesc <$-GDT_def-1, > A+ @9 n! _+ {* E. I
- DSEG ENDS ;数据段定义结束
3 P1 [) |) l" C; G B
9 {3 S( {% K/ r) j+ f- CSEG SEGMENT USE16 ;16位代码段
+ L8 s$ X: s& a" l) @* p2 ` - ASSUME CS:CSEG,DS:DSEG
@( [/ `$ a# T+ L7 M - .Startup
$ H, s7 c; H! u5 s: ] - call Set4gb- d3 m$ r$ e: P: O/ j
- ;
f0 I3 N* ?/ n d& f - ; fs, gs即能访问4GB空间
5 r; A; P$ u4 E5 O* l# @ - ; write your code in here.7 P8 @: y# C1 v( g: g
- ;
* G, k8 M6 n5 L - .exit
) I. c, _: K/ z - + ^: q% r8 d/ E: H; Y
- Set4gb PROC NEAR d9 o+ W/ d* E4 r& p# A' C' s: {
- in al, 92h( v0 r) x. B# T
- or al, 002
4 e: R4 d# u+ h' f+ i - out 092h, al
' C, i, K# h- s7 K6 U - out 0edh, al9 L8 Y* a: N& ~8 {
/ ^1 j6 r+ \" ?0 D4 X5 L- cli
" {) H P5 }7 a/ w
3 P) D; i7 g# c8 D4 ]- ; mov word ptr GDT_Addr, (2*8-1);. W6 ~, v9 Z8 t- ~/ h/ p
- % n" l/ S; x" I2 ]
- mov eax, ds
1 @* }4 b, ^( d. p- \, I - shl eax, 4! Q9 N! H* { i$ @. U
- xor ebx, ebx4 p2 E# B& W; P' _5 u! _+ ~
- mov bx, offset GDT_def
2 K+ V- Q# S! i* t - add eax, ebx# T) z/ r# ~9 T, M% N
- mov dword ptr GDT_Addr.Base, eax
2 V* c/ O" Q) i1 S - lgdt fword ptr GDT_Addr
' {& z( ]4 W+ T# h1 Y9 L9 I
" M- `# T' C8 ~, p0 b- mov bx, 8* J; e5 | ]* F3 q% `2 [
- mov eax, cr0
; h+ o0 S' ?* O5 k2 s4 I& y2 F0 p! j - or al, 1
& g* s. S- j1 J6 Y - mov cr0, eax
) t( K" t4 }% l$ y
# S, o: @9 E! O/ s7 U' B) \* l O- jmp pMod
* P6 u# l! Q9 s; ` - pMod:5 p4 m6 T. v% T; H; r
5 V8 K4 Q* K# s& s5 g+ `- mov fs, bx3 L L& t5 X3 T* E. ~1 q" Z
- mov gs, bx
1 ]1 }. R/ ^ u+ X! y - and al, 0FEh
6 J3 c2 R6 a6 n3 d$ L - mov cr0, eax/ [$ _% j1 s& z- I D7 ]# B; P
-
9 i5 P, W6 k4 q8 J: v+ e; W) z7 M } - jmp rMod
1 R5 m8 y R6 T6 q/ n7 g1 f - rMod:
4 ?( K& E! G: p: b2 o - " f2 _& K$ O7 D6 }* ~# M
- mov ax, 0
8 s2 z: ]3 P. z - mov fs, ax
) D4 ~0 Y; y) n5 l# @ - mov gs, ax
% L% O/ M0 z, m0 B -
: a8 T; `0 A) L- ]; A - ; 在2M的位置测试写一下数据4 B, d3 |8 l5 p b8 S/ s3 o/ }2 W
- mov esi, 200000h
; y3 {- ], E- J6 ~* h+ A- ] - mov dword ptr fs:[esi], 055aa55aah
' D1 C4 |; H* `- d: B - ; 用RU去看看200000h的位置是否是此数据....
( F6 e0 m. }6 s) F0 K
) B: [6 E- g- {! x7 \5 H- sti
2 [; o* F2 D6 `5 C8 N, V - ret
# {2 c% T) j1 c2 V5 |( a3 D - Set4gb ENDP6 G& t0 X g4 Q. _( n
-
& E! `9 u. a4 s8 {+ P - CSEG ENDS ;代码段定义结束5 J2 Z) T- I+ L1 @9 a' n- v8 [
- end
复制代码 |
|