|
刚学习的同学,有些还不会,我这里贴点C和asm的代码。只供参考。
# s4 ^- M4 y# h
( B0 l8 V% ^ v7 B这是C的- /********************************************************************" s0 U1 c# ]$ V8 Q) `
- * File: DOS4G.H *
$ G% N/ D! F E4 f( z - * Compile with BC 3.1 ( Editor: Tab size = 4 ) *8 M) ?- x; a9 X( t
- * *" |, _4 |% {6 h: |. [; F
- * ========================Title=============================== *4 r3 X" V. @8 D
- * 这个函数是让系统进入DOS 4G模式 *8 t" d1 m n: y8 y5 P
- * 程序参考了:陈家琪《DOS实方式下直接访问4GB》 *8 X; T3 i: k3 X9 X
- * *% [! J0 ^9 B1 t9 r' E* T$ C
- * 使用: openA20(); set4gb(); *1 i+ u+ a7 f: |! ]
- * *
7 r3 T, `- x: g0 U, R' D - * ===========================History========================== *
- a$ g- L! J/ }, U3 s" I - * author: bini *
: m ?! ~3 O# e$ Z8 P - * date: 2004-11-30 Frist version. *# v" L4 E- `: S3 n$ d
- ********************************************************************/" E( G' D# p4 q. U2 B* e7 m
H3 v) p4 Z2 k. C) n- #include <conio.h>0 F, Y9 ~) E f3 T) D* e& V) _
- #pragma inline- o0 C3 Q: }3 D; e( n/ c( J
- 7 F. L; j. _4 g
- /***********************************************9 V# G- `' K) m2 M# D- g1 w. G8 v
- * 两个GDT,第一个为系统使用,不管,默认为0 *
: r" T+ c; I. _1 T3 ], a0 O - * 第二个为一个数据段,没有代码段。 *
) F, }& U: p4 q$ J9 v i - ***********************************************/+ p/ W1 g. g+ H: J
- unsigned long GDT_def[ ]={0,0, /*系统使用*/- g) a% M- u& h q+ V
- 0x0000FFFF, /* hi16bit( 0~15 ) is base low=0, 3 m/ q4 l3 S) B& @
- low16bit( 0~15 ) is limit low=0xFFFF
% T, Y& d. W1 p - */+ E% k N1 Z: `0 l, K6 {6 w3 |
- 0x008F9200};/* 最低字节为 base( bit 16~23 )
% n& _6 Q- |% _ E - 最高字节为 base( bit 24~31 ): o. ~4 J" J: f! r! V; |) a3 D
-
' ?% i! c3 o5 D& a - 属性Attrib = 0x8F92
$ m) ^2 m# C, k# h# L9 k5 [ -
1 y3 }- P1 K* c8 u! i - 属性位Hibyte低四位为
% n0 k& q* @0 S5 U - Limit( 16~19 )=F! Z$ k. X8 h/ X
- 属性位Hibyte bit7 为粒度# H% `) X! }3 H' s4 y
- (值1=4KB粒度): D+ U1 e1 H9 K+ I v9 N. W8 `
- 8F & 0x80 = 12 ]! ?9 N$ ]0 @$ s
-
8 l- j: I( e0 S$ s& N* d - 属性位Lowbyte低四位为段类型,值=2: \ `+ F0 c) g& \( h {
- 表示为可读/写段
/ w5 A" b4 _( x3 @5 k - 属性位Hibyte高四位=9,bit3=1表示:2 @4 a/ d7 ?. C. b7 O/ `
- 描述符对地址转换是有效的。
( c& I9 E5 A" C9 O$ w$ s - bit0=1表示为:
4 ~+ }- ?- _/ J1 |9 w6 ]5 u0 v/ O - 系统段描述符。而不是门描述符。/ S; x! g. e- L/ z. q( u* z) Z: G- W
-
3 L8 f6 I0 e% p4 {8 ?5 e - */: X% g' t: y4 h: e
! Q8 D2 s/ U: A7 M" Q ?! k- /****************************************
8 E8 o9 y: O4 g3 w+ S - * GDTR寄存器, 48bit=6bytes *9 f5 U7 L8 z' l
- * +-------------------------------+ *
0 u" ] @1 h0 s1 Y6 I& E - * | 32bit基地址 |16bit界限| *- x2 N- f; B* k
- * +-------------------------------+ *
# c9 I8 D" ^( T$ @, g - ****************************************/
0 \! R: s0 e, Q5 M. o - unsigned char GDT_Addr[6]={0};. X/ y) { a. _6 E$ i4 H
- 7 [; G# K2 k% c. ^. O' N: W
- /****************
; J- y1 ^& _$ P7 W8 h7 {0 i; d - * 打开A20门 *
# u7 h! ~! T; ?* r1 Y - ****************/
( l" p+ c' r# n* a% [6 m/ u - void openA20(void)
: q, j3 ^$ c3 E4 ]8 i; ]& U - {
3 T5 ]5 ^7 B* Z# B; k2 t - asm{
+ d4 j6 Q' E/ P! F) G! b2 ]6 i. ]3 _ - pusha' V4 o7 Q: A+ A( n! y4 f
- in al, 92H
- p) _* S; x; E: d - or al, 0x02, Q$ p/ H: o$ G9 e. |0 \0 N
- out 0x92, al& o! h5 X; q* N c9 @1 d
- out 0xed, al
. Y! R% V( P7 G, q& ? - popa
8 E# B0 n( W* @. _* c, V. e - }
# e8 Z. `+ r4 e. X. N( c - }3 v( G8 U5 J: F7 e
; m! [7 g9 p0 {/ v- /***********************************************
9 r3 f2 w U4 R1 S& ` - * 函数功能:进入DOS4G *
; g% s2 U! m2 R! R6 S. X: L, g G - * ==================== *
, Y8 P/ p8 c& f - * ** |6 X$ v2 }, c, t8 i2 q
- * GDT描述符界限计算方式:描述符个数*8-1 *
* e+ A7 d; D2 `. H; V6 c% A - * 如: *# h) o1 B: v1 w
- * mov word ptr GDT_Addr[0], (2*8-1); *
A/ _% n) ?4 v- r7 ]' g% |+ s6 h - * 表示为 2个GTD * O7 S; |0 M7 t) {7 E
- * *
6 R, J' l2 e7 Y" Q' R, i- \" X, u - * 选择子为所在描述符内的字节偏移。 *$ I' n2 F8 y* c( y2 S- ^; l
- * *
% H7 c9 m& u3 z2 n. t8 e u$ e5 e - ***********************************************/! |& L0 p' N2 V4 S* K6 k
- void set4gb(void)
7 w5 S: u8 b: ?: J8 H8 h! Y - {2 ]/ J h3 B5 u/ T: I6 d' t
- asm{
( y8 P3 T+ p5 r0 P2 q+ W1 L9 r g8 i! n - cli
: j9 a. B; Z8 M4 m5 j l! T5 n - /****************************************& E/ ~) G( {# K1 c% J) h5 B2 c
- * GDTR寄存器 *0 J, N4 \. H% t" x: }, I5 G' c
- * +-------------------------------+ *. N" `& K) z2 j0 @4 u
- * | 32bit基地址 |16bit界限| *
% J6 x) ]1 G s7 L6 o: ^0 x* ]+ W - * +-------------------------------+ *+ g" b: ^9 V/ S6 c- B7 y
- *****************************************/9 x! O9 m5 X0 u, ?$ w. p
- /*********************
/ N: y7 Q1 p' q - * 得出段界限 *
$ i# Q! x; O/ ~% y/ c6 y - *********************/% d" v7 ?7 R0 U2 u! y/ o9 G- ?5 t
- mov word ptr GDT_Addr[0], (2*8-1);4 E; t" j' K6 U# G: w+ u
- /********************************************: T5 f% J" Z( x7 L" }- `
- * 计算GDT表的32位基地址,存入GDTR *
- p1 F" X, R6 j7 J% p - ********************************************/
$ Z% M- T7 a7 M6 |& E( q) q - mov eax, ds8 ?8 [' q7 h* a9 T0 u ~
- shl eax, 4
4 D& p7 G4 r7 p8 f4 ^ U - xor ebx, ebx1 k5 s3 h# ?5 S3 \: @
- mov bx, offset GDT_def F. u9 P& K* p+ L, l G3 K
- add eax, ebx
$ [# H$ m1 F% | g( p - mov dword ptr GDT_Addr[2], eax1 \3 ?. b. X6 T& e9 I4 N
- lgdt fword ptr GDT_Addr- O/ `+ P X. z/ Y
- /********************$ r" W! x% }# W( |( L6 a, V7 V$ U
- * 选择子偏移 *4 b0 }- B$ O9 Y5 ?0 ?- t( M
- ********************/
1 ~8 Y1 n: f. c - mov bx, 8
# N8 W$ z* s, S* n4 h) S7 A8 x - mov eax, cr0% d1 R0 |" I5 j8 {9 I* ?9 H
- or al, 1
( V3 F! N$ |+ S1 \( Q - /**********************, v) x2 r k- e' C
- * 进入保护模式 *
8 F7 v1 g4 {/ g0 [: [4 w - **********************/
2 f' r' Z9 K- C - mov cr0, eax7 x% G* r- _* [8 C
- jmp pMod: Z# D$ w! [! [' o* H6 u Q8 }. Y6 d
- }% J' x1 x, S+ D( ?; R7 V
- 5 q- K5 ?6 u- \5 P
- pMod: asm{: U$ i' h x; T7 ~; t& h
- /************************************************************
% G* E+ V5 f1 Q" u - * 让fs与gs加载选择子,使其能访问 0xFFFFF * 4K (4GB) 空间 *
0 _6 }3 l6 d' M* o - ************************************************************/2 @" v5 a% f- H
- mov fs, bx! W9 u3 d" G5 B! j C2 |6 H9 J$ L( v
- mov gs, bx
g' M5 a, B5 \- N - and al, 0x0FE
+ r# i$ U6 t' }6 r6 Y9 o, d6 q1 ^ - /******************& a u, |4 w$ {* @6 k4 S m- g: ~( H
- * 进入实模式 *! c% H$ |+ I* O8 P! @; L
- ******************/( t* k' i) ~7 h3 Y
- mov cr0, eax' l H7 \9 [5 T( ~- h; g' M2 c
- jmp rMod6 X p. V* ]& n# l% D$ j
- }+ d4 T. D- i' s6 v( T
* a3 O" h% @ j7 P- F7 v- rMod: asm{0 ^) G: E0 e1 p3 Y: v! I. K
- /* ******************************************************************
! j4 l8 y& l5 o6 t( c - * 退出,fs、gs清0,访问系统内存可用: gs[32位,相对于0的偏移地址] *
9 a; Y8 n7 b' `1 a' V+ I! c( E - ********************************************************************/
+ }( T) v4 p J N$ O% g - mov ax, 0
) o6 C, G8 Y( H: a* [( V4 X - mov fs, ax
9 t. L& W |8 E, g; n - mov gs, ax
7 h5 j, ]9 ]/ k9 O3 ~1 P7 ~# C& m - sti
' u- A5 r! `9 z6 `1 K, X - } ]1 o) I: Z& o* N" Z
- }
复制代码 这是asm的- ;/********************************************************************9 D0 p' O( T) h' c5 k& T3 L0 |
- ;* File: DOS4G.asm *
/ G& R% |# Q9 C - ;* Compile with masm ( Editor: Tab size = 4 ) *9 e7 \9 @1 Q5 T" _0 W8 V+ p
- ;* *
) f1 K3 D; V7 S! S - ;* ========================Title=============================== *3 w- ]6 L$ t) Z& ?3 u* k$ v" J
- ;* 这个demo是让系统进入DOS 4G模式,进行数据访问 *6 T* q4 Z, Z/ P# z. {% m# h( L
- ;* *
4 N6 M" Q; R& t - ;* ===========================History========================== *6 O( g$ I h! L- \1 m# R( f4 R
- ;* author: bini */ F. _8 E: {0 t3 u5 `
- ;* date: 2008-10-08 Frist version. *
2 N& o( T/ |0 j- a% K. N - ;********************************************************************/
h1 p: v) X d. R - .model small
! e1 u, R# G$ ]" g# ?: R - .586p
/ j1 c7 B( I N) n& L n - 5 n5 h8 [& A) C2 \6 T
- DSEG SEGMENT USE16 ;16位数据段- Z& Y' x2 @9 I2 _8 {/ [3 U
( X) {+ Y' k) w2 I- DESC STRUC6 L0 d7 Y! X7 O3 k0 T- _$ t
- LimitL DW 0 ;段界限(BIT0-15)
8 }( l' h, r$ Q9 d( A - BaseL DW 0 ;段基地址(BIT0-15)/ C( F; Q3 S K) f
- BaseM DB 0 ;段基地址(BIT16-23)
$ R/ p4 i4 a# E" | - Attributes DB 0 ;段属性6 }- K) V: `/ |8 _1 o/ H) H2 \" F
- LimitH DB 0 ;段界限(BIT16-19)(含段属性的高4位)# Y- s& p( ^) `5 {& ^2 [
- BaseH DB 0 ;段基地址(BIT24-31)3 c: ?: W. A4 |' R( J
- DESC ENDS
% P+ G* [7 s- A& Z8 W, u& m
- |) x/ X- [3 Z8 k- PDesc STRUC
+ V% v5 z, ?; \7 v - Limit DW 0 ;16位界限
6 z6 W' S( E$ X J8 ^ - Base DD 0 ;32位基地址
# C" R3 ]: ~- `) r4 T, Q5 t - PDesc ENDS
& u+ S4 `! f) z+ ]) O8 J( Z
0 @8 Q* u( ` W$ r5 j. ^7 |- GDT_def Label Fword
- N& H" K/ h3 m' i4 J - Null_Desc DESC < 0h, 0h, 00h, 00h, 000h, 0>+ t+ R2 z( x) H, N1 L% o
- Data_Desc DESC < 0FFFFh, 0h, 00h, 92h, 08Fh, 0> M6 w& l) l+ P$ {. p: y7 K
: w: M3 x% l8 i, n$ P- GDT_Addr PDesc <$-GDT_def-1, >) z- E3 x8 {: g5 z; V* n1 o
- DSEG ENDS ;数据段定义结束
% {! h) F3 g1 {4 B$ G - 1 {4 |" Y% z* q1 U2 v1 t" d
- CSEG SEGMENT USE16 ;16位代码段$ @6 ]$ T/ v; C( u+ _; _
- ASSUME CS:CSEG,DS:DSEG+ b; b0 v/ H7 ^1 M' w ?" b
- .Startup0 R# s1 G$ x# w
- call Set4gb3 _& x' O9 b' B6 X4 a4 i
- ;2 Q& T% C3 y8 _
- ; fs, gs即能访问4GB空间
5 t/ q$ c2 W6 Z1 G; a - ; write your code in here.
2 h( x" G$ J1 ]$ u D - ;
. q6 C; D8 v8 u v& V9 B; {/ ^ - .exit
0 Z2 {; g' j! h7 D -
: P6 R# Z, o; l5 s+ ?0 k$ w - Set4gb PROC NEAR
: J2 R p9 O$ j; S/ Q/ d - in al, 92h! h" J% S2 r: L- T. ^
- or al, 0020 x d5 b' d' o* r* P0 i+ B7 _+ j
- out 092h, al
( ]5 D* R- G4 l1 r j9 C - out 0edh, al. O+ c0 Y0 p3 |. Z8 q% A7 u1 @
% T4 R- t5 @* _% ]& |2 h) T+ c- cli. R- i" _( m3 B6 w A. |
- ( I: k' A3 x: w; `6 b
- ; mov word ptr GDT_Addr, (2*8-1);
& V+ G' A' g. x2 [+ G/ L9 V
3 B3 x- R2 \8 c' ^- mov eax, ds
; b# N" ?2 k, V! X9 s$ b0 k' x" { - shl eax, 4* Z8 l4 P, O" i$ k4 [& K7 [9 u- n
- xor ebx, ebx
* m+ F+ c& ]- h3 U; V - mov bx, offset GDT_def! \" K8 t R, j5 R$ ]- G: i8 A8 y
- add eax, ebx
. L# p1 d( P6 H- w- z3 u - mov dword ptr GDT_Addr.Base, eax
3 ~# g( H9 a1 C5 M: w' N J - lgdt fword ptr GDT_Addr
7 R1 Q5 C, e, k. Q& v5 k" u( ]! f - 2 s9 m3 a! r$ A( O0 A+ g& b
- mov bx, 8
+ P. s0 h+ H' \9 j& B - mov eax, cr0
0 g' K% F* ]3 }6 n* _ - or al, 1# k( \ c* F# P1 J: s0 ~
- mov cr0, eax* o; y, m3 t1 \
1 p! d3 o# E$ l8 N5 u) u# r- jmp pMod
! }& [0 Y% }, K& ~+ O - pMod:# ]- o% i8 J7 p# f: j/ o! o) l
2 m* p7 s3 M/ o0 c+ _- mov fs, bx
. q" ], e8 _) k5 K - mov gs, bx. m g/ z" }- }9 H( T; W0 }5 H
- and al, 0FEh
3 p! a* p! g3 c& I5 L& p5 l% S& u - mov cr0, eax
0 M, ^# y7 q3 i& B6 v - 9 S- Y9 N$ C! ^9 G. `% g
- jmp rMod4 K, R4 }2 i6 n5 Y
- rMod:9 A2 t8 Y" v, W
- 3 U9 [4 T% o4 L
- mov ax, 0, e, }' ]7 ?$ ~* B+ T3 A
- mov fs, ax
, X. N. p: e) {, C, p - mov gs, ax% v- P& k# C" h7 h: B$ n4 G( m
-
. `8 R; c# ]& p) Z+ d - ; 在2M的位置测试写一下数据
$ ~9 L5 y* C ~ - mov esi, 200000h
' H$ J# Q0 b/ G! E& j - mov dword ptr fs:[esi], 055aa55aah3 o# L( l5 g5 z& h
- ; 用RU去看看200000h的位置是否是此数据....
, s3 h4 a4 u. q- U7 R- `
; P) f% H: I; F- sti
d! t/ ]8 N3 e - ret
# i: q; [& h# r: X/ r - Set4gb ENDP. K N5 b/ C+ W4 C; X4 S) ?6 j" k m' h
-
3 s# W' Q; a1 E! B4 {& D' V! Z G/ t - CSEG ENDS ;代码段定义结束
" a2 D5 l5 p, D - end
复制代码 |
|