|
|
刚学习的同学,有些还不会,我这里贴点C和asm的代码。只供参考。( j- R4 C$ d% x/ l0 O$ S. X0 E
1 K* J% z' J* N2 s/ {: o这是C的- /********************************************************************# w, K3 U7 z5 C
- * File: DOS4G.H *
0 ?3 r% r& g- C1 g& E( {) x - * Compile with BC 3.1 ( Editor: Tab size = 4 ) *
% _- N, U x4 s( x4 {. P - * *
- w% }$ }' w0 y, `8 V* d. | - * ========================Title=============================== *
% D* \- p6 V0 C$ ~" { - * 这个函数是让系统进入DOS 4G模式 *
) n% x' M' c; r3 N5 Y3 j - * 程序参考了:陈家琪《DOS实方式下直接访问4GB》 *2 H9 i0 n9 l4 p R
- * *
: k8 E* d5 f' Y ? - * 使用: openA20(); set4gb(); *7 Z% b, f5 }/ I3 F) U4 I
- * *! L& o/ i) v/ K5 K7 `& u
- * ===========================History========================== *1 j1 ~& T$ H. O" O- N/ g8 N
- * author: bini *. N5 |7 h2 {: L) F
- * date: 2004-11-30 Frist version. *0 c7 m+ [+ O0 [! n8 U
- ********************************************************************/
4 Z+ J" q/ `) |* v3 j" A/ G - # @8 q% }! k# z( t/ P
- #include <conio.h>$ V, y" _( G8 b: c3 o6 b
- #pragma inline' S$ s6 B2 `; V3 c
3 \8 `, ^3 x; G- /***********************************************) M0 X5 M4 O! {5 s, v! G, Q9 _
- * 两个GDT,第一个为系统使用,不管,默认为0 *
0 o2 ~1 y, J; u! E( ^1 K- F. v - * 第二个为一个数据段,没有代码段。 *
3 u2 L3 ^4 I" R }9 A% ] - ***********************************************/
3 i6 \0 ^0 N( ~8 R - unsigned long GDT_def[ ]={0,0, /*系统使用*/9 U2 N6 h8 h9 e0 f2 h/ z2 t& o1 H2 U2 K
- 0x0000FFFF, /* hi16bit( 0~15 ) is base low=0, % R, B4 R& p: C* K2 @
- low16bit( 0~15 ) is limit low=0xFFFF
# _) \6 X4 k% k) \' f - */
: r* {0 G D# m* s9 I* T' Y& X! o - 0x008F9200};/* 最低字节为 base( bit 16~23 )
9 l: H9 ~2 a; @$ A2 [- e - 最高字节为 base( bit 24~31 )2 a6 K i( V* m2 d/ W+ x
-
4 R3 W( P) O) a9 g - 属性Attrib = 0x8F92* O0 r! W9 e6 W8 y& q
- . e3 v H4 ^% R) V5 o9 B3 v/ L
- 属性位Hibyte低四位为
! H( g* P3 \4 u5 ?/ k( E - Limit( 16~19 )=F# g% ?4 K/ l) y7 e1 _- Z( V
- 属性位Hibyte bit7 为粒度, d# e( r* `: f. z s9 A( N P, }' W
- (值1=4KB粒度)/ A* O5 ]% F" `$ L2 B
- 8F & 0x80 = 1# g) M. ], S- S; L. K
- ' l1 Q1 C; B1 J7 Y1 T
- 属性位Lowbyte低四位为段类型,值=2
$ ?/ Y" W% K& | - 表示为可读/写段
3 e$ x$ Q1 `/ {$ e3 s8 Q - 属性位Hibyte高四位=9,bit3=1表示:
) G( } Q; N8 b" t# Q! K$ ~ - 描述符对地址转换是有效的。
& @' j" W% f3 L3 C8 g: L - bit0=1表示为:7 e' _7 ^6 e- C8 o
- 系统段描述符。而不是门描述符。
a$ K8 t4 d r0 `& v$ r% E7 Q, ? - - p6 Z6 l& s- F* ]6 K
- */
; I8 }( R, n n. x7 x
3 Z" d* F: h a' q) `: ~1 E; M- /****************************************
2 ?4 Z; Q: d) i/ Z! }" ? - * GDTR寄存器, 48bit=6bytes ** h D4 W" ]8 Z {! [' [
- * +-------------------------------+ *1 S' W7 X" r Q% C# f% ^5 l* y# y
- * | 32bit基地址 |16bit界限| *: O& C5 t f$ X
- * +-------------------------------+ *
5 i" h& U$ J/ }9 h - ****************************************/. _ A/ x! d2 i* V9 n. [' E4 F8 a
- unsigned char GDT_Addr[6]={0};
+ Q5 W4 ~% E( O; X2 z5 o
5 d4 J4 z/ P* A- /****************
9 H8 @% E' m1 P7 q - * 打开A20门 *# E/ l E. P; p5 c* n- k6 \# t
- ****************/
1 G- P; M+ i( t5 j6 D% ] - void openA20(void)
% r8 M% |7 W5 \, {) ?9 ]8 @ - {' o) t& b7 m5 K& t, t/ X1 K/ t1 T
- asm{
1 T& }; A. Q% I. ^/ ^7 { - pusha
; q7 \) P- D3 T- L% M9 h. | - in al, 92H
* H: B) I( @& n0 I) v# B - or al, 0x02
" m% w3 l! I: ^2 |$ o( y$ v - out 0x92, al+ P, I, n: I( T( O: b
- out 0xed, al! x9 L- O5 x6 R8 ~* \8 B3 D
- popa
% \1 Y9 n% S9 s2 ~( H" \ - }! l6 r$ B0 }' m0 N9 L6 e8 }
- }& x8 ]5 O/ Z" [# y0 a! F
- + c3 ]& q& s3 M
- /***********************************************6 D6 n: ?- U9 m6 S. R V
- * 函数功能:进入DOS4G *% c& _0 ?) R% Y8 `! t( O6 \6 n
- * ==================== *
$ \- D3 @' \; R& h1 N% X - * *
2 o- T+ q1 E# [0 I* Z0 p - * GDT描述符界限计算方式:描述符个数*8-1 *# J, j, Q- {& K& Q( ~
- * 如: *# X4 n* B. Z! Q1 b$ q
- * mov word ptr GDT_Addr[0], (2*8-1); *5 y( j1 F( n9 F1 A8 C3 g0 m+ \# O
- * 表示为 2个GTD *. D: D" U9 [# V2 e
- * *2 A+ F3 i& G& r/ B3 D
- * 选择子为所在描述符内的字节偏移。 *
8 r$ r2 E1 W6 U& S0 L - * *7 e% H0 g) U+ D, A& b# b
- ***********************************************/: ~' x5 R, z8 E7 r* ?4 \" ~& ^
- void set4gb(void): d% f0 m0 Y6 ?5 Z& u% E; i
- {
6 F2 J M2 U/ D. o - asm{
6 M% I! V# r( p8 t* a* \( ]4 [( z# Q - cli# w" |; \( U3 ]/ }5 j
- /****************************************, {8 r1 V: i2 A5 H' E0 B d# x
- * GDTR寄存器 *
- G, i) ~& ^$ \3 L7 z7 }- m - * +-------------------------------+ *
! m8 W1 ]! y/ t, p$ x - * | 32bit基地址 |16bit界限| *- v7 H# ?% ]' G3 q& K
- * +-------------------------------+ *
6 u1 F7 U9 [7 {3 t - *****************************************/$ n( {7 o" L& e1 h, T8 r
- /*********************9 s9 y. i2 U8 E
- * 得出段界限 *
4 a1 Y# N6 `% I/ R5 @- Y+ A* L - *********************/
- n! b* _; X0 e% X5 } - mov word ptr GDT_Addr[0], (2*8-1);* T% @9 T1 P; y" h4 G
- /********************************************; ]5 b4 O* i! n/ n
- * 计算GDT表的32位基地址,存入GDTR *
/ R2 Q+ T. b* Q% l% T" _9 e - ********************************************/- I7 P# P& Q9 C2 x! w3 f- f
- mov eax, ds
* J$ ~2 n$ J8 b |$ J! T; R - shl eax, 42 p; f$ H5 t, L9 [! V0 V
- xor ebx, ebx
! ~6 ^: c+ a: o: @2 H% N1 M - mov bx, offset GDT_def
8 Y3 _1 }$ X& p9 s$ t q: C - add eax, ebx
7 l; j% V1 A9 S - mov dword ptr GDT_Addr[2], eax
4 i$ \; c" ~/ M: J2 ~" m. q, B! x - lgdt fword ptr GDT_Addr' R5 ?7 Z0 O: V( a' J4 d; R
- /********************4 g8 L' M" {% a: D1 i2 B% u
- * 选择子偏移 *
% [7 j! S$ x) G/ q8 ? - ********************/
! C3 m; @) M9 D. Y/ S; J - mov bx, 8' c6 J( O2 z' O# a, b- z0 J
- mov eax, cr0& t" w% n k8 }: C% T X
- or al, 18 }! U; G& R( h7 B9 E
- /**********************2 Z& B# m2 v2 r# w
- * 进入保护模式 *4 |4 n$ N i, Q# S: p' A$ @
- **********************/8 {( E5 ^5 b7 l; q' n
- mov cr0, eax. @7 Z0 a! M" m: Z! p# A3 Y
- jmp pMod- q m7 y h$ V5 p$ @
- }+ D+ A/ c. R2 u* z
- + c9 R8 f2 n* r, i+ H" D5 I7 M
- pMod: asm{
: T! k5 {' W7 f - /************************************************************
7 w' x& Q4 c9 f/ G- D/ @0 h - * 让fs与gs加载选择子,使其能访问 0xFFFFF * 4K (4GB) 空间 *7 r( i5 A5 W7 Z: W' G- Z- ~
- ************************************************************/* h, x. W( V8 L0 {; y. m6 I0 Q; b
- mov fs, bx
( ]1 g4 H l3 p7 V - mov gs, bx( I1 F& p3 q- N2 {7 j1 K9 E
- and al, 0x0FE/ h, W' a" Y/ K* J% Y2 n
- /******************
- I7 X! k: z3 i - * 进入实模式 *
. A5 S- u* U( h/ i - ******************/0 n: s) z2 y1 H
- mov cr0, eax
( j4 m9 b/ P! C. d" u - jmp rMod
% T0 s2 i3 X; K4 m( g - }' x! r! ^( E# A& n% U' Z2 s) S
/ e1 I% B3 j- T5 w a$ G- rMod: asm{
* N) [( p4 @) n1 e) e - /* ******************************************************************( d8 n f& E3 H {9 ~2 Z
- * 退出,fs、gs清0,访问系统内存可用: gs[32位,相对于0的偏移地址] *& d7 n: ]3 r! a) t/ f% |
- ********************************************************************/4 G' `1 i* p& v) V0 `8 r+ `4 w
- mov ax, 0
! G6 |& A" I: R0 T4 W% P - mov fs, ax# i" |7 n- A$ y2 y4 B' P
- mov gs, ax
. i4 S7 }9 ?) L# o& E - sti; }# d- G* n( j( e- w" D5 @
- }
& Y$ V0 X- j0 k g - }
复制代码 这是asm的- ;/********************************************************************2 C+ w( l6 C9 z6 [
- ;* File: DOS4G.asm *, ^- O2 J$ u& u
- ;* Compile with masm ( Editor: Tab size = 4 ) *& H! W+ p: z( G8 x$ b: `
- ;* *
& t @0 |1 _* Z( @& Z% T - ;* ========================Title=============================== *, a1 s, h i! }8 W& _3 ?9 p
- ;* 这个demo是让系统进入DOS 4G模式,进行数据访问 *
' A# y0 h1 w, m; d+ }' n7 c: I1 y - ;* *. Q, m- j8 [# B- w. g A
- ;* ===========================History========================== *
8 `" m$ |6 n. T; g) L, a' k - ;* author: bini *$ G. f* j4 w; P' F/ z8 j; l! |
- ;* date: 2008-10-08 Frist version. *9 P* x- P0 `1 i
- ;********************************************************************/
% u4 `; K3 t* s3 i Y, X4 y: n6 ` - .model small! r6 U$ q4 h0 D+ I
- .586p l' z8 h/ z+ R) R9 ?3 m! d
-
! c3 x5 ^. P0 Q8 X' h. k - DSEG SEGMENT USE16 ;16位数据段1 f! [$ a+ }7 B# [
1 }( l8 |! r9 @$ q4 F( N' X- DESC STRUC
+ D+ {4 j( T' y) `, m - LimitL DW 0 ;段界限(BIT0-15)# ]3 s: y- M- ^9 j( e" s
- BaseL DW 0 ;段基地址(BIT0-15)
9 B5 X, L' Z( L% {/ V" v; ~ - BaseM DB 0 ;段基地址(BIT16-23)
6 n- m8 l" F' F( N - Attributes DB 0 ;段属性
. t+ W/ H/ V9 a9 F/ N& N - LimitH DB 0 ;段界限(BIT16-19)(含段属性的高4位)4 b, T1 u) b' s
- BaseH DB 0 ;段基地址(BIT24-31)" k d) O! v( J; ?# @
- DESC ENDS( G# ]3 ^) |$ w0 L+ f6 L$ f9 ~) K% ?
- 2 z2 d7 v4 L: V6 g; e! M5 X' w! V5 H4 z' A
- PDesc STRUC
6 J B- {/ {: A6 M8 a1 [% A - Limit DW 0 ;16位界限
- B+ {$ z- Z9 i& F - Base DD 0 ;32位基地址- E' {8 w/ s- |/ j
- PDesc ENDS8 _1 u7 E1 O! @' Z& q
- \" y" V# F/ Z, }; b8 X
- GDT_def Label Fword
4 q5 _$ j* [0 K9 b5 c+ [, h i - Null_Desc DESC < 0h, 0h, 00h, 00h, 000h, 0>8 q" P6 [' N7 T9 } w6 R
- Data_Desc DESC < 0FFFFh, 0h, 00h, 92h, 08Fh, 0>2 o' h& _* Z, z1 Z1 T9 a% q2 m
- ! P8 a$ j I( b! J$ `6 m
- GDT_Addr PDesc <$-GDT_def-1, >5 E6 o1 D# B0 S
- DSEG ENDS ;数据段定义结束
3 v( i; _" {4 `) d* F0 p% x m - - a+ U: p- y, X% v- e
- CSEG SEGMENT USE16 ;16位代码段: f. N0 Z& |3 ^4 L
- ASSUME CS:CSEG,DS:DSEG: ~8 W, O8 e, m7 E) {
- .Startup2 P* J- i# x7 S0 b4 |. E* H
- call Set4gb) G3 ^! c/ _& c7 s! f
- ;
% |3 k4 T! i! c0 a7 t - ; fs, gs即能访问4GB空间
$ f- O! Z. p8 y! Y+ I7 P" g8 S p - ; write your code in here.
% X1 O9 g* W$ y - ;
( x+ k; v, g9 D/ u6 _+ O+ L1 S0 W/ v - .exit
+ c% t: o( n* R0 e/ c0 U9 j - + g% s/ w/ w4 `
- Set4gb PROC NEAR
$ @! M( J7 H, M7 T/ ] - in al, 92h
& x. k; \1 i' P1 N: z - or al, 0027 u% l6 l" `0 g
- out 092h, al, y7 f9 @9 ^7 }* b# [/ ?
- out 0edh, al! q& N4 e* G6 n
& f4 Y1 Z2 t* D( @4 U- cli
# L, z" `1 l& I {* ^5 z
( T; f! y: j$ u. M+ u) ~- ; mov word ptr GDT_Addr, (2*8-1);% W9 X0 w3 R! X. F5 M, _
- $ m7 t" ~ |5 r: |2 E
- mov eax, ds' E$ q N7 W: h. _3 X! O- Y1 V
- shl eax, 48 s( J+ V2 D" i& \; ]
- xor ebx, ebx
4 {( Q& A) W0 l* b1 V0 g. v( W* E0 v% D - mov bx, offset GDT_def
1 T: ~ D. h( E - add eax, ebx
- S$ f1 C8 y. H' N, D3 }4 z - mov dword ptr GDT_Addr.Base, eax% I, U7 U. l! l4 G! O7 ?
- lgdt fword ptr GDT_Addr' f- R0 D7 }' m- x/ X( D J
- . A+ |8 P/ y# d4 x5 u, v, V- a8 n1 s
- mov bx, 8' [6 N P% a1 ~( M- p. k
- mov eax, cr0( S1 x! @/ R; X6 T
- or al, 1
' ?1 q4 J/ E: H2 ^ - mov cr0, eax( [! z2 ?( h. R' J6 w
- & ^% O) ?+ X# K2 c5 o
- jmp pMod
, `5 W3 @+ X8 l- O2 H/ W- W - pMod:
0 X/ u/ S( j- E; h5 W+ F
" T; l$ T8 `' B3 e2 u* L% f- mov fs, bx$ j: {' d: r' b% @) V1 u4 R3 j8 c1 I
- mov gs, bx& c) `3 y* t! [1 I0 s! X
- and al, 0FEh* k: w, o( W, ?( ~: J: H
- mov cr0, eax
$ b. f- v; L1 o -
/ P- L7 s3 v ~- Z - jmp rMod& n, ]0 E D, h# L& X
- rMod:
+ O9 G$ w, a8 m" p - 2 l9 |. x+ L& o L) M+ @! X
- mov ax, 0+ L: Z* X/ f5 d6 d* Z( g
- mov fs, ax
( {1 O1 }1 m3 F) } - mov gs, ax' o8 f# F/ [( K. P9 J
- / R7 E3 A( P6 W+ z& ]6 I
- ; 在2M的位置测试写一下数据 J- U, u# L, E7 c: A
- mov esi, 200000h
# N0 P p# P$ N9 a6 o1 | - mov dword ptr fs:[esi], 055aa55aah
/ H' o( F' _# a% m4 G( h - ; 用RU去看看200000h的位置是否是此数据....5 M, }8 i( e) V7 H, {
- $ b. @ {0 k" Z6 d
- sti
7 J1 o7 X' @; q( w - ret
/ W: T/ T3 [. g- Y6 r* J P8 T5 \ - Set4gb ENDP. b1 n+ b" `% n4 o6 A$ W4 l; u
- / A, o6 g0 D! T! y& W1 P6 ?
- CSEG ENDS ;代码段定义结束' M/ {. p6 g* V6 O, A. P/ @! N7 \
- end
复制代码 |
|