|
|
刚学习的同学,有些还不会,我这里贴点C和asm的代码。只供参考。. N+ ~( `; V5 q/ c3 D# o
' _" j6 i7 C( v6 q7 x
这是C的- /********************************************************************) j- e# ~1 L$ l: W
- * File: DOS4G.H *7 w+ E' C \5 c0 D/ p
- * Compile with BC 3.1 ( Editor: Tab size = 4 ) ** a5 B1 ]* S% M& Y2 {7 R; W! [
- * *
f2 d+ I% P5 m8 ?* @ - * ========================Title=============================== *
- T4 e7 w: |! B - * 这个函数是让系统进入DOS 4G模式 *
+ _( A+ H+ O7 ^' ?! m+ H - * 程序参考了:陈家琪《DOS实方式下直接访问4GB》 *- o- e+ B, U+ q$ m3 o9 q5 y
- * *2 ?+ `, j3 h, a0 S Z& @
- * 使用: openA20(); set4gb(); *5 f( j/ E' u7 k8 s9 W
- * *
! b1 O/ v- r, ]) B - * ===========================History========================== *
% B' v' ?3 F- @, ^8 L; r - * author: bini *
- S, s! J9 p+ T: I/ r9 ~+ o - * date: 2004-11-30 Frist version. *9 U5 A% q' J' g, r* x
- ********************************************************************/4 S5 C4 i) h, R1 z6 y& k" F, i
, g$ p. H# W- A% Y- R- U- #include <conio.h>( a- L Z) g1 k4 l& h, K$ l D7 U+ C
- #pragma inline
2 J( H/ P/ C, I) a( z8 A - $ I$ Z0 |$ G9 k# v
- /***********************************************
7 A8 S* q8 F' G - * 两个GDT,第一个为系统使用,不管,默认为0 *
% L1 P1 O6 N5 X0 D9 S# {0 U4 r" ^ - * 第二个为一个数据段,没有代码段。 *
. S2 J5 b% L) `- B* i - ***********************************************/( m8 U9 n" C4 u" d! I
- unsigned long GDT_def[ ]={0,0, /*系统使用*/
9 K5 i# I* J2 c3 n& f6 B - 0x0000FFFF, /* hi16bit( 0~15 ) is base low=0, 6 P5 f P0 e. p& l; W# o: J4 ?0 A
- low16bit( 0~15 ) is limit low=0xFFFF
( R) |7 ]3 O" j# b; d: G9 } - */
) e9 ]. C1 ^& |6 x6 l - 0x008F9200};/* 最低字节为 base( bit 16~23 ) D2 z! c' C. g5 Z) \ v0 s3 F0 [
- 最高字节为 base( bit 24~31 )
7 o8 r. c' B- ` - & a+ g8 f# K) J- |6 i
- 属性Attrib = 0x8F92
9 d9 g+ J; o8 \& n -
; a( Y- ]% w" h7 O7 C1 ` - 属性位Hibyte低四位为
6 v% O5 u& Z7 h/ @ - Limit( 16~19 )=F6 h, b# E$ Q4 K; s9 p e. B" [
- 属性位Hibyte bit7 为粒度- z" c% s4 X4 X1 p8 F
- (值1=4KB粒度)
4 u: Q' v3 p; {" g - 8F & 0x80 = 1
4 V) c7 ^) B) ? [8 i# E8 p& x -
" ?6 u5 ~, j2 Y2 f' p% q - 属性位Lowbyte低四位为段类型,值=24 p& W& t2 H. R8 f# H* t7 c& P7 T8 d
- 表示为可读/写段
, t' a \4 p5 s+ c1 H - 属性位Hibyte高四位=9,bit3=1表示:
5 ] n5 R- o7 S: z - 描述符对地址转换是有效的。
' p/ J: ?4 V* X6 t R# A - bit0=1表示为:0 t1 c3 i. F) [; Q6 Z. q
- 系统段描述符。而不是门描述符。2 R" B3 e: g/ q" ]/ }+ H
-
: l7 v9 @+ H8 I( t8 ~& K - *// k) g" u6 b$ o8 l4 K
/ v& N1 @8 v9 h3 |% ]+ a2 G! i- /****************************************
3 h1 \' O9 j- B+ M- x5 a, ~ - * GDTR寄存器, 48bit=6bytes *$ y0 a$ A1 f) r# q
- * +-------------------------------+ *& i8 C+ W) e/ D% J+ y5 n' p# z, c: H
- * | 32bit基地址 |16bit界限| *
6 d: F; x1 J L% V. K9 N8 Z& s - * +-------------------------------+ *
* A, `; d v8 ?, { - ****************************************/8 e5 U% O5 N1 c8 t j/ ~7 R
- unsigned char GDT_Addr[6]={0};
0 [0 j) q& t5 R: ]5 Q: c
8 B% p! G0 y" x9 F- /****************$ A- v+ b$ y7 }& T
- * 打开A20门 *
2 r* @' C# N- A! y5 v; `1 x* } - ****************/
, o8 ^! G; s' m5 b, G$ }2 J - void openA20(void)
8 c( i% B. j# N# P2 D- D - {6 b, B3 ~ [+ C- F
- asm{
8 ?; P0 k8 r6 X - pusha: Q4 l) B f9 i
- in al, 92H! ~7 z" o6 W& K a
- or al, 0x025 O2 u, l" W. g4 i
- out 0x92, al
+ z/ P3 K( O/ @( P& g4 P$ l2 r/ _( A - out 0xed, al
" a- O+ o3 m0 O1 t - popa8 a8 j3 w3 g# u& d
- }! {/ k# z+ c d: \2 Y
- }
/ J I' y2 \# A
* y! r' }* s+ {3 @- /***********************************************' d! l# Z3 z( i1 |# p
- * 函数功能:进入DOS4G *7 f: C3 `) d2 e) L
- * ==================== *
0 o/ ~6 {0 V# Y7 a' C - * *
6 o2 W2 b9 c( N) J8 _( e - * GDT描述符界限计算方式:描述符个数*8-1 *
! Q* k8 q9 J6 m - * 如: *6 m% F0 j3 x8 m0 }' j4 C" t
- * mov word ptr GDT_Addr[0], (2*8-1); *
3 G' W7 J) D$ z8 f7 ^" E - * 表示为 2个GTD *2 e5 I6 o) _. e/ F/ X
- * *
" W6 _8 F9 D: R4 D& {1 L. _& `3 l - * 选择子为所在描述符内的字节偏移。 *# [6 j* L2 \8 A! h5 n K5 s
- * *
/ N- w9 ^' w T, z% w2 n - ***********************************************/
0 Y+ z# A3 {+ `; l, |+ T - void set4gb(void)
: ~+ F. R6 j: f5 a5 \ - {
9 S9 E3 R1 w6 G/ n* L+ V7 o9 K - asm{: T) c8 n$ `( H; j7 q0 U+ v9 j
- cli
7 G+ @" a3 v' X/ t9 o* T. e - /**************************************** P3 f1 q0 A4 `1 I" u n
- * GDTR寄存器 *
: O5 p/ L. I' U0 K+ F& G& X3 `* x - * +-------------------------------+ *! e6 z/ k& p: G; s3 }
- * | 32bit基地址 |16bit界限| *, ~( f+ G) C. G2 N$ x
- * +-------------------------------+ *
- e6 i7 {2 n; Y - *****************************************/
8 J- B B( P! o - /********************* q- ^& d/ ^3 q- N! R; }6 s
- * 得出段界限 *
: a7 j" i% I' v8 _* \; X. \- H - *********************/4 j. i+ Q/ k5 S0 m8 K
- mov word ptr GDT_Addr[0], (2*8-1);- r+ i+ ?! ~0 y9 d8 h0 m+ o
- /********************************************
% N% Y* e; _1 ?8 X2 j1 I - * 计算GDT表的32位基地址,存入GDTR *- z, s7 M' ~3 u/ N- z
- ********************************************/7 r% n' [ }% R& e* c
- mov eax, ds+ Y7 o3 R+ z' D# ~' ^) p9 g
- shl eax, 4* N2 B/ b: n4 i0 e, D
- xor ebx, ebx
- e0 J* s6 n# a - mov bx, offset GDT_def- n' v0 t2 y+ W2 a
- add eax, ebx
8 F/ |) d2 G) H3 b2 H - mov dword ptr GDT_Addr[2], eax' k$ E, X* z J- t
- lgdt fword ptr GDT_Addr- L% e& l$ N. j
- /********************
/ L# n3 o9 a+ |& `; O - * 选择子偏移 *4 V- \) `1 Z) R# q! M# E. z# z
- ********************/
9 |* k6 i% O; u5 x - mov bx, 8& U% q( D8 x) z, J, ~5 d2 Y! h- D" u
- mov eax, cr0% E6 {# @0 [: q. Z. P
- or al, 14 e! {; u9 P; Z0 t
- /**********************
; Z, H1 r; Q* W; [9 E1 j4 V2 e - * 进入保护模式 */ B9 N, I3 J/ ~9 H; a8 e- w
- **********************/3 L( z( ?# I2 K0 y9 e5 B# S7 }3 Y
- mov cr0, eax( z* E! S* X% O9 Q. j4 ]0 I. l8 H) r" M
- jmp pMod
( W: S$ C" c/ f, d6 h4 F - }$ Y2 L, q; O6 Z
; E& ]& z. k. _- pMod: asm{4 \9 E4 v% d5 Z* d8 m
- /************************************************************+ t* Z0 B' J) ~7 N% ?# }
- * 让fs与gs加载选择子,使其能访问 0xFFFFF * 4K (4GB) 空间 *4 P2 B! ~/ D3 Q0 N$ o8 u9 t
- ************************************************************/
) y' t$ }+ X7 M4 v- ^1 w - mov fs, bx1 S ?; [+ i$ z1 t- G$ j
- mov gs, bx
v2 O5 u. b( ~& l& k- f5 ], i - and al, 0x0FE
5 m( A, ]2 l' W( y1 J/ h - /******************
' i: o9 A% h* b' ?1 I - * 进入实模式 *, ?" Y! ~- j8 z+ a& v* }6 Y
- ******************/( N+ @4 c0 q k0 Z( X7 a) D; X
- mov cr0, eax5 C8 m! I$ _0 b1 Y( f' _. h) Z
- jmp rMod
3 F4 v- u# X3 U - }
2 u. z" ^+ D" @% v5 o# w, I - , T& z/ ?+ a1 ~
- rMod: asm{ n2 T2 `; X! m% n0 W4 z# R' t# L
- /* ******************************************************************+ \& o* }& Z) z/ H
- * 退出,fs、gs清0,访问系统内存可用: gs[32位,相对于0的偏移地址] *
# l+ k2 Z) g: W: C6 [ - ********************************************************************/
4 o& \3 c4 h6 R5 s# N' U# t. H - mov ax, 0& K- N+ |0 I6 Z ^/ v) s
- mov fs, ax
4 e) Z7 i t* `7 J$ t - mov gs, ax, W2 h0 i5 N6 N) q+ G( u0 d% l
- sti
) H8 k2 r' b" [+ ~2 i0 D& |* ^7 d/ h - }
/ x& K2 N+ n& B0 F - }
复制代码 这是asm的- ;/********************************************************************" x: Q- r) y8 W, v* Z2 t
- ;* File: DOS4G.asm *
9 U1 {+ i/ w" m& t - ;* Compile with masm ( Editor: Tab size = 4 ) *
3 m H$ L& i0 O1 P2 v. B - ;* *
5 @$ [: X) Y/ @1 p - ;* ========================Title=============================== *' G" H- m& z- D3 x7 T: E3 c) T
- ;* 这个demo是让系统进入DOS 4G模式,进行数据访问 *3 i4 m6 P: I0 [) q8 H8 M4 X
- ;* *
9 ~0 X/ r- _7 Y2 I, P; X; Q - ;* ===========================History========================== *
3 P0 T- C/ i% L. V - ;* author: bini *) B U% J% z2 h0 u- h# y
- ;* date: 2008-10-08 Frist version. *- _- o* o! F+ |1 g
- ;********************************************************************/
; u3 c. x7 n& w9 J+ s5 c' S( I - .model small, G. U+ L( G! D% g: \! O
- .586p) x' o$ o4 O7 e I9 D
-
7 d% A; h' V( E& Y - DSEG SEGMENT USE16 ;16位数据段
( m0 w7 ~ b- e3 O- C - 7 B h7 m$ R' N$ |! Y7 T
- DESC STRUC
" ~" B3 R. b5 |, b# \0 }9 j/ T - LimitL DW 0 ;段界限(BIT0-15)
8 X4 Z! M( o. R2 O8 {1 H0 A - BaseL DW 0 ;段基地址(BIT0-15)
* ^$ T4 G5 d7 g' P$ _ - BaseM DB 0 ;段基地址(BIT16-23), k8 |9 ?7 a1 m' @5 x% N
- Attributes DB 0 ;段属性; {6 l) g' {6 h1 S' A4 h8 x7 A0 D
- LimitH DB 0 ;段界限(BIT16-19)(含段属性的高4位)/ q! T0 M9 x8 H1 P3 b
- BaseH DB 0 ;段基地址(BIT24-31)2 }- \( V, V0 Y! M1 c+ o1 Q* Y
- DESC ENDS$ N' ~1 z1 ]' [% i* x i' o& Z
- 9 T" i1 I9 j' k7 B! S: |5 Q( o
- PDesc STRUC9 H2 h* A" |2 K6 y1 a# }
- Limit DW 0 ;16位界限8 v" s0 x* Y5 N
- Base DD 0 ;32位基地址- \8 v* a$ j$ }# Y
- PDesc ENDS
' t+ k4 Y# K" o' Y: W
4 v3 j$ z! d6 [1 _' S' m# i- GDT_def Label Fword3 l5 o% h, { t- T
- Null_Desc DESC < 0h, 0h, 00h, 00h, 000h, 0>
( S* u4 g4 l, L' Z - Data_Desc DESC < 0FFFFh, 0h, 00h, 92h, 08Fh, 0>
$ S2 R2 H4 G7 L, Q) _) e
: i* W. @! b* i4 H( a* Q# C- GDT_Addr PDesc <$-GDT_def-1, >; b6 t5 |6 k7 {. F k5 q
- DSEG ENDS ;数据段定义结束
; g: |+ b# P o! F9 T7 N+ x6 { - 5 ?) f6 Q! g# h, }* U' W
- CSEG SEGMENT USE16 ;16位代码段
. q, N. E+ y+ F - ASSUME CS:CSEG,DS:DSEG
0 m6 c( ?: D$ v& a9 C# A$ V - .Startup
+ }6 C5 K8 Z$ g) L7 W1 n7 x/ V; s - call Set4gb) t3 H" L* K( ^3 v. x" @, c, Y
- ;
5 C o) R' |# _/ P$ }9 U$ @ - ; fs, gs即能访问4GB空间 K$ {4 B3 o" f7 Q& j
- ; write your code in here." j1 E1 ?6 d+ c# H, T2 u5 t
- ;, x M- n6 q% D$ o6 [3 d+ V0 w3 @
- .exit, C2 s7 J8 Q6 b
- 0 K3 \+ U5 s$ i* U# G
- Set4gb PROC NEAR& P9 B5 W: X$ I( ^% y! D1 O
- in al, 92h
7 S( n+ i: ]! P% T" D+ k0 e7 F0 m - or al, 002$ N$ g+ t; L" u4 j
- out 092h, al/ u* N4 i7 U9 h$ ^% ?) m' i5 Z8 @9 m+ J
- out 0edh, al
V6 E+ Z1 X- `
7 [! m7 L& V- ^; w- cli
- o+ A; A% U* f0 A) f( T$ Y - 6 M! E% D9 j1 N) i
- ; mov word ptr GDT_Addr, (2*8-1);
5 f3 j- c2 d. U j1 |4 \ - # @1 w5 C. H, i4 N3 i/ h
- mov eax, ds
: ^" s+ {) D( W9 Q v, G - shl eax, 4
- o4 N7 `7 l! q+ f% R0 Q0 A- I+ ^ - xor ebx, ebx2 T. S" e$ t: A4 T
- mov bx, offset GDT_def
) D( y+ c# i8 C6 E! @3 o - add eax, ebx
3 T6 y$ F \' U5 _1 x - mov dword ptr GDT_Addr.Base, eax
7 d% X" H: `; P. `$ f - lgdt fword ptr GDT_Addr
7 H! O. L* u5 ^ - & l# q: [ `3 t
- mov bx, 8
: @8 F$ \9 |9 f* j; k% p6 D7 y - mov eax, cr09 U5 ]7 g! h$ {# z
- or al, 1& R* y) t) _( Z0 c: n9 Z& K' n
- mov cr0, eax
1 g; N3 N4 m2 K B6 B
7 a, `: N& I( y& ~3 ^' H- jmp pMod
7 C r1 L) u7 |: P/ ~ - pMod:
5 u w) I4 Q( L6 ? - & t7 b3 b! C) |% k% w. k% W5 T+ @1 a9 ^
- mov fs, bx; {8 c3 G; S4 Y7 b3 w/ J
- mov gs, bx% z. n, t. W& V
- and al, 0FEh; ~ i4 U* k% d J w# x" l/ B6 H
- mov cr0, eax. N4 m7 S7 x2 _2 k9 W7 @2 h
- 8 ]$ }8 H5 y9 k: P) B
- jmp rMod! d$ y- `5 ^6 ^5 V2 E
- rMod:6 ]: h/ [( L% T! y S3 f0 z
5 I4 N4 i7 K( a# _3 B7 a) ?- mov ax, 0
& [3 ~/ x( K* i9 k- T - mov fs, ax
& V/ Z: A0 J, I; X - mov gs, ax# a( {. J0 a# [0 P
-
9 v% u; e- P$ r. G! U) o8 Q" [ - ; 在2M的位置测试写一下数据
* @& P8 x* T) K; Y/ D2 L - mov esi, 200000h
6 V6 l' m) A* m2 }- b& Q - mov dword ptr fs:[esi], 055aa55aah
0 J- x4 z: p3 Y9 f5 G - ; 用RU去看看200000h的位置是否是此数据...., u. Y& s5 n# H6 m) a0 Z N- W. a9 o
# J( H N+ i% \- sti
; h' f. S- s: g' r& C1 E3 z - ret
5 R0 D3 A9 `2 O" T - Set4gb ENDP' N. D* u' V$ O* j! E
- 9 l$ o! }& W0 u5 x \
- CSEG ENDS ;代码段定义结束
+ n2 R8 j1 m# d {7 _3 v$ v _ - end
复制代码 |
|