|
|
刚学习的同学,有些还不会,我这里贴点C和asm的代码。只供参考。
$ n1 F" g# ?9 q1 k+ p
( o5 |, p6 W" P这是C的- /********************************************************************" ]6 T: n( ]' L% `# f) t$ P" g
- * File: DOS4G.H *
a6 v' ?7 ]: N/ y) j. G - * Compile with BC 3.1 ( Editor: Tab size = 4 ) ** [! Y9 q) p6 N8 E
- * *
8 a' g* k& e/ T - * ========================Title=============================== *9 v3 u4 b9 E# c% n1 q8 Z7 u2 _
- * 这个函数是让系统进入DOS 4G模式 *
' X" C% V- K1 k% ?0 h0 W) t3 v - * 程序参考了:陈家琪《DOS实方式下直接访问4GB》 *
8 N3 ^( B/ x9 `/ d - * *: Y6 w8 |+ D8 B7 i2 N/ x3 t
- * 使用: openA20(); set4gb(); *
( F& I: T9 K1 a ?* [) | - * *
7 w% }" o+ p7 g. _- L8 q/ q6 v- {! B - * ===========================History========================== *
0 Y9 w7 E, Y* `3 C - * author: bini *" O* R" s% L6 b" w+ j4 V5 m% a
- * date: 2004-11-30 Frist version. *
w; q* @4 e7 W( ^+ _7 P4 q; y1 V- I. X1 Q - ********************************************************************/
* j( v' p' w/ v2 t
9 u9 f- w; P7 U- #include <conio.h>
* O; I' e% i) R" o$ H; l - #pragma inline
: |3 i: H, x# M) d5 U% u - 2 Z% \! O" J; U2 e0 i
- /***********************************************& @: e* ~3 t% \- l" m7 J
- * 两个GDT,第一个为系统使用,不管,默认为0 *2 b+ i. y! t$ C1 o
- * 第二个为一个数据段,没有代码段。 *6 p: u: M7 C& ]
- ***********************************************/; s: m2 Q4 Q5 R: L
- unsigned long GDT_def[ ]={0,0, /*系统使用*/9 N3 x" a {4 }( r! t# I. w0 h
- 0x0000FFFF, /* hi16bit( 0~15 ) is base low=0,
- U' s6 Y: U1 g0 y/ k; p; @) i - low16bit( 0~15 ) is limit low=0xFFFF
0 M8 E& _7 p) f1 B: w+ t l - */
G" l& p. l; t( u1 D. d! c w" w - 0x008F9200};/* 最低字节为 base( bit 16~23 ); I$ C; C3 Z0 G- l u* C! ^4 n @
- 最高字节为 base( bit 24~31 )- v% Y+ w: V+ u+ ~/ Q2 w H b
-
9 b; E- T% o; C/ L4 L/ o - 属性Attrib = 0x8F92
: g# w+ P9 L* [$ _ -
! e9 Y& B5 _4 P5 D$ d$ a$ P' [2 P8 R - 属性位Hibyte低四位为
; g0 }0 y' S( v- ^1 ~+ |8 p+ |# U - Limit( 16~19 )=F, @9 C- }5 y* @' H0 p: Y0 R
- 属性位Hibyte bit7 为粒度9 a7 z/ p, z& N- d
- (值1=4KB粒度)/ \% ^2 M2 Y6 x" v) A
- 8F & 0x80 = 1
" O" t+ A1 O N, k1 }2 b# s/ ^ -
, \ S9 u# h! h6 G# b2 x - 属性位Lowbyte低四位为段类型,值=2
; l( [9 N1 e5 ]( v- D - 表示为可读/写段
D! |) b. @6 o: ^. B - 属性位Hibyte高四位=9,bit3=1表示:
4 `/ q2 ` M; N9 u+ i( ~( ~# D7 v - 描述符对地址转换是有效的。* g9 m! c ^5 {$ V- }+ i! _
- bit0=1表示为:( \0 W$ k# s8 p+ h/ {7 |
- 系统段描述符。而不是门描述符。
5 S: e8 A" M% B1 M - . W4 Z2 P0 G- Q. t/ n1 m7 k
- */
1 j* u0 u2 `$ g4 @5 N1 c - . S* s0 |+ K4 B* r& t
- /****************************************
6 \+ T4 M! y0 K/ D, c9 J - * GDTR寄存器, 48bit=6bytes *
$ v/ k: A+ s; a' K& R. }7 U - * +-------------------------------+ *: p/ n# i e$ q+ w* [
- * | 32bit基地址 |16bit界限| *
6 ^, U/ g# d# Q# r - * +-------------------------------+ *" ~' W) ^4 m6 T0 h1 ~% ~" R
- ****************************************/4 w' Y0 H# R/ V2 t" Y6 j& @
- unsigned char GDT_Addr[6]={0};' X1 ]5 h5 c% e% W0 s9 }/ d
- / g0 t. W' F* t. Y' x6 j$ E) ~
- /****************7 @3 D" S$ l0 ]0 w3 X1 ?, k/ f
- * 打开A20门 * c% C% J- g- X/ ]* n4 T0 Z
- ****************/8 ?- ^, |1 g1 o2 D& `) @! D
- void openA20(void)0 @, d z8 U/ O% T
- {
- Y5 T- V6 N; t" s - asm{
* n. g4 O5 U/ I - pusha a3 d) x- D; Z
- in al, 92H' V9 u4 M' e$ H4 U, e6 Z
- or al, 0x022 Z% z+ ?2 K; d' P# ^5 n8 {
- out 0x92, al
* i& F& A# p4 @; t+ d$ \2 ~ - out 0xed, al; p7 X$ l- ~- Q6 C1 N( r* j3 j
- popa
% z2 _4 K% _& K9 n1 O# z9 g" y k% H# j - }
8 ^) v I. n0 Z, } - }5 {7 z: |7 i3 L! }6 I
- ( f$ C5 W, Q9 K9 ^
- /***********************************************
* ]* w, x D, l' ?7 T; V$ N' K; S - * 函数功能:进入DOS4G *
4 y; B) `. f: ~9 a$ ^/ f, I - * ==================== *( G1 C. w5 v6 A, R
- * *
5 u2 l4 e# P: r m& t - * GDT描述符界限计算方式:描述符个数*8-1 *+ @! O& y# ?) G6 o1 r$ k) |# f
- * 如: *
7 h2 Z; p/ V" l5 X+ J - * mov word ptr GDT_Addr[0], (2*8-1); *
- v! O/ Y5 x) C: r4 g" M$ p - * 表示为 2个GTD *4 _, I4 f$ t: Z* d. s* p
- * *: ?- C/ c z# k1 }1 X
- * 选择子为所在描述符内的字节偏移。 *
) i8 x1 r6 m& B) v( E - * *
! w; R$ W; k* P% [) V - ***********************************************/0 g$ y, U/ u- T3 C: v5 g
- void set4gb(void)% d0 `' L+ f9 P3 A9 X) h
- {! d+ y U3 S8 g" A8 L* M8 |
- asm{
1 N) d0 B5 T( [ C* p5 Y1 |+ ~& A+ e - cli, Z% I+ L% W5 A3 r
- /****************************************
% s1 s+ K5 Z+ L - * GDTR寄存器 *
3 [. G. E% s: K& j Z5 O2 p. c - * +-------------------------------+ *9 \8 Q) I3 l! j; J; v0 W* }/ s
- * | 32bit基地址 |16bit界限| *' B W) v( {; h" ?; a$ X
- * +-------------------------------+ *+ z5 K1 _% @1 U5 j- k. k
- *****************************************/
) c5 H, J! O( J/ |, W) ?! l - /*********************5 X2 r0 O9 g8 o9 n8 H+ ?' g
- * 得出段界限 *
2 F! q4 i8 h1 \4 A0 M0 i+ Q - *********************/$ L9 m" Q8 ]4 S6 b( l
- mov word ptr GDT_Addr[0], (2*8-1);
3 ~+ e* {3 b0 L: [ ]$ [; x1 N t - /********************************************2 x. {- m6 i' @1 h9 B
- * 计算GDT表的32位基地址,存入GDTR *9 t7 D2 t* b1 `& e h& I
- ********************************************/
( ]' U5 z8 Y) X( f b0 t/ ^ - mov eax, ds
- ?. w( C6 ]# L - shl eax, 4# q5 m: e/ b6 t! m7 s
- xor ebx, ebx
) `% b) Y$ Q! K0 S* ]7 |: h o - mov bx, offset GDT_def
G5 p$ ?+ g6 F. H( Y9 _' a7 W - add eax, ebx
- M2 v+ v. q; R# ?; |. `$ Y - mov dword ptr GDT_Addr[2], eax
1 m3 @% p' }- Y- X - lgdt fword ptr GDT_Addr
# e, c& {$ P( _8 v* ~) W - /********************
4 c4 c& Y; g$ S9 A/ u1 Z; u9 y - * 选择子偏移 *
5 i# R* K1 ?/ |9 S+ U @ - ********************/
/ B( [+ G5 m2 P/ L. v& q D' l( } - mov bx, 8
0 z. q s0 {9 h$ Y8 f - mov eax, cr0 U' r; b, C+ r, a
- or al, 10 q+ q0 E* s, D9 y" f4 F
- /**********************
& h) |$ i% x; I - * 进入保护模式 *
) G; w3 k1 ~3 u0 K" D - **********************/
: L( M! J0 w J" {* D% C& } - mov cr0, eax! w& R8 e1 v1 v( L5 M% Q$ }
- jmp pMod) p7 D* _' s0 s
- }
; l; Q0 u* n- U - & z( l( ^) l# G7 l
- pMod: asm{
5 ?* h5 j' I! \ - /************************************************************. E( P3 F, c6 M
- * 让fs与gs加载选择子,使其能访问 0xFFFFF * 4K (4GB) 空间 *
+ x' ^% U+ X/ d/ X7 X7 W - ************************************************************/; a. \ S2 s. P7 D$ u
- mov fs, bx
9 }* h6 Z0 {) L& ?4 v) V: D - mov gs, bx
2 @4 B* {9 n" D* q; Y - and al, 0x0FE
# K2 G5 w0 v c - /******************: H$ x* c1 V* t# _+ @, X& f
- * 进入实模式 *
? q, V" ~$ F) Y - ******************/- u3 f! Z/ N" M w
- mov cr0, eax
9 x. v: D2 H2 T' A W - jmp rMod9 ^7 t% u# I R8 n; C. r: }9 x& ?
- }+ r4 U3 x3 x$ [9 X+ f6 `' f
' [% w5 d5 `- |) F- rMod: asm{, N% N0 ^5 r0 a5 s- A; J7 k1 ^
- /* ******************************************************************
, `" q% K, R: `2 o- p. k - * 退出,fs、gs清0,访问系统内存可用: gs[32位,相对于0的偏移地址] *$ F- h% H/ G: g9 H7 f6 X
- ********************************************************************/) y Q% O" t. r9 ~* M
- mov ax, 0# H K) k( W+ \9 x" y( t
- mov fs, ax
. {; X( R; Q$ S+ y - mov gs, ax# w1 w! L7 l ~; D" v1 w( c
- sti
1 ~5 G" \1 F2 F6 `/ q4 N - }. Y2 R9 j6 {- v+ N
- }
复制代码 这是asm的- ;/********************************************************************" s, Y; g! ^% f$ F
- ;* File: DOS4G.asm *
/ f- m& p* ~& z r. ~1 `# j1 Z - ;* Compile with masm ( Editor: Tab size = 4 ) *
6 Y' A. l- M' R9 j G5 { - ;* *
. p( \/ M# o% g! U$ Y6 N" @ - ;* ========================Title=============================== *
% i% y( j: i+ x/ O9 n - ;* 这个demo是让系统进入DOS 4G模式,进行数据访问 *2 h8 b) s8 u. _% Y
- ;* *1 p/ A# h/ g5 f7 w, ~. V4 l
- ;* ===========================History========================== *+ B$ ]' l- S0 A
- ;* author: bini *; ~/ ], K( ^+ J9 Y! A
- ;* date: 2008-10-08 Frist version. *" q2 @8 k1 `* Z0 {* y
- ;********************************************************************/ Y6 [( d# p L/ W1 o' b. [
- .model small# @( P6 D: B# \( X0 E
- .586p
& \$ O/ F. k9 o8 z: | - 0 p5 `+ e: k) y4 k4 p- B3 T
- DSEG SEGMENT USE16 ;16位数据段
5 S. A& h, k. q3 S7 C
7 d/ f: M; d3 }, V, B1 t- DESC STRUC
/ H8 q, I" I5 _1 }2 D! A0 |8 a - LimitL DW 0 ;段界限(BIT0-15)
8 V5 d3 a3 y O6 J/ F - BaseL DW 0 ;段基地址(BIT0-15)
! E' o- Y) n! ?' I4 w) P - BaseM DB 0 ;段基地址(BIT16-23)
" ^- C# h, O9 ^$ u' H - Attributes DB 0 ;段属性
- @0 H! S! T6 K: [6 K1 E6 ] - LimitH DB 0 ;段界限(BIT16-19)(含段属性的高4位)- k) L7 F4 p! b/ @; j) A
- BaseH DB 0 ;段基地址(BIT24-31) K4 x+ o$ F @ R9 \0 u! }- z) B
- DESC ENDS! \0 C) ]* [; I! `
- 6 w& u& }5 \) d4 e( _/ I, O
- PDesc STRUC
, q( Q2 t( o' @7 t- L* L& b& G - Limit DW 0 ;16位界限
4 B/ P! p6 \* }( N' I7 K' Q/ z7 q( | - Base DD 0 ;32位基地址1 R/ t1 r, G6 ^$ k& ]% A5 p
- PDesc ENDS
6 w- j a, u8 Q) D( b0 P5 w2 @ - / q1 e5 l( w- b! Q, r1 `
- GDT_def Label Fword# _, f) U1 R9 L7 M/ Q+ N- g' b
- Null_Desc DESC < 0h, 0h, 00h, 00h, 000h, 0>
' H+ Q* l+ h W, f/ @, m - Data_Desc DESC < 0FFFFh, 0h, 00h, 92h, 08Fh, 0>8 D) ^: w2 `; Q1 H" K8 [
- 9 B9 N. S0 O6 t0 N$ s& R/ `
- GDT_Addr PDesc <$-GDT_def-1, >
/ X3 g# U9 b v& K1 |7 G9 r5 D: } - DSEG ENDS ;数据段定义结束 x# F8 v0 u1 o" p: D
- 5 z* Z, p4 ^# x' C5 S6 V
- CSEG SEGMENT USE16 ;16位代码段; J/ t3 |( `$ g8 _
- ASSUME CS:CSEG,DS:DSEG
! ?4 k: V* F- S3 a( Y - .Startup% ^6 n8 L& C, u8 [& |8 d+ `! h
- call Set4gb" ^7 {5 T6 S, z
- ;
2 D; e7 V& ?0 k7 ]2 G - ; fs, gs即能访问4GB空间
4 K. C7 b ~7 ~+ W4 f) Z - ; write your code in here.8 S2 o6 Z& c6 k" ~5 b2 E
- ;
: _+ M9 c# S! n% {8 T: } - .exit
}5 T! t; Q2 `. W! J; p - 5 m X& S3 ?7 M/ U
- Set4gb PROC NEAR
0 n9 N7 e; _5 }5 l* p) L9 @ - in al, 92h; x( _1 d9 D5 O
- or al, 002
8 ^, W: o9 e9 ?4 T. M( ~ - out 092h, al
0 E' }: r/ G3 U3 b: v - out 0edh, al& ^( j9 S8 V, t) q- n8 [
' D* k- q# e+ z2 } a& w x: }- cli
" I1 v; l! U# A - 2 L/ }4 L: S D/ }% W# F+ d
- ; mov word ptr GDT_Addr, (2*8-1);0 y4 {( K6 D6 n' K$ K# ^
1 t( h0 p- G! u1 F4 V7 P, J9 b- mov eax, ds" |' {& c4 C" K6 B; m! Q' z
- shl eax, 4& C; d) }, r3 a- w& Q7 E. t
- xor ebx, ebx
1 ]; B4 B- `: C2 {1 Z - mov bx, offset GDT_def
% h; h; P! |3 A1 w( r% |, n - add eax, ebx( _5 K! z0 j# Z3 }+ k* q
- mov dword ptr GDT_Addr.Base, eax1 p: H+ s, }, i. ^7 g; _/ f" r
- lgdt fword ptr GDT_Addr
5 K. G) ~9 |! G+ W1 u, w% J - # Z6 _- x4 Q% a+ a* O$ S
- mov bx, 8
j$ r7 u9 d9 J# O, _ - mov eax, cr0/ Q: `# g) D* ], H# K
- or al, 13 r6 t* U8 }1 I/ F
- mov cr0, eax, W& b2 p$ z1 Z' l9 T0 e
% @& N/ a1 R7 }' F) J- jmp pMod4 T4 B* s4 r3 Q8 e! J' B. U4 R
- pMod:+ }$ t! G5 a/ h! H, F+ A
0 {+ b- B0 m4 [. {4 j+ e6 U H" ^- mov fs, bx
. \5 f" u% k _9 ?2 p! H { - mov gs, bx
2 i6 h4 ^7 P: Y5 n# Z E9 e- s - and al, 0FEh" ~6 |! N# j6 G l8 X
- mov cr0, eax$ V( Q1 L& x# u. K
-
! m9 S: ^! b0 }4 A; y - jmp rMod
! Q* k G) i! i& v6 l7 m - rMod:$ i/ j' c$ b W' C
- o, `$ {* T3 r- mov ax, 0
0 |: n O; d- d$ \# ` - mov fs, ax5 L9 @; ?5 o A3 Q
- mov gs, ax" V2 G- N- r" W4 ?
-
( r) Z6 p+ ~% y# P3 s9 c$ g6 J - ; 在2M的位置测试写一下数据5 T9 F! q0 {& Q: g1 B/ d4 q* A0 M) r
- mov esi, 200000h# U, Q- h1 j J1 L* T: ^7 f. ~: [
- mov dword ptr fs:[esi], 055aa55aah
. Y" F8 x p3 N& w- i( S4 k9 G - ; 用RU去看看200000h的位置是否是此数据....
/ n9 G9 O# E7 P$ h
! D8 l0 b+ p. y- I W( k( s3 z- sti9 t4 v4 N4 K$ c F
- ret
/ u% j5 e: _4 l/ W" I5 ]+ r - Set4gb ENDP
% s! k/ u. V) Y) @0 K( r1 f. s -
1 y+ Y0 C$ e' y, r; w; C4 y, H, x - CSEG ENDS ;代码段定义结束: S3 W3 n# z) a/ ], G5 |
- end
复制代码 |
|