|
|
刚学习的同学,有些还不会,我这里贴点C和asm的代码。只供参考。
$ J) M" j: S3 g3 A+ ^% v, G+ M# ]9 B; w4 a w3 j
这是C的- /********************************************************************
1 J6 o/ i; q: V. C$ h - * File: DOS4G.H *& T+ k8 S6 ]* x7 ?' A6 E( l& Z3 _* G" @
- * Compile with BC 3.1 ( Editor: Tab size = 4 ) *- H! u. t& w( c, C
- * *% z& K' S$ f! V0 G" [
- * ========================Title=============================== *
8 v* l* ^( k. ^6 @ - * 这个函数是让系统进入DOS 4G模式 *
8 r E7 `6 J8 V6 j; d# Z- H - * 程序参考了:陈家琪《DOS实方式下直接访问4GB》 *) v, k& h- o# ? t. q- p
- * *
# o. U, w V! g H - * 使用: openA20(); set4gb(); *6 i: |& a4 p4 x% H0 V0 B
- * *$ a; y. c( c2 ?, l8 q" y3 j
- * ===========================History========================== *' k' h% A( f0 I
- * author: bini *: k- {+ \2 j) z& H. x5 z6 J
- * date: 2004-11-30 Frist version. *, r0 A5 A# o& n z# J8 U
- ********************************************************************/
0 G" N, f% n1 C4 ]# z+ b
% K4 M+ C9 X6 Z# k1 U2 y9 Q- #include <conio.h>0 t6 w$ l; I( @/ v3 @( m
- #pragma inline
! K; a) F( ]. ]4 p! N - 9 i( O$ Z& z- @' v$ ]9 T
- /***********************************************
1 j. z1 B! x1 z; @ - * 两个GDT,第一个为系统使用,不管,默认为0 *
& ?1 L9 e Y6 q1 P0 l. `" ~* o2 | - * 第二个为一个数据段,没有代码段。 *
n6 a* ]/ ^! O( m% b - ***********************************************/4 A& F6 G+ E7 `3 Y
- unsigned long GDT_def[ ]={0,0, /*系统使用*/. k4 A7 M/ P2 P) M4 Y, k( E
- 0x0000FFFF, /* hi16bit( 0~15 ) is base low=0,
! y ]7 J. K8 b9 v: H - low16bit( 0~15 ) is limit low=0xFFFF + @. I5 m" \" S. D- w/ [, P
- */! L5 h5 U8 U: P! {- E
- 0x008F9200};/* 最低字节为 base( bit 16~23 )
+ u& I8 j. C" E& ~3 s3 K - 最高字节为 base( bit 24~31 ); n9 N/ I7 |$ F
- ) H" e: z$ i& t" @5 p) J
- 属性Attrib = 0x8F92
5 m& p H: Z4 B. K# i' p# y -
2 _2 h2 `# _; i - 属性位Hibyte低四位为
0 Y2 z' ?; X4 ]0 z# f - Limit( 16~19 )=F3 T8 w3 T# s" n# G6 J
- 属性位Hibyte bit7 为粒度: o2 Z% ` p2 n! [6 ~% @ ?5 d
- (值1=4KB粒度)' e0 S! X$ d6 m9 }/ ]7 d
- 8F & 0x80 = 1
2 M M- w n% m e* L2 F0 S -
" Q) W1 V1 w* V, ?8 Q7 M - 属性位Lowbyte低四位为段类型,值=2& ^: A @; E, p9 N
- 表示为可读/写段 D; w) A/ P5 b$ S
- 属性位Hibyte高四位=9,bit3=1表示:& f8 a# Q$ w9 z
- 描述符对地址转换是有效的。5 x1 u0 |6 N7 n1 N i* }
- bit0=1表示为:0 o7 V. M3 g1 z/ X4 l
- 系统段描述符。而不是门描述符。
Y& ]$ R5 R1 V3 c -
% N9 M; ?' W H' L, C0 f - */& a( J; }8 b- k3 k& [) u
- 3 F- [# z/ V' J# T& r4 h
- /****************************************# m2 Q5 r, \8 {- _1 q- _
- * GDTR寄存器, 48bit=6bytes *
& J" r* E9 R# c" \( J; p3 P% S; L - * +-------------------------------+ *: b6 O- Y, f4 O5 M
- * | 32bit基地址 |16bit界限| *: Q: o" f# {- E
- * +-------------------------------+ *
' W& ?8 z F1 ^( y/ T - ****************************************/, R/ O) |7 j: m
- unsigned char GDT_Addr[6]={0};( a; K0 {: h$ R0 R: C
! n5 \2 O, Z% z; q- /****************
6 N: `3 s9 D% h3 m, r! K( m8 | - * 打开A20门 *
+ u, H5 l$ }9 x - ****************/8 N; S7 L+ h5 Y9 T4 i
- void openA20(void)
$ l9 }% q* }* `3 | W1 Z - {
0 Z, M6 @ n: _. t) M9 X - asm{
: @# w- f* w! E9 Z! n1 v - pusha, q( k3 J+ p4 l9 u
- in al, 92H
# p; J; b+ s1 m' L- ]* Z3 M - or al, 0x024 l) V* z, o2 n2 x2 D Z
- out 0x92, al
9 t- E1 l+ z7 j9 u$ Q/ q/ }( r+ I - out 0xed, al+ |# o2 |! S( e2 `. U
- popa
# g6 N- {/ E5 b4 M4 S - }
( t5 g1 E8 O5 h% A! } `( O - }
- Y+ G' Y$ ^1 y, j/ ^: s9 W7 j1 P
( p4 V& A f4 W7 C! f! z, |2 D- v0 t- /***********************************************
3 D/ n# c( D' y, i$ |& _) K% {+ O1 [ - * 函数功能:进入DOS4G *. [7 ?. U& B' E! q( w
- * ==================== *3 J+ l( K" r) a, z2 c h5 T9 M8 F2 ~% i; K
- * *1 D! L' X, E+ [5 L
- * GDT描述符界限计算方式:描述符个数*8-1 *+ j1 Q& N P4 @1 ^' f
- * 如: *
% d9 r3 x2 m/ D! _ - * mov word ptr GDT_Addr[0], (2*8-1); ** x0 H1 f) A0 P' S# f l
- * 表示为 2个GTD *, c8 P9 B/ U( o- ]& V% x
- * *4 y4 ~* z+ M- w& ?
- * 选择子为所在描述符内的字节偏移。 *
: g- a$ d8 ^/ t& ^. C$ ]" F - * *6 K1 ~; {3 B0 u) v9 `1 Y
- ***********************************************/
: X8 z4 D" X$ N3 b/ [ - void set4gb(void)
: Z7 _2 N4 ~/ x/ o2 @3 J5 l - {& f8 s6 f! w' B' r
- asm{
% I# t# a$ L& y( ?+ `/ X0 U7 T - cli
9 O$ Z% H5 O( U+ w - /***************************************** L- }5 U: K; _$ n* g- a |. G0 T
- * GDTR寄存器 *1 q; A# G2 { o' x9 U
- * +-------------------------------+ *2 V4 W" _4 ^; I2 h2 w
- * | 32bit基地址 |16bit界限| *
# Q x U ?: k1 R4 ?/ n" B3 K1 s - * +-------------------------------+ *
2 i E4 H* Z# t7 n; y$ C - *****************************************/$ ~0 x0 t, @. r$ V2 C5 H# |8 F/ Z
- /*********************
& P+ F/ y( `: Q6 \* w& |- l- E R - * 得出段界限 *% W. Q/ J! ]/ v: O
- *********************/
% Y" m: A6 V% d - mov word ptr GDT_Addr[0], (2*8-1);& Y; w' V' L# N4 F
- /********************************************
8 s, x) A4 t: v2 A" a0 q- k: W - * 计算GDT表的32位基地址,存入GDTR *0 k8 q) w- n! B: m0 ^
- ********************************************/" _8 f3 \( I( o3 R
- mov eax, ds) J+ T8 m8 t; R
- shl eax, 4
2 f9 D4 G: `9 B; b" k- i" W/ v4 J, V - xor ebx, ebx) _+ b6 i2 Q+ p- \! P
- mov bx, offset GDT_def
, L/ i+ M9 N, \, e Z* t; M - add eax, ebx% D+ N& X! S# u( ~5 M+ E1 B
- mov dword ptr GDT_Addr[2], eax9 I- Q1 F7 ?7 _2 r
- lgdt fword ptr GDT_Addr
( m! c. e; T; h( h - /********************3 B$ v% U# H& w7 n y
- * 选择子偏移 *. U8 k) B1 c2 x/ V: \5 z
- ********************/5 }" u1 W9 \, Y2 H1 ?& Z. H
- mov bx, 8
0 n" D b3 T! O# F2 D - mov eax, cr0& w1 P, G- x, ?
- or al, 1
& {# q8 [6 S( P9 t5 `/ y' _+ K: I - /**********************
1 n# o' T6 ^; ]+ n - * 进入保护模式 *
1 w3 u! k1 F. H7 [# q( ?# n - **********************/4 G0 R' Y! f: p, W/ o& |
- mov cr0, eax
+ Z1 k& p b9 ?& p& B# { - jmp pMod
. w# I* B, N/ o( h& T9 @* a - }) }! \# d2 V5 Y* Q
& A% M4 [4 m: S3 x/ w% H' n- pMod: asm{
8 D$ {3 w+ a8 W. z! { - /************************************************************
1 H' u4 Z9 Q0 n& Q - * 让fs与gs加载选择子,使其能访问 0xFFFFF * 4K (4GB) 空间 *6 g% w/ l6 ~/ o
- ************************************************************/
; T, T* ]5 g+ v# \+ f' i4 z - mov fs, bx% i- D( {' w5 s2 F
- mov gs, bx
2 g- s7 ], u% x. A7 |1 t - and al, 0x0FE7 s/ w. S, x4 B3 n
- /******************
8 M4 p3 y1 ^: L/ i - * 进入实模式 *
, q( R6 T7 j3 V - ******************/
" y% F a, v3 b+ d2 N! Y9 e" z! y - mov cr0, eax/ I- Q2 k" ]& T( m2 X
- jmp rMod
! }- }$ _' a ~- S& k4 Q6 | - }
& x1 R- |. z# d# x; I) g0 V( f - " z5 b! Z0 U V6 D
- rMod: asm{ \ _8 E9 H+ u( I9 P+ \
- /* ******************************************************************3 f4 v( B6 B* J" k
- * 退出,fs、gs清0,访问系统内存可用: gs[32位,相对于0的偏移地址] ** q, h" h! \# I/ ^+ e5 d
- ********************************************************************/
$ y9 F& \& `1 ?- h9 u) Z: e - mov ax, 0
' L& G8 e! W, R3 D% r* N0 o: l - mov fs, ax
6 U/ Y1 h, D1 O7 d% S6 N - mov gs, ax% {: v. s! t2 b3 O1 x& W
- sti
% r% U0 x x% [ s6 m2 h* ? - }
* s7 ^) {. @6 Y, u- W* p9 q/ {" S - }
复制代码 这是asm的- ;/********************************************************************) O. ^5 Z1 M9 v9 H9 }$ b5 B' p
- ;* File: DOS4G.asm */ r! {: d, N" r( R: u
- ;* Compile with masm ( Editor: Tab size = 4 ) *# c& n( l1 l+ [7 V2 o& ?( x% k
- ;* *
]& z# K n' q: B1 v5 { - ;* ========================Title=============================== *6 m* o% u$ J1 X
- ;* 这个demo是让系统进入DOS 4G模式,进行数据访问 *# A3 T, V$ k, @0 L" a W
- ;* *
2 S. j" d7 J* y4 F) a! C% F - ;* ===========================History========================== *' l5 P- `3 H# I$ L
- ;* author: bini *, i8 _7 d4 H2 j" X. s0 H; f: w, S
- ;* date: 2008-10-08 Frist version. *; |; ^! l/ @' M, @6 w
- ;********************************************************************/
+ C& v8 u+ Q+ Y* n7 y4 h - .model small
, {5 C2 n4 H& ~: v" B% ]+ e - .586p
/ u/ N* Y. K9 G5 R- R7 D0 ^" Z - # }' Z/ u, ?6 r0 d& m
- DSEG SEGMENT USE16 ;16位数据段: T1 _$ x( L5 x5 ^5 k
- Z+ L* p8 u4 K0 d. \9 C* |' S
- DESC STRUC. \' ]8 }$ y8 |8 O' O$ F
- LimitL DW 0 ;段界限(BIT0-15)) L) {2 K) D" s7 z6 v5 V, p8 L& N
- BaseL DW 0 ;段基地址(BIT0-15)
1 n7 Q- A- v" r$ \1 Z - BaseM DB 0 ;段基地址(BIT16-23)( P3 I) T6 A" v( X+ B5 I& i3 n5 ]; W
- Attributes DB 0 ;段属性$ A! G; k3 ~! L
- LimitH DB 0 ;段界限(BIT16-19)(含段属性的高4位). [4 X: b7 P; b; y' l5 F4 l
- BaseH DB 0 ;段基地址(BIT24-31)# b: v. _# g6 \ l$ f1 H1 v7 a; K
- DESC ENDS
" s! B( \7 E% l% p. [ - / O, Y# R4 N, [- z$ `5 ` W6 y" y
- PDesc STRUC8 c0 s$ l: m- L- v1 u3 I
- Limit DW 0 ;16位界限
3 w6 f8 R, k4 S2 ? - Base DD 0 ;32位基地址
+ w% U+ {0 _% x c. K - PDesc ENDS# d% I% S3 Y4 B# ~6 G: C7 ~
2 B' w( X( O; L5 g' H" [- GDT_def Label Fword0 U* y- I! D |$ x
- Null_Desc DESC < 0h, 0h, 00h, 00h, 000h, 0>7 W9 K( B5 t1 O' R) d7 z' A, Z
- Data_Desc DESC < 0FFFFh, 0h, 00h, 92h, 08Fh, 0>8 m& q6 m) Z; _2 D
- 2 \, m5 ^7 L: h v9 S! z9 m/ M
- GDT_Addr PDesc <$-GDT_def-1, >! L& m5 s8 o) @
- DSEG ENDS ;数据段定义结束
6 o& u7 e! g) `1 K" h" p4 s - & d% j2 O& {) p/ L+ y$ }
- CSEG SEGMENT USE16 ;16位代码段
* W& T. P( J: I) k: ]4 U8 E. o! u - ASSUME CS:CSEG,DS:DSEG+ s8 [& W3 ^9 f7 E$ c, x
- .Startup
* i: s6 }6 w" F. O- L - call Set4gb
$ U+ H% Z! _1 l: j% O - ;
2 [0 L: \2 i. M1 V9 Z - ; fs, gs即能访问4GB空间
/ i$ u! v1 c2 n - ; write your code in here.- y \8 Y6 Q( x9 M7 d: F
- ;
2 Z- n5 h4 W! F& B4 O s - .exit
7 {9 e$ y# X& \6 u M2 h) J7 B - 2 s) F7 X- B* O D T& o1 I' j
- Set4gb PROC NEAR; l/ N8 c# R% W! p4 T0 f
- in al, 92h
. g5 ]* \" |0 \7 ~3 D! r7 G6 G - or al, 002
+ y- d4 d1 E. `! b. o* L - out 092h, al; R8 z( c) p$ A1 q$ C* s+ K' x0 `
- out 0edh, al
2 \2 v! _7 v8 \ M# a - $ ]( G, N6 L7 o7 `0 z* q
- cli
9 i$ @; v1 F& {/ x2 y& ]$ u! f
6 c, n' E, ]7 o5 L0 B( x6 P- ; mov word ptr GDT_Addr, (2*8-1);7 F) C* l" O/ A0 x
4 S' R( o. p* a9 ^- a( k- mov eax, ds7 |6 ~' L# F5 v' V- b+ {* W, X. `! t
- shl eax, 4% K3 z5 _( H2 c. f
- xor ebx, ebx
5 i, R* a) ?% J2 Z - mov bx, offset GDT_def: W* m+ @3 W! u. i5 `
- add eax, ebx
: R# v. }; S" R6 ]( F6 z - mov dword ptr GDT_Addr.Base, eax. j+ Q1 {% l+ m1 _6 v) @
- lgdt fword ptr GDT_Addr
! c; [# s) y! k2 s9 B* A( N
$ Q1 R* z8 S/ p& j- mov bx, 88 k/ Q: m# E0 I" b! k& E$ _' n5 l
- mov eax, cr0
$ F6 W* z6 O6 L, W. _9 b! e( W. u - or al, 13 r- C' b6 J5 y; _9 Z1 v
- mov cr0, eax2 O* |+ x4 B( s( j/ \) L! L
- # h; Z8 Y4 b9 E. G
- jmp pMod
5 W/ d+ f) U% m0 q9 t/ F4 _$ G! y - pMod:
- U6 f3 ~) n6 r) ^) L - 2 {, `) r' C L$ `4 h
- mov fs, bx$ M; J' P7 s6 c( P m% ?' p
- mov gs, bx8 A# A) r! k+ s6 _1 B1 t
- and al, 0FEh2 @9 v1 ^1 g8 t% M" c
- mov cr0, eax
* g' [7 R4 r% [. Q6 C0 t% L7 b* B - $ \6 R4 s4 e! g1 v) x! h( u6 x0 O
- jmp rMod9 G A2 @4 g1 u( h& ~" I+ w8 A
- rMod:$ |% g2 |1 }% l( o
8 O( z" s; T( t; \- mov ax, 0
% o6 a$ ^( n) g6 J - mov fs, ax
2 H z+ {3 I: K - mov gs, ax1 b% W$ U' @# F5 ]
- " A ?* k9 l7 o P( K* }1 T1 c
- ; 在2M的位置测试写一下数据8 g2 ^0 n! h( w' ~; ^+ M9 H
- mov esi, 200000h& a, t) |: A9 V
- mov dword ptr fs:[esi], 055aa55aah# H% D: m/ }- P& t9 U2 e, P* B% F
- ; 用RU去看看200000h的位置是否是此数据....% l% |1 a1 h w
3 |8 ~) w8 r8 D7 L+ I- sti
' ~6 X3 b8 a2 s+ r8 V - ret, I6 {4 I2 C7 v& A
- Set4gb ENDP
$ x' I5 B- {' j/ u, x6 ` -
) C" T+ i" j4 ] - CSEG ENDS ;代码段定义结束1 h" K) L6 Z) Z$ K, H% [. R
- end
复制代码 |
|