|
|
刚学习的同学,有些还不会,我这里贴点C和asm的代码。只供参考。; K% ~; K- P9 n
6 V% z) f, e; g这是C的- /********************************************************************
( {2 _3 b. h7 t @" A - * File: DOS4G.H */ ]( \4 p0 p8 W- r6 j2 E+ f3 ]% r
- * Compile with BC 3.1 ( Editor: Tab size = 4 ) *
5 v, b4 H" v% I - * *
! l: h% _% m+ w0 C" t( e - * ========================Title=============================== *6 U: i- `8 u# M; y6 p8 y$ L
- * 这个函数是让系统进入DOS 4G模式 *# @% W8 L1 S' [5 m6 U
- * 程序参考了:陈家琪《DOS实方式下直接访问4GB》 *
! r8 o, X: ^' H% H: a7 t" D - * *( f/ B0 t1 E* |
- * 使用: openA20(); set4gb(); *
/ M) h/ |' {0 T - * *$ L- `' b6 l1 Z/ |( `: |; Z! [) P
- * ===========================History========================== *) b, y/ g+ t* k/ b5 b7 S' E9 p! L' e
- * author: bini *& p/ j7 {( n U& F# |
- * date: 2004-11-30 Frist version. *
6 w" v2 Q) L) K$ {) Z( ~ - ********************************************************************/( |/ a z _5 C; O+ Y1 i
1 K4 e( n4 I B" \/ Q- l- #include <conio.h>
& T( G$ n, I3 I: R - #pragma inline
$ e7 Y# V6 `7 {, s+ W
]. F/ G. X* G! E5 V8 Z( J( H- /***********************************************% S3 e9 X+ D" Z6 q' @" S$ w* Y' K
- * 两个GDT,第一个为系统使用,不管,默认为0 *
6 r4 {1 z5 H! L3 u. W3 ^7 f, k$ D - * 第二个为一个数据段,没有代码段。 *% G$ @7 U! f9 C) v$ |
- ***********************************************/
6 C, W& Z! m4 |' ?' j, o3 l: _; | - unsigned long GDT_def[ ]={0,0, /*系统使用*/- w3 Y& D% k- R, ] Z1 R
- 0x0000FFFF, /* hi16bit( 0~15 ) is base low=0, $ \1 ~* F+ k/ t' u
- low16bit( 0~15 ) is limit low=0xFFFF
0 H5 k; n; b1 |: }& R9 `0 L1 w k - */
9 G) ]3 q ~( U0 P - 0x008F9200};/* 最低字节为 base( bit 16~23 )+ U4 P# R9 w0 m' t( B* M# |) T1 f! ?* @
- 最高字节为 base( bit 24~31 )1 ?, b/ u K2 x4 z4 ?6 O
-
! t! B# L; C' ~) M" Q& M8 s+ ` - 属性Attrib = 0x8F924 X" e9 [* Q& @" r
- 3 b1 W# K4 _6 r2 i0 i( q' u1 f" v. {3 B
- 属性位Hibyte低四位为
- d. }- A) e) n! u# r - Limit( 16~19 )=F% ^/ h( U% r8 j5 @. E0 v
- 属性位Hibyte bit7 为粒度
/ s& S' Y; o) v9 n" @8 c* K - (值1=4KB粒度)! v$ G* |' @% }7 q' g9 @/ u+ u
- 8F & 0x80 = 1
4 _2 x6 P7 A. X7 f$ A3 l -
- J$ p% x7 @6 P: p! v& u - 属性位Lowbyte低四位为段类型,值=2: \% j9 q% g4 X
- 表示为可读/写段
) T/ |$ l) v* @; ?' l1 M+ q9 ?9 ], O2 c - 属性位Hibyte高四位=9,bit3=1表示:
" i6 R" s N& \ - 描述符对地址转换是有效的。
: k' @+ t( x9 W8 X% o - bit0=1表示为:# S6 u. `1 `* @1 ], }& h; L- G+ p
- 系统段描述符。而不是门描述符。0 x1 p6 s' {' K9 u' H! w
- * A: I. r5 i7 N0 g2 Q$ \
- */& n1 [1 O0 t, ?- ]& L( p4 f
- ; q' f0 ]- s8 s# _- O; {
- /****************************************
, |" G( y3 a6 Z% _0 t - * GDTR寄存器, 48bit=6bytes *% A) O; H) k: f* Z* [
- * +-------------------------------+ *
6 K! e- x7 S2 B5 {9 N - * | 32bit基地址 |16bit界限| *
0 M8 M) w% z% e* K/ p - * +-------------------------------+ *
3 b$ E, u9 q+ Z% p - ****************************************/
! [4 |, K" H" H, e8 M- m - unsigned char GDT_Addr[6]={0};9 i3 x- o& @6 E) X8 O8 V! i
- % B8 W- U$ d+ I8 J: k; N% k
- /****************
. w" g( w' L% k3 r1 R - * 打开A20门 *
8 V5 q( H8 G9 p - ****************/& j& H- R% m- D: m
- void openA20(void)
3 }9 o- f' e8 w, _3 A( s - {+ E! y2 {5 x& s
- asm{
2 O5 ?, u# v# O0 E. ^3 o5 ^' \ - pusha5 l; g2 o# O6 j0 }. q9 V
- in al, 92H
: q4 |7 K5 F6 `/ N - or al, 0x02
1 R7 Y) S0 j. n$ D+ l. l& U - out 0x92, al
3 B. o2 u% B: Z2 K* [/ f9 J7 } - out 0xed, al
+ F/ l( u: K. ]# w2 @ - popa
3 q- R7 [* a; v, |: V$ g7 m# F5 @ - }. \/ u( i! ?( I* t d' k Y2 B
- }
, t, q+ g) v3 z/ n L n/ Z& a2 o - 0 j1 ~9 ]6 ^) v8 S
- /***********************************************( ]/ Z5 j" _2 J+ ~5 a: A
- * 函数功能:进入DOS4G *6 K6 z# F" R. C6 |$ i2 T2 a0 t
- * ==================== *0 |/ m0 E+ w- C% n" E7 G
- * *
8 Y% s! C: B8 U! W& S2 d! K - * GDT描述符界限计算方式:描述符个数*8-1 *
+ Q6 K/ R) ` [" ` \3 h9 g' a# c - * 如: *; I$ g; | n' C5 C7 F X& e- l' F
- * mov word ptr GDT_Addr[0], (2*8-1); *
' p f0 `# F4 O - * 表示为 2个GTD *
* @& I8 \, i: ?4 T" z( \0 ? - * *
; O$ P" _; L6 ~! y$ A - * 选择子为所在描述符内的字节偏移。 *) H: k$ @; j' v/ W* V1 s0 m
- * *
U0 v3 R+ T' a& r0 Z& E - ***********************************************/9 ]# R0 o1 B# N
- void set4gb(void): r; V0 s7 @: d% m9 Q* l
- {" M" z2 w. Q+ z* H
- asm{
2 [9 K2 o! E$ I9 t6 | - cli
5 c2 z4 ]* \) \( O# i - /****************************************% G1 N- h V) ~0 C9 y" K
- * GDTR寄存器 *
' u1 _1 v( q& K2 N0 g W5 O/ a - * +-------------------------------+ *
9 C' `/ N) X0 _1 W2 r - * | 32bit基地址 |16bit界限| *0 m, M5 T. r4 o* V
- * +-------------------------------+ *
1 P4 ]+ ~* v0 r' P7 W4 c0 k - *****************************************/& s' x1 P* v# a, _( g/ ^# B0 T. T
- /*********************$ n7 {+ `3 Z) q! |2 p
- * 得出段界限 *
! g7 @# t( ]9 k* J4 x' _4 } - *********************/4 f* i! G4 [, }6 ?5 l
- mov word ptr GDT_Addr[0], (2*8-1);( q7 _( F5 w' i6 r9 L$ {# \, k
- /********************************************1 w E8 o! L, n! z& }+ g
- * 计算GDT表的32位基地址,存入GDTR ** ^) Q" I2 c, T( `
- ********************************************/9 c( ]* L5 ^& l z
- mov eax, ds0 ?1 V) Q; E4 D
- shl eax, 4. v& S: B& U) m9 ^3 C v" @
- xor ebx, ebx
5 t7 H1 O/ G S& U4 M/ q" z - mov bx, offset GDT_def: J3 l5 {/ c7 h! d
- add eax, ebx
$ ~- s( F. f d R% @- |; u3 m - mov dword ptr GDT_Addr[2], eax/ _, ~" d! W4 B: {& J6 g
- lgdt fword ptr GDT_Addr" l3 r" V: n9 C; T2 S
- /********************
6 V9 h& X" T& M) v - * 选择子偏移 *4 U& `+ h- P" X: d2 Z! F, X
- ********************/, ^% g; W- y& r T. B6 _
- mov bx, 8
1 {- u( D, j U; d5 V - mov eax, cr0
8 g. o" D9 M% s( d; w - or al, 1( s. v, T6 e: [- C; ]+ h
- /**********************( Z T. R9 y, @3 K
- * 进入保护模式 *, y! Y5 a9 \! ]3 y! c8 o9 q( l
- **********************/
5 D& C: u* o# t) n - mov cr0, eax9 h: z' a" C0 F7 q9 {1 \' r
- jmp pMod' v' {0 Z+ D6 T( p2 m8 S3 l
- }
# r! U# p" f" w$ W8 ]6 v1 \
: i, c2 `' J/ M [, q2 j- pMod: asm{5 C. K9 d+ A) a3 S' Z6 D
- /************************************************************" ]. {# q; y+ e: `, X+ X e
- * 让fs与gs加载选择子,使其能访问 0xFFFFF * 4K (4GB) 空间 *
: ?8 `; x2 S" o9 e - ************************************************************/' a( R2 D& D. f* V7 O' P
- mov fs, bx
6 ^ Q' }7 o9 Q0 ?3 b - mov gs, bx D5 ?7 Q$ ]" @: S, D
- and al, 0x0FE
, H6 N3 y- D& ?6 x; ? - /******************9 F7 J9 P' S% K0 x
- * 进入实模式 *' \8 [5 `0 R- S3 R5 X
- ******************/
7 I# K0 d. Q1 v; B: t - mov cr0, eax. i8 B1 _. f8 j! ]+ A. J2 w6 `- W/ y# Q: x
- jmp rMod; h9 i" M) J& ~9 W1 k4 m% J
- }( R' {9 H+ W4 t
- $ A+ }% G8 D, j1 j
- rMod: asm{5 l* R. \- K( W. g' K
- /* ******************************************************************1 `: A9 I# u. j5 Z4 W: j* a
- * 退出,fs、gs清0,访问系统内存可用: gs[32位,相对于0的偏移地址] *
: i0 h( `1 K0 d+ u/ \( k3 c1 p+ b - ********************************************************************/
" a3 }" E2 n2 F5 _ - mov ax, 0
* U$ q r9 h8 h* H! s - mov fs, ax, Q c" t$ [0 L
- mov gs, ax
. l6 z, Y' J4 n6 `( c0 T - sti+ c; [! _# J5 i7 \4 Z
- }, o4 L+ O2 m, H/ e: i Q6 R( |$ M
- }
复制代码 这是asm的- ;/********************************************************************% e5 q. d F$ @6 `$ A. E
- ;* File: DOS4G.asm *+ }! l+ a" g9 g6 @: B4 e. V
- ;* Compile with masm ( Editor: Tab size = 4 ) *
& e6 x! u1 _. a9 o% Q - ;* *
0 d5 c2 o' s5 r+ A$ U, D4 e' f - ;* ========================Title=============================== *
& A4 H& o0 I4 v( b g% Z4 ?1 o - ;* 这个demo是让系统进入DOS 4G模式,进行数据访问 *
" }6 f& _) e4 P, I9 p& t - ;* *
/ E+ F* ?- _% d G) N) z - ;* ===========================History========================== */ ]4 P1 C; X) ?9 i
- ;* author: bini *
1 A1 K6 o+ z! o: I a - ;* date: 2008-10-08 Frist version. *
* s: N k2 \2 f( U( _6 G - ;********************************************************************/ 0 q+ m7 I8 v$ [9 j p# o& d
- .model small
2 m- M* w7 o% h' Y - .586p! N |; J5 f2 l& B
- % A/ ~4 R; h( ~% s/ O
- DSEG SEGMENT USE16 ;16位数据段
; c, t8 p" o* \. q. w - ! W# _/ R$ W' s' X) F
- DESC STRUC# [) h, u! W" d: b6 I0 ^' E( N; e
- LimitL DW 0 ;段界限(BIT0-15)
8 i9 y- K0 K5 L. F' F) N/ X7 t - BaseL DW 0 ;段基地址(BIT0-15)
1 P* j9 i7 Q: }' C2 I; t; r5 Y - BaseM DB 0 ;段基地址(BIT16-23)
* Y+ U" Z/ [" Q/ y6 r - Attributes DB 0 ;段属性" o4 A6 [/ i! J5 ] l
- LimitH DB 0 ;段界限(BIT16-19)(含段属性的高4位)6 o# o1 d# t. }) Z4 ]; n
- BaseH DB 0 ;段基地址(BIT24-31)" [$ O* R/ P- O' l& r; e }: y
- DESC ENDS
5 Z ?& x3 o7 f6 K6 @8 [* E0 {2 x% o
8 F) P7 Q! V7 q& V% M8 P- PDesc STRUC _3 e3 `( J" Q3 ]; c+ R, P
- Limit DW 0 ;16位界限
4 O/ K; m! [/ L+ m0 d# v7 U - Base DD 0 ;32位基地址 ~2 O( Q$ c2 Y: e, S3 E
- PDesc ENDS+ E+ B: G( ` Z
, ~. J8 c5 f) u2 E' x4 n% ]3 ~- GDT_def Label Fword
/ H$ }- i2 J4 A% o, M- Q - Null_Desc DESC < 0h, 0h, 00h, 00h, 000h, 0>
/ Y4 w+ Y: o& d - Data_Desc DESC < 0FFFFh, 0h, 00h, 92h, 08Fh, 0>
# @3 S) C8 w& V9 U5 x0 D6 W R& J - 3 n& {( s, L* D0 F' [4 ~( h
- GDT_Addr PDesc <$-GDT_def-1, >
; k7 p4 n! w: W& B. N! [ - DSEG ENDS ;数据段定义结束8 m2 @# l/ s5 q# G: }
- / @4 c6 F* f. u+ ]
- CSEG SEGMENT USE16 ;16位代码段
+ l3 B" k0 f% x/ U. b D# G% a - ASSUME CS:CSEG,DS:DSEG
& m* T, g' J" d) ^( y' l- r - .Startup
) k1 V$ |9 p5 H( t - call Set4gb5 k5 e0 G/ O& Q! z7 X, k
- ;
2 Q# g; P/ q" a" r1 L8 U! G - ; fs, gs即能访问4GB空间! N7 ]/ z! W) Z% g" q
- ; write your code in here.4 z! k# h- ]3 e- @9 o1 A9 Q: v
- ;6 Q) ?0 _- b( s; B+ y, U' K
- .exit
& D4 n2 Z ]: _2 X# u -
9 ~. l+ A' r9 J. { - Set4gb PROC NEAR p2 o/ ]" X) a. K* O2 c
- in al, 92h
3 b! u' J* K0 M4 P6 {- F: W7 C - or al, 0023 o; l X/ q" V+ R9 i
- out 092h, al
1 s8 b/ z: S- x( ~( K) L% X9 Q - out 0edh, al9 F/ @1 H& l9 r; z+ T& H6 D5 O
; D* D& |9 [1 ~, r# R' u8 M- cli. W8 t* A7 k0 P/ P
, x' Q' n8 y8 v& r$ o* h S- ; mov word ptr GDT_Addr, (2*8-1);
) ^ t' S5 W) [0 O
# t" W8 g% b X9 U4 b% K0 g' Q- mov eax, ds, G/ k8 W( i8 ^$ Q* \# ]" l
- shl eax, 45 s( M2 P+ ^ c$ M) S
- xor ebx, ebx4 e2 C# D; b2 x1 _% @2 j
- mov bx, offset GDT_def
3 k( i, l* c$ x - add eax, ebx
& `2 s% Z2 g. j - mov dword ptr GDT_Addr.Base, eax( P7 i' |8 L: {# y+ X3 X5 C1 x
- lgdt fword ptr GDT_Addr7 K" B* q H6 \4 }, |. C5 ^3 L
- N& a+ i) L( _( u: z: L9 }: s9 e
- mov bx, 8- n5 U( l* Z/ S
- mov eax, cr0
8 M4 @$ k4 [3 _ - or al, 1
1 l+ s7 `' t% `3 c' g$ S8 m - mov cr0, eax2 p1 L9 v+ }" g5 s% v
2 J0 v- X+ E/ v! e% M x- jmp pMod0 Y6 L* k/ V9 I6 l* l. j& ?5 O# ^4 }
- pMod:
$ ?) f. s. o9 U3 G% c+ t `% k
. f/ l, T/ t+ {2 k7 F3 h- mov fs, bx
1 X& c( d% ?1 b1 P2 A1 S/ X' w - mov gs, bx1 p; j$ z/ J9 U- @7 F. J5 e
- and al, 0FEh
$ H: e1 U' B0 u$ }/ \ x' P - mov cr0, eax, r; z, f: U0 q9 j6 j
-
0 k6 s5 n u# Q, H" |/ r4 k - jmp rMod3 K1 }+ R6 D# [! }' D
- rMod:, m( V8 `2 T* V l7 x1 Z
. v1 w) v' Q& F. b! H8 l+ I$ g- mov ax, 0% \% U( ~8 j" R) J
- mov fs, ax. w2 g. F T+ N6 f) h+ J F6 C
- mov gs, ax+ w; w7 f( b8 |& |0 u& w
- . ?+ M9 K! j8 B3 K1 o7 J, v
- ; 在2M的位置测试写一下数据
# L& ?; ?& i. V - mov esi, 200000h7 V6 q0 I$ Y1 m W- O
- mov dword ptr fs:[esi], 055aa55aah
& f7 Y# m" J& v* E, G/ }# e8 \ F0 r - ; 用RU去看看200000h的位置是否是此数据....6 P0 {4 k- e# W, U1 k
- ; Z) ]2 h+ x' F, [" f4 v2 t
- sti
& b# d5 K; K; N5 t, ]& M5 b - ret
+ U4 S- T& m, A4 R) I9 Y# s - Set4gb ENDP8 u! ]7 q' ? B6 a
-
5 Y. i( W C# D. P - CSEG ENDS ;代码段定义结束; K/ D/ Y% w3 {3 ~6 T1 a
- end
复制代码 |
|