|
|
刚学习的同学,有些还不会,我这里贴点C和asm的代码。只供参考。: R8 }% P6 q5 H: z
# O- T3 c* Y! D, t/ O
这是C的- /********************************************************************3 m- o3 f' ]( A7 h
- * File: DOS4G.H ** C9 N2 C9 h: [& {# o
- * Compile with BC 3.1 ( Editor: Tab size = 4 ) */ U8 i/ a- h' ?% k4 h }$ t
- * *
% T( o! W( f8 N - * ========================Title=============================== *1 J* m* n! ^; |) q& ~6 o, B, i
- * 这个函数是让系统进入DOS 4G模式 *0 r5 S, `- m) T0 f. Y( i9 K
- * 程序参考了:陈家琪《DOS实方式下直接访问4GB》 *
, }+ K$ C+ [: `+ @ - * */ @, C6 f4 ~2 R
- * 使用: openA20(); set4gb(); *
" Z% i( j. }- ^4 S D1 t - * *
- q9 {/ F5 {8 y) r - * ===========================History========================== *
. j: w: e* u- B+ ~7 k - * author: bini * l, X# Q5 u. M3 U) Q
- * date: 2004-11-30 Frist version. *( D" j: v7 }4 U& r+ M
- ********************************************************************/
8 |8 ?9 Q' w9 X
, ^$ v, k F' u8 a( P9 V4 y- #include <conio.h># K8 k; L) K4 }9 @
- #pragma inline% G+ \$ t2 K5 [+ u$ D
) K" C. _4 j! s% u& U% J- /***********************************************% }! H- Y% Z) g2 b
- * 两个GDT,第一个为系统使用,不管,默认为0 *
0 X3 p6 H' [& C' a2 k0 a0 e. } - * 第二个为一个数据段,没有代码段。 *0 W; v) L" Z+ U# }9 J' D
- ***********************************************/
& s% x2 }$ i+ q7 K! G0 v0 I* x8 q - unsigned long GDT_def[ ]={0,0, /*系统使用*// K. n( C+ r/ h
- 0x0000FFFF, /* hi16bit( 0~15 ) is base low=0, h2 \7 _% Q9 u. y3 `# e: g' i* P# b
- low16bit( 0~15 ) is limit low=0xFFFF & t2 Y1 L7 M# W; a" l$ A
- */
) g& G2 p C% m9 Q - 0x008F9200};/* 最低字节为 base( bit 16~23 )
, d3 z6 }0 v8 e- m' ?4 }$ p1 h - 最高字节为 base( bit 24~31 )7 J% K6 X7 e" h8 P! F
-
4 c$ J& {4 g! ^+ c4 W& b - 属性Attrib = 0x8F92' L8 B* p% j: T' k( b+ N9 S
-
9 j0 J( s# |, r h9 Y. k+ R/ W - 属性位Hibyte低四位为 9 ]. |+ D& b4 G' X# k% E
- Limit( 16~19 )=F
; ?& n+ Z. ?8 j3 T' G - 属性位Hibyte bit7 为粒度5 p7 F9 ]& B: E: w1 L7 j0 z
- (值1=4KB粒度)& @2 z- y* W2 i. @* Y
- 8F & 0x80 = 1! z7 K% G7 J, z* ]
-
$ O8 m' o$ R& k6 o+ ] - 属性位Lowbyte低四位为段类型,值=24 Y: q' t% r* p( b p
- 表示为可读/写段
( F2 O) w$ ]3 i6 B6 r - 属性位Hibyte高四位=9,bit3=1表示:6 C+ T+ W+ B2 n' R( m+ `, Z
- 描述符对地址转换是有效的。& H: m: Z: j" U( A1 L. K! q+ r
- bit0=1表示为:6 Z" h# h, w# i$ Q" k% P
- 系统段描述符。而不是门描述符。4 Z# A$ R. N& G( N. S7 M- J
- & _+ r% P4 b# Q" e
- */6 J0 V2 F1 z3 t" @
- 4 G! g5 ?5 q D: {7 I; q; U
- /****************************************
4 Z, i) E* ^# I2 U# w - * GDTR寄存器, 48bit=6bytes *
$ Z" H& s6 e/ @% i3 \ - * +-------------------------------+ *
: l" R5 ^3 w9 v. T, R - * | 32bit基地址 |16bit界限| *4 r- b4 t0 F R4 ]# g' {& N6 O3 N
- * +-------------------------------+ *
$ K3 K' r3 N' ?) @) [, c - ****************************************/
* v2 `$ v- r; d; N5 j - unsigned char GDT_Addr[6]={0};* A; I. |! O. I
- . p# e) V% L7 J/ _& A
- /****************1 |! F% R/ i, M4 |4 n
- * 打开A20门 *+ E$ K+ [& k1 f( W6 [6 C, F
- ****************/1 c$ [2 ?7 X4 x% M+ G
- void openA20(void)
: {8 f, Z/ h# r& O) S/ o" G - {
$ C0 a/ @8 a" k0 m e% H+ @ - asm{
Y( b3 W6 |: H7 z - pusha
9 w. L7 X/ z1 n( s# j' } - in al, 92H
7 r! e* B0 @4 \# V- _7 [9 z - or al, 0x02
, \( ?6 a1 [. ]4 d - out 0x92, al
: F# ~' z- p3 n7 N: W4 h% q7 d2 [0 p - out 0xed, al) u5 X6 p( ]* u5 k* K$ a, x, J
- popa, w2 t& }& ?) g+ ], x
- }
$ s4 j. g8 W" \% c - }
2 E: i# O+ U) h/ Z - ; p* Z1 U9 J9 b. E
- /***********************************************& A* z+ l9 e/ A0 H8 Y
- * 函数功能:进入DOS4G *
" s7 x, K2 Y0 a& s4 @8 G+ b - * ==================== *
; K8 X9 {# J" o' D7 q - * *
! ~7 c9 Z) _4 ~" ~ - * GDT描述符界限计算方式:描述符个数*8-1 *
: G ^# o& \- V2 a# k( G3 R - * 如: *& |( v+ P% g* H/ S9 Q5 |" l: C; f
- * mov word ptr GDT_Addr[0], (2*8-1); *
4 D" \, }& }9 D. y - * 表示为 2个GTD *
: J" x8 D3 y- w) J: R - * *" x4 Y1 B- g5 X' ]- N0 t
- * 选择子为所在描述符内的字节偏移。 *2 _8 M, E. W/ O1 x& I
- * *2 b( V: \7 {2 x6 z
- ***********************************************/: T! ~; W* A# X+ K9 p8 m1 V
- void set4gb(void)' n4 E, q) P/ C7 }1 X" n
- {
9 I8 A- ~+ P, n) q+ r - asm{
/ h: P- Z, m% ]1 T - cli, Q: V, g7 x5 |- r% g
- /****************************************) ?) }1 c k G
- * GDTR寄存器 *
7 c( q& i& j. O" r- v; f4 q - * +-------------------------------+ *
/ r6 l& \7 X- I, E5 @ N - * | 32bit基地址 |16bit界限| *
1 a% k0 o' @" W6 k" s- ^ - * +-------------------------------+ *
2 I x2 w; t. Z: ~ - *****************************************/) X7 O' Z2 _4 r* c H/ t6 v. A
- /*********************
M: E. W5 ~: h, X& ~1 H - * 得出段界限 *
+ c# d2 `/ ?# V5 Z9 q, }* [+ w: w - *********************/" W& o& Q' m z. F
- mov word ptr GDT_Addr[0], (2*8-1);
' A# j: |5 ?7 W# _0 t - /********************************************) m+ d; ^: e/ t4 P
- * 计算GDT表的32位基地址,存入GDTR *% G+ [1 t6 @3 t D$ r' U
- ********************************************/
( L: E" L Q- x/ \2 M3 e - mov eax, ds
D9 u8 c# L3 M; k( L" \ - shl eax, 4
& E6 {2 Y8 @/ l8 c4 x - xor ebx, ebx; S; k: a$ L& ]8 j: i
- mov bx, offset GDT_def8 f* I( {. T/ F6 A
- add eax, ebx
4 i) d- j$ t; N" m- G- Z# S% f/ [" [ - mov dword ptr GDT_Addr[2], eax$ c4 z6 y, L$ I$ e
- lgdt fword ptr GDT_Addr# E+ \9 b3 d( P. e5 |. B- Z
- /********************7 C+ V$ [- l' u1 w7 x
- * 选择子偏移 *) Q% k4 V, p9 P
- ********************/
9 w# C, J9 R$ e8 w - mov bx, 8" Z3 c, k& h7 @* X8 ?( E; ~
- mov eax, cr08 W3 }) ]# \! G; q/ ^2 T
- or al, 1# d" X( i( B& l
- /**********************
& P2 D" s1 _) [+ N( b7 h - * 进入保护模式 *
" ` P( w# G* o0 ]/ v7 f* u - **********************/7 x7 ~; m; @# z* q
- mov cr0, eax
' m8 J d' e- |8 \, q+ z - jmp pMod5 |0 S0 X9 v& a: X# p5 e1 K9 _2 S
- }2 e- A! Q! Z, ~8 ]% i3 Q
' b, F5 W" I) Q. }' x- pMod: asm{8 D* h% P4 N5 S7 x
- /************************************************************7 O- f* c, [( h: I4 Q1 k
- * 让fs与gs加载选择子,使其能访问 0xFFFFF * 4K (4GB) 空间 ** k) n4 g3 p( e9 f _: @: o3 i
- ************************************************************/( O& x2 w# d+ \! t
- mov fs, bx
* ~- l$ G2 [+ B - mov gs, bx1 n& ?- y5 q* {: J( J( M$ _6 J$ C7 z N
- and al, 0x0FE
( _7 R# Q, M# V% n - /******************
% S3 Z, j, i% S" k( K4 ? - * 进入实模式 *7 o( X4 B! q& i- R9 A( F: g* ?
- ******************/
+ l6 q8 V# @, S, d2 b; ^. @ - mov cr0, eax7 N j* a% V, E/ r$ H- B% d3 Y- j
- jmp rMod
& y; P( {4 s* X - }
' g0 R" ]5 v$ y. \8 S3 Z
6 i( o) U# I( j- rMod: asm{! h. d9 y" T: t, V
- /* ******************************************************************6 z! M; G) `! h) @) U
- * 退出,fs、gs清0,访问系统内存可用: gs[32位,相对于0的偏移地址] *% X, M; u/ b% d4 `
- ********************************************************************/: U. C% B% [+ q% X' M E1 P, X3 q
- mov ax, 0. }* k& C2 W- U4 B
- mov fs, ax
- i# y2 x7 N4 w - mov gs, ax5 S$ A6 O+ |. {5 p
- sti- V2 @/ X$ }7 M- I+ u: x
- }$ H. P, R: E2 [7 g1 j7 }2 Y! w
- }
复制代码 这是asm的- ;/********************************************************************+ Z9 G; b2 s; h/ m6 k8 S
- ;* File: DOS4G.asm *
; Q5 i9 H5 i( A/ H# B- v# B - ;* Compile with masm ( Editor: Tab size = 4 ) *# U- G0 b- |$ |0 Z- |
- ;* *
+ f' L: i2 L1 j: {9 A - ;* ========================Title=============================== *
' x! T w0 h" d' I - ;* 这个demo是让系统进入DOS 4G模式,进行数据访问 *( [, C- m/ C1 \, j8 u1 r [
- ;* *
3 m" l& A' \! g# E1 { - ;* ===========================History========================== *
( b) D- g2 ?: }: C8 ?! U2 y" O5 P% e7 c - ;* author: bini *# Q4 m0 ~6 M. r2 X2 I# m2 ]- T
- ;* date: 2008-10-08 Frist version. *. {# P/ M# r3 m6 a/ C2 b! f# b
- ;********************************************************************/
6 W, G# _, I8 H( c - .model small/ {9 R; h2 }3 S, `7 }6 {+ Y! s: D$ K+ a
- .586p
% `5 f; P1 X- w0 l -
+ M, h" Q0 n u% {& ^ - DSEG SEGMENT USE16 ;16位数据段1 {* F$ P8 B8 \9 {2 K6 {
) ^6 @. V2 L+ O [5 ~# Z- DESC STRUC
0 z+ B6 W* f# s' Y2 K7 \ - LimitL DW 0 ;段界限(BIT0-15)
' ]! C; z# H9 C% M - BaseL DW 0 ;段基地址(BIT0-15), j" P/ B- H) l, x0 Q# L
- BaseM DB 0 ;段基地址(BIT16-23)( y# D% k% |/ m0 l: l
- Attributes DB 0 ;段属性
9 N- p6 b5 g; }: f; a - LimitH DB 0 ;段界限(BIT16-19)(含段属性的高4位)+ m. e& I" R( g1 S
- BaseH DB 0 ;段基地址(BIT24-31): e+ {* F1 X% W; l4 Q" p
- DESC ENDS
1 h! }2 v" E9 s3 _8 _ - ) l5 n( r/ |) _. c* V1 |
- PDesc STRUC
! l& r% V$ _; G1 m X; g - Limit DW 0 ;16位界限
6 z9 \: W- h. y( ~ - Base DD 0 ;32位基地址. Q6 Z0 N t) T: U0 G, F) M8 I
- PDesc ENDS/ c, Y Q: h$ z$ E/ @7 }9 z9 p( Q
- 6 N& h9 g+ L6 o
- GDT_def Label Fword* v% t% _$ u4 s' a
- Null_Desc DESC < 0h, 0h, 00h, 00h, 000h, 0>
& [8 E9 z' a3 E - Data_Desc DESC < 0FFFFh, 0h, 00h, 92h, 08Fh, 0>
8 w* `& K: V% z
/ S1 B8 f- n) Y- h0 m- GDT_Addr PDesc <$-GDT_def-1, ># I8 ^$ g4 [2 l$ h
- DSEG ENDS ;数据段定义结束
' i( M8 D* \( Q( L - 7 r2 M5 d$ T) i; L( I1 a$ W
- CSEG SEGMENT USE16 ;16位代码段7 r3 D* {! d5 s3 D; `& F
- ASSUME CS:CSEG,DS:DSEG
# a: _3 M( k, u" b! H# M% r5 d - .Startup7 C) N( h/ u- }( p. }7 h* x8 V/ }
- call Set4gb
( N3 l4 R" w# ?5 | - ;
+ Y% }3 y/ n% V0 p) V) a) O - ; fs, gs即能访问4GB空间$ b" F( H9 o u
- ; write your code in here.
) W T8 a- z4 J5 ^! h' Y; r - ;
# M, G& j+ u2 A: X# [0 }* t" T! S - .exit1 a' {* ~ t3 ?$ X% F
- " Y* w) r. r% \
- Set4gb PROC NEAR1 f( C) V2 r" y n* c
- in al, 92h
! [, P7 V! U( b% F/ Z - or al, 002# _! d( M' |) f4 b
- out 092h, al [/ z, o; R* u1 y; ]# L+ u! ?
- out 0edh, al' {; {9 n. b& J/ @9 k3 }5 R9 q
- 2 v ?. r: X( ? X4 l, A
- cli m1 x0 L" C3 U2 _% t3 Q0 @
5 d5 w; W* T$ i8 P( n. Y; V- z- ; mov word ptr GDT_Addr, (2*8-1);! Q/ e9 r! ?- |+ [* }
, w, Z9 g; M( h1 G" t- mov eax, ds
! Q( K. N4 L- w* u& ^ - shl eax, 4) [1 u R+ a% {" U" u! f. o( A
- xor ebx, ebx% M. W) H* c5 v) H
- mov bx, offset GDT_def
6 Z9 l! Q1 E. x: B3 u - add eax, ebx6 d' n! S' s1 P# O
- mov dword ptr GDT_Addr.Base, eax
( x* U+ o* }- W1 S. W% ` - lgdt fword ptr GDT_Addr5 R1 s* H! ?. q. w# P5 c3 F
- 0 F' r H# y( Q& O) y9 G
- mov bx, 8
4 \& m0 g* U. P6 I# H- X# @ - mov eax, cr0
! D$ `! n# M4 l( Q+ N - or al, 1/ |( B6 K2 e+ G/ r
- mov cr0, eax7 W' T' o" \: r6 s5 H; v
- : x6 v' R# P2 T# _
- jmp pMod( S4 W, W& t9 K: U5 T e/ {3 C9 E
- pMod:7 {3 X# N- j) w) m2 f
; A8 ~2 ^. t$ J. C' Y* M- mov fs, bx. q! F4 u A8 a q
- mov gs, bx; l& m9 k; a+ N5 L- R+ b
- and al, 0FEh) i) v& @/ z8 F1 O% h; ?' I
- mov cr0, eax
9 k& v1 e. z/ [* I -
/ g1 W- `* y8 }& o- D/ \ - jmp rMod
Z9 B9 W0 M2 N2 U3 V; p - rMod:
+ A$ U5 _( A2 k1 p
8 O- v2 H. L0 `- mov ax, 06 ^" Q H, i' m! D
- mov fs, ax
* Q& D/ Z# u1 N H - mov gs, ax# z7 b* ~. {! a
- 6 g9 p7 S1 ~) A- Q5 e" ?, \
- ; 在2M的位置测试写一下数据% p4 l8 ]+ O1 }3 @( C
- mov esi, 200000h: Q0 b/ P0 g& Z. x
- mov dword ptr fs:[esi], 055aa55aah2 i$ K( F; e9 Q7 D5 l* D8 D
- ; 用RU去看看200000h的位置是否是此数据....
) J& r# h7 t- I# H& _3 y - ' A3 U4 @9 f/ w8 R/ m) }
- sti
3 E, }/ U+ H+ P n - ret- y: q$ I+ P* m
- Set4gb ENDP
8 a5 b3 ^; M! y9 T$ A -
* _0 u. \' g- a, Z8 |; f - CSEG ENDS ;代码段定义结束
4 D! O5 ]( K8 C, Y - end
复制代码 |
|