|
|
刚学习的同学,有些还不会,我这里贴点C和asm的代码。只供参考。4 o: B) J+ Y6 F4 @- c9 t
. Q7 [6 Q. F# Z2 v这是C的- /********************************************************************
6 D4 n7 J: Q' A( d! Y7 | - * File: DOS4G.H *
3 n1 d- o0 B, v) |/ b - * Compile with BC 3.1 ( Editor: Tab size = 4 ) *
2 Q/ Q) a; w. @5 ]: N - * *
) U9 f* D C. G2 Y - * ========================Title=============================== *
% N2 C, |# x) B8 h2 e - * 这个函数是让系统进入DOS 4G模式 *. { J0 E9 L- n6 d( ?
- * 程序参考了:陈家琪《DOS实方式下直接访问4GB》 *5 g! [' C# P% T2 d' G
- * *
+ o. v' M" a0 c1 Z1 v1 k - * 使用: openA20(); set4gb(); *1 u* P! U4 A, A7 F6 t7 M4 F* j
- * *
: R m( m( V) I' b1 i0 o& ^ - * ===========================History========================== *
, x4 m7 S$ X9 M" Z - * author: bini *; x3 J) P: j9 O1 v6 S, m6 I
- * date: 2004-11-30 Frist version. *
, W4 `: P! P6 B, B8 H, n; o, k - ********************************************************************/- E/ h$ D$ s- L: ]4 x5 [9 E3 i
- 3 d( F2 N( I% r( K1 t9 I
- #include <conio.h> Y' S3 O, _# t* l; S
- #pragma inline
& i" o+ E- v: p" M* F - c2 u# H, K8 w) D/ f4 T
- /***********************************************0 _& p' P, R' T
- * 两个GDT,第一个为系统使用,不管,默认为0 *
1 }% Q& M1 G$ J: ~+ W - * 第二个为一个数据段,没有代码段。 *2 L {0 @7 _7 l2 q/ t6 E8 C& f
- ***********************************************/
2 n2 n6 L" S' c% k7 w8 @' `& s8 V! G - unsigned long GDT_def[ ]={0,0, /*系统使用*/3 M: J% M1 Q5 O% j5 T3 s! H
- 0x0000FFFF, /* hi16bit( 0~15 ) is base low=0,
( G0 v: V, Y7 o8 L" @$ ` - low16bit( 0~15 ) is limit low=0xFFFF ) r" Z+ l) o9 ] M0 ]- N) D
- */! L3 Y: c! y7 g9 c+ Z
- 0x008F9200};/* 最低字节为 base( bit 16~23 )
2 h8 }( x j* P5 k0 x5 D - 最高字节为 base( bit 24~31 )$ k4 w N0 j( T, X+ ~
- 4 ^4 V1 K9 Q% ~* K8 N
- 属性Attrib = 0x8F92
5 \5 ^: J) T/ H4 P$ B0 T -
5 r9 b4 v# {! U! h* u m - 属性位Hibyte低四位为
! o2 c0 M2 X- W - Limit( 16~19 )=F
) h2 s% n4 g' L/ _$ V - 属性位Hibyte bit7 为粒度
" p0 c' E( n8 f% ?. ` - (值1=4KB粒度); @4 j3 o: t, [+ c
- 8F & 0x80 = 1
: l. i* ?7 j" J( _# { - 4 D# z9 W% r+ p0 O& ] M& s
- 属性位Lowbyte低四位为段类型,值=2
3 u0 E7 ~! W( j1 N3 Z - 表示为可读/写段
9 y( z; G4 q) V) e. a6 F - 属性位Hibyte高四位=9,bit3=1表示:
$ ]+ c0 m% B5 ]0 t. | - 描述符对地址转换是有效的。
0 L* n. P5 @* H9 x5 F - bit0=1表示为:
1 |$ r& v* c0 i2 k- i: y! ~; F z - 系统段描述符。而不是门描述符。" H( D& b0 ^8 L% g5 j" t
-
. G5 }7 r& y) }$ _2 e - */
0 |4 n8 J9 }. u3 h& s: K - % a+ u/ D1 I, o" b
- /****************************************/ F* @- K1 n: L% K
- * GDTR寄存器, 48bit=6bytes *! T8 C( s ]: }% P( X7 @
- * +-------------------------------+ *
+ n. S! J& J. ~. X - * | 32bit基地址 |16bit界限| *
2 P* \: u* N' g9 J, Y - * +-------------------------------+ *
; ^8 o t( q) K9 l" \5 m+ e$ C - ****************************************/
0 _2 e0 M9 s2 C4 I) K: U - unsigned char GDT_Addr[6]={0};; s ]( x6 Q4 s1 ~1 E l( a
- 1 x/ [5 M0 j# b
- /****************
% [$ }" d9 }. K. } - * 打开A20门 *
) i/ I8 s2 S. N. a* u) t - ****************/" M; p6 ~3 b7 h& \5 x
- void openA20(void)8 e' H8 f2 V5 K( I7 I1 A6 N! n W$ l
- {. g" s4 N# l! w& G% T* z2 V& ?
- asm{( V3 q* F) N; o& I
- pusha
9 F N$ ~8 ]- P; K3 ~, u) ^+ } - in al, 92H
4 g: P' }8 g: R" A$ L$ W$ d - or al, 0x02% j3 i- b& G0 k
- out 0x92, al- b+ A7 U; v) z" s+ l! F! n! j! S
- out 0xed, al- l' ?8 @( _4 [/ ]/ J* o
- popa
3 e0 I& Y0 K3 J" z% ~3 L+ y g - }
4 }) b5 G' r. p8 L' D6 S9 R - }7 f( B" F; a; t
- 5 y+ W; O. R' c8 c. p5 |; K) ]: {$ [
- /************************************************ d# l: O5 e3 l
- * 函数功能:进入DOS4G *
E' e( F. v! g7 V6 ?! _$ T* F - * ==================== *2 ?* _% ]3 T/ B3 F: ~# W
- * *
s5 G9 p% I7 _1 c% Y! x - * GDT描述符界限计算方式:描述符个数*8-1 *
7 b* s! M" c+ U; U - * 如: *
( J6 E$ S3 t' s6 H9 A2 a: y9 q3 j - * mov word ptr GDT_Addr[0], (2*8-1); *1 }. Y+ L! a& r( q
- * 表示为 2个GTD *
5 @' i; a" R# G. {6 s# a - * *, Y* F0 T" E; b ?2 z
- * 选择子为所在描述符内的字节偏移。 *
9 ^3 l7 v9 f) e D7 V - * *
+ ~9 w; ~4 L1 `% o f - ***********************************************/
7 m3 \* m! a9 N - void set4gb(void) F2 y! `8 I/ c% R: v& i
- {
+ |$ n4 C' `+ h) F7 | - asm{
3 D9 C1 I4 u+ f3 k" K* D& _ P - cli. y8 b2 j+ S9 T0 A2 E. I4 r
- /****************************************4 n; V* B3 I9 u$ ?1 q
- * GDTR寄存器 *
& W4 T, X* R( G5 |* y' Y: ^ - * +-------------------------------+ *
. U/ ^# u; c) v/ N9 O - * | 32bit基地址 |16bit界限| *4 _! k% X, a% t O9 {3 e
- * +-------------------------------+ *
/ L. _' s9 K5 h8 u - *****************************************/
e( T9 ]& U7 R- L! u - /*********************
* z+ g4 l: ~ v7 @0 z+ A7 }# M - * 得出段界限 *
1 G$ @. i% O5 \2 h# L! p) Z - *********************/2 F7 E8 K! t8 ]
- mov word ptr GDT_Addr[0], (2*8-1);0 {8 t) X" ?% g9 |# J. A( e
- /********************************************7 o0 q4 p: k, D6 M& i2 B- }
- * 计算GDT表的32位基地址,存入GDTR *! H, c6 Z2 B6 D: A
- ********************************************/
; [2 y" b5 u9 p0 t - mov eax, ds
- H' C' t" U# H d4 o) Y: g - shl eax, 4: @. h9 |3 d. U$ |+ z2 w
- xor ebx, ebx
1 k/ `4 F; Y* A1 r( L - mov bx, offset GDT_def; @& W1 ~! V6 L
- add eax, ebx M: Q* I" Q: u; Y3 C
- mov dword ptr GDT_Addr[2], eax" }$ ^6 Y; h# ^' J( i
- lgdt fword ptr GDT_Addr
' Z4 b! a1 U- W2 o c - /********************
) h9 I6 z/ s, [) _; N$ ] w @' D+ _/ { - * 选择子偏移 *: _/ @, J9 U: v. W
- ********************/
+ O2 `3 m* y2 `7 I& o - mov bx, 8% n% _& j" H" T
- mov eax, cr0
) l' v e4 _- x" b - or al, 1
! m( G2 c$ A9 ^ - /**********************8 I& A$ l9 q( Y9 f. R# h
- * 进入保护模式 *
& n/ ^5 v7 A% z# D7 ^" d( W - **********************/
- L2 c4 g/ U+ `: g* z - mov cr0, eax
5 {$ W+ {4 |# i5 I j" K - jmp pMod2 b! M( }) U. B& A# y; |( ?7 B5 `
- }6 b6 Z0 M( ~" j8 d
- 2 t& I0 c8 k* G5 u
- pMod: asm{ |& s1 M8 \9 K. U
- /************************************************************1 B# p! s9 ]9 V: E
- * 让fs与gs加载选择子,使其能访问 0xFFFFF * 4K (4GB) 空间 *
) f- M7 l, u0 k( r% {4 n- F - ************************************************************/4 \( ~! i! K" \ V' D0 X/ G3 v( w
- mov fs, bx
% Q" K3 F$ s! p) U" n% D- j0 X - mov gs, bx! l) j7 N9 J5 T( g
- and al, 0x0FE
. \# }! w4 s, N$ X" B - /******************
) m% P5 }( A$ w g - * 进入实模式 *
I& L. B4 c) d3 h- M4 s; | - ******************/+ @; @+ n$ ?( n
- mov cr0, eax r/ @# H, Z8 C L! T& Z
- jmp rMod9 ?+ ?% s% v/ t, Z
- }
8 [; w7 A+ l" L! S2 g! a
6 I, E/ H' Q X; t3 F- rMod: asm{5 p! f8 a* s( @) D4 [
- /* ******************************************************************
0 N7 j' u; v& d3 G/ @! d - * 退出,fs、gs清0,访问系统内存可用: gs[32位,相对于0的偏移地址] *
( \/ U1 V; {* B6 B6 Q( M - ********************************************************************/
) _ G( v" X s2 l, v - mov ax, 0( a$ k; k7 p9 D9 T. K
- mov fs, ax
# R2 H$ b' B1 ?. y! }3 v - mov gs, ax: {8 D; W- B% J ]
- sti2 T( ?( X! m, a
- }
" d9 Y* W, F; T' ]1 z - }
复制代码 这是asm的- ;/********************************************************************
3 c; r$ }4 c5 Z - ;* File: DOS4G.asm *: y, k8 @ O3 I) }+ E7 \5 g, t5 |
- ;* Compile with masm ( Editor: Tab size = 4 ) *
, j8 t7 Y3 U9 l8 x - ;* *
7 I' }% q6 X; v0 x% D$ B! H - ;* ========================Title=============================== *
" Q6 m |6 @8 c9 p2 Z0 k - ;* 这个demo是让系统进入DOS 4G模式,进行数据访问 *# T) C3 Y! G9 y+ ]7 K4 g
- ;* *) x! ~: ^" G) L/ c1 N
- ;* ===========================History========================== *
/ x" D4 z4 B% q4 E - ;* author: bini *
* H% W; |7 l' O* V4 q9 t - ;* date: 2008-10-08 Frist version. *
/ X9 E0 ^. C) \# Z1 _7 Z - ;********************************************************************/ 2 U+ r+ k2 w) W8 T ?: @0 n
- .model small
9 P( P2 H9 j- [1 p' H3 {% q% _5 X - .586p; G2 |# P# I) R- l& ?
- & w4 _) s! w0 I& e
- DSEG SEGMENT USE16 ;16位数据段0 U; \' M. R+ B( [
- 2 z9 V* ~0 U, p' p& u
- DESC STRUC
6 ^7 U7 y- |' p( K! k7 b f) G5 I - LimitL DW 0 ;段界限(BIT0-15)3 e" ^+ G; Z3 K5 n
- BaseL DW 0 ;段基地址(BIT0-15), x' r m/ {" \/ Z. M7 ]
- BaseM DB 0 ;段基地址(BIT16-23)
% p' U. y6 J' t9 H6 |9 m% @& n, b - Attributes DB 0 ;段属性
- ?, A% |3 o; B - LimitH DB 0 ;段界限(BIT16-19)(含段属性的高4位)
2 I/ k. n, L3 V9 w - BaseH DB 0 ;段基地址(BIT24-31)
) k( c. @7 V6 Q) b - DESC ENDS
5 S; W7 ]1 K" t8 _) M- ], d
1 k. p2 f8 x7 K- PDesc STRUC
( _; {) u' O, E3 V - Limit DW 0 ;16位界限
9 D* U8 Y" h4 F2 k2 e3 W* I0 x5 } - Base DD 0 ;32位基地址
5 X6 t* q1 q( C% x9 @ - PDesc ENDS8 v6 {/ Z! y- o" N2 Y, {
- * u2 U7 c1 D! j/ s: y+ W
- GDT_def Label Fword
G( b* U/ J, r' F - Null_Desc DESC < 0h, 0h, 00h, 00h, 000h, 0>4 y5 m& S2 \2 H6 V) G
- Data_Desc DESC < 0FFFFh, 0h, 00h, 92h, 08Fh, 0>
* E2 u8 W: Q- o4 Z
" H6 ]* A: g- U7 y2 O- GDT_Addr PDesc <$-GDT_def-1, >2 Y0 y- |7 \, L. l- s! B! Z
- DSEG ENDS ;数据段定义结束
6 g) L9 D. b8 u* M) o1 y6 s: j( P - ) ~6 b8 O$ h3 J9 T3 q J
- CSEG SEGMENT USE16 ;16位代码段
* E; h0 H( K5 ~6 t# ~ - ASSUME CS:CSEG,DS:DSEG# i6 o' y: R, ~/ o+ j/ A
- .Startup8 y% k o/ j* }5 d4 k6 Z
- call Set4gb
, H/ e9 r Y( ~1 J - ;
; v ?/ R, \& s7 R& o2 w; I% Q/ N: U - ; fs, gs即能访问4GB空间
: N x, m) R) O! j - ; write your code in here.8 u6 k; n# F. A6 B& I; e# {" x6 c
- ;( o) v: N7 d" n8 A. v. p
- .exit
9 G9 O) O! r2 b8 X2 O& e, z - 5 I6 w, I3 t% b$ n7 N+ U
- Set4gb PROC NEAR
* B, n4 ^: [* c. ]9 e9 K; j4 v - in al, 92h! A+ |# V! x: g: }, `$ b0 w6 y
- or al, 002- @, Q3 C4 e* B' v8 s+ a' }
- out 092h, al" Z6 K- w/ G: M3 C6 _
- out 0edh, al" y6 X: ~3 y5 W1 q4 a7 X C' |- o
& d3 s! @4 N: |) i7 n3 u- cli
% }( a. l' K( Z' b' y: ^( D1 w! H
! }- I7 \; l- D# D5 d- ; mov word ptr GDT_Addr, (2*8-1);
7 D5 ` s9 q& u) a( ^7 D. w# t
]/ A0 ?- f2 l6 g3 f- mov eax, ds7 k0 ~1 L8 T% @! [& |
- shl eax, 46 z' d3 z5 }; Y/ v0 D* l
- xor ebx, ebx" z9 e/ Y9 J4 P
- mov bx, offset GDT_def! X k; I+ ?) b: s: y7 t0 p4 \+ U0 g
- add eax, ebx
9 v( ~4 u$ k5 z5 R0 x - mov dword ptr GDT_Addr.Base, eax* A( w& v c7 y. i
- lgdt fword ptr GDT_Addr
# o$ V- d, n; \; b, n8 f
/ q; [2 H# B0 s7 Z) b$ J! m0 ^- mov bx, 8: U. g$ v" b( Q( i" ~( C
- mov eax, cr0
: z, }2 t& {, J5 s0 U - or al, 1 G! P6 |/ j5 ^) T
- mov cr0, eax
d: \' q, p2 `8 _4 Z
, R, W4 X+ z$ u; w5 y, E- jmp pMod+ ^8 y% Q7 e: t- l, t G
- pMod:
0 q, S2 s6 G. J
8 W2 s* s; H) i! w" |9 L: h1 r* ~- mov fs, bx& s& F0 N8 A0 [, y3 q9 j2 x# v' T5 W
- mov gs, bx3 P: R4 v) V4 O1 v
- and al, 0FEh
, d, R" Q. M2 L2 i: g8 H; B8 Z+ d7 S - mov cr0, eax
% J; d, v) v, [' l# k -
% T/ Y6 }5 U0 N8 l- Z: S - jmp rMod. h5 Z3 ~9 a5 ^) X* z% M* E$ a
- rMod:
6 p' G6 d& S$ u* t7 i2 O* O$ E% X
) L, ?$ B, N* Q9 N9 ]- mov ax, 0
) V G R# [5 ?( J. H" B - mov fs, ax
' V; T! o4 e ^/ ~. @. u8 q$ h - mov gs, ax$ L# j1 ^+ {4 [8 [: A
-
5 W' p1 J, Z1 j# r - ; 在2M的位置测试写一下数据
/ p [' U4 q% z7 D% v$ |" W3 v - mov esi, 200000h3 C9 c" m" y# k' L
- mov dword ptr fs:[esi], 055aa55aah3 [7 n; s2 G2 ]( W
- ; 用RU去看看200000h的位置是否是此数据....; s$ \% Y0 B5 v& x
/ l1 K. t! e' x( r/ e( @- sti; a) k- J E& o' L
- ret
! L `2 M. P% i# r* B+ k - Set4gb ENDP
& A" f/ y7 C# X- s! w8 d- m -
* ?/ ]; v! N4 l) G: C - CSEG ENDS ;代码段定义结束
/ f* M: l+ M6 H, O8 j - end
复制代码 |
|