|
|
刚学习的同学,有些还不会,我这里贴点C和asm的代码。只供参考。
7 j+ l3 E' t% A( z5 x0 `% D
3 ` M, `, R6 r+ u6 K- ?9 R这是C的- /********************************************************************; C* L" \( s w) T ~) y/ o) T e/ k
- * File: DOS4G.H *
( |* H$ N! z$ v$ x' ] - * Compile with BC 3.1 ( Editor: Tab size = 4 ) *
+ V/ t& _4 X w* Q4 M - * *
# U: q l( V( p- t1 w- m8 r - * ========================Title=============================== *8 m9 B- ^0 T' y
- * 这个函数是让系统进入DOS 4G模式 *
( P; W8 D# l; r5 R% m) i \ - * 程序参考了:陈家琪《DOS实方式下直接访问4GB》 *, u; m$ k2 v& P9 Z5 e( k
- * *
) X* O; j9 Y% q- ^9 ^% W+ @# a - * 使用: openA20(); set4gb(); *. ~; n- \( ~+ S8 P
- * *, Z' g- d! I E2 q/ \9 ~
- * ===========================History========================== *
8 B7 A0 b, \0 K) v9 W$ H - * author: bini */ q! |. | \" d9 \0 ^! X
- * date: 2004-11-30 Frist version. *9 C/ B5 W {5 V4 u4 Z
- ********************************************************************/
/ B& R" F! {4 k2 b# A
- r9 _2 m+ J: m% O: _' p2 W- #include <conio.h>
* j% H' I% c* ~# C+ N - #pragma inline4 l0 r! d2 j& D) D0 A+ p
/ j! L; j* E- m- U9 X) D- /***********************************************" K: H( N. i8 H) o J$ f
- * 两个GDT,第一个为系统使用,不管,默认为0 *. Q' T( M# h) `8 A' r3 _
- * 第二个为一个数据段,没有代码段。 *
/ Z" ?1 V s4 d/ d - ***********************************************/
+ S- N$ T% y. `, v" B - unsigned long GDT_def[ ]={0,0, /*系统使用*/! I5 Q0 N2 h+ J6 W2 @' ` }
- 0x0000FFFF, /* hi16bit( 0~15 ) is base low=0,
! P* g9 n6 c6 H" l - low16bit( 0~15 ) is limit low=0xFFFF
* }, O2 A" f7 e" b, L5 @" \8 Z - */
3 f2 |# I2 V% l2 q, H4 ?3 _2 L6 O7 j - 0x008F9200};/* 最低字节为 base( bit 16~23 ): _# ^2 @& a3 w0 D: \8 }) Z
- 最高字节为 base( bit 24~31 )
8 H" p2 R1 G) P/ m* D -
( j$ t5 i3 l" I/ C J - 属性Attrib = 0x8F92; x" N8 s5 d0 l4 A' {7 u: K: H8 y
- 9 X( b( m$ v" ~+ R
- 属性位Hibyte低四位为
2 J1 D" j1 n6 w) t( N+ I, b0 L - Limit( 16~19 )=F2 G" X" G3 T( m' ]6 O: @. y, t5 @2 n4 Z: b
- 属性位Hibyte bit7 为粒度
# J6 X& p& M: J& W7 i - (值1=4KB粒度): c! w$ l- Z! J+ a; R
- 8F & 0x80 = 1
8 l) C+ k8 b- [/ m. U! E: Z9 E -
# ?) X/ H1 N9 C, Q# h( v - 属性位Lowbyte低四位为段类型,值=27 b" p- d: k2 H& f
- 表示为可读/写段
) @3 z% P& J) F7 N$ X7 N - 属性位Hibyte高四位=9,bit3=1表示:
, m& d7 V; h* x, J/ Q - 描述符对地址转换是有效的。
; F/ [( e ]2 @1 T+ A: ] - bit0=1表示为:, W. n, [. \* ?
- 系统段描述符。而不是门描述符。( x1 a. x! O, f- \; s$ O
-
* j/ y/ w+ p: L/ L2 P8 _: p8 S K - */
1 e3 W9 t) [; L9 [5 {; X( m - ! j' I/ N- ]2 F- p+ u9 W5 B
- /****************************************8 q9 i$ f( N8 M2 N" X1 c
- * GDTR寄存器, 48bit=6bytes *
1 t$ `1 Q: F$ y5 ]- f - * +-------------------------------+ *7 F; w( d' m9 W+ ]) l# }1 y3 Y, e
- * | 32bit基地址 |16bit界限| *" y2 J; A- Q3 G9 _' g( G2 _
- * +-------------------------------+ *2 _7 q$ R% V% u6 J5 h/ }
- ****************************************/$ J) q! d* r/ e3 m* h) K
- unsigned char GDT_Addr[6]={0};
; B. ]) m c, N$ D. m/ d9 Q* R
# i+ B# B7 m2 J* g- /****************: a9 D. }. i4 f: X+ Z, `
- * 打开A20门 *' T* Y8 J6 z0 ?5 n/ k0 Z
- ****************/
+ b: \; K8 ]6 a: Z4 a - void openA20(void)
- s, ?: v) j4 y3 o# j& w) r2 T/ e - {& ]) @! B; }5 U# ^9 W. G
- asm{6 x0 H6 s) C5 F6 s/ K' S
- pusha5 e5 P7 |( q& Z& ^$ r
- in al, 92H7 V6 d- O5 x( E+ g( [1 }
- or al, 0x028 H2 k* I# Y+ t" H3 ~$ z
- out 0x92, al. l7 s; b8 H5 |' b. o
- out 0xed, al% d3 A; {2 T6 ?* } s9 H- w
- popa
/ R) m- e! y2 c- M% M. _4 R - }6 D; E. f6 `: W* r4 s" ?
- }9 n0 O( k2 a( f8 Q$ }8 F# w! ^
6 E% M% [' x. w. t- /***********************************************
6 H! }7 { ]1 ]8 @1 v3 D7 q. B4 L - * 函数功能:进入DOS4G *
! P1 c: n1 X' d/ x - * ==================== *
( h8 s% G/ z, s) _% l7 |& _1 R - * *: H& h9 _* E2 G: G$ R
- * GDT描述符界限计算方式:描述符个数*8-1 *
9 n& f; q& }( `0 z3 a - * 如: *; c$ }3 a4 N# y' W8 n e4 n
- * mov word ptr GDT_Addr[0], (2*8-1); *5 e. \1 f" c5 u% y- r# o
- * 表示为 2个GTD *- I) {% x7 Y) K# D
- * *8 p# ]- Y ?$ u8 N$ \8 i1 `+ B
- * 选择子为所在描述符内的字节偏移。 *4 m5 t! K7 {3 R; L2 }
- * *
I9 I1 m( G( w: W) X - ***********************************************/! j0 I6 x* n- X
- void set4gb(void)
3 ?( e4 b- [# W+ G9 Q; @( z - {- [2 H0 {3 r! v( m+ N- i( ?
- asm{
0 `- e: j/ V# B* u# l3 Q - cli
' e/ r: ^9 f/ N$ a3 [ - /****************************************
- T6 t0 _9 {8 A" }* {; D& a - * GDTR寄存器 *6 e# ~" u: T! L! s# B& z: e$ c
- * +-------------------------------+ *2 {. V( A2 d" Y* K1 @
- * | 32bit基地址 |16bit界限| *. {) i0 i2 T7 |! y2 s
- * +-------------------------------+ *
) K! U3 |! E7 t m$ ^( K) R' i - *****************************************/! o% t! D' C; c: A+ `
- /*********************. {: e' J8 q, J( i+ C; }7 q% \
- * 得出段界限 *
5 F' _; N. C9 k - *********************/( S& v0 G1 s! I1 L) W! J+ \' T- b
- mov word ptr GDT_Addr[0], (2*8-1);
! |, Z- y" n6 _' p1 ?3 G# `: F - /********************************************- n2 Y% P: N" n+ l9 J7 U
- * 计算GDT表的32位基地址,存入GDTR *! Z) j+ \2 E k( h" |
- ********************************************/
/ x, A* F, p: L+ b& \8 M' y: J' V M; u - mov eax, ds% i% q3 v9 H3 Y9 b8 U
- shl eax, 4" I8 [ ]' x% s7 k. g
- xor ebx, ebx7 W- {6 ?* w1 B' q& M& D( Y8 S z
- mov bx, offset GDT_def: n3 ?* i" O1 M$ A' y
- add eax, ebx
# L5 ]7 T# L" I, [. V/ j) b - mov dword ptr GDT_Addr[2], eax# M' H1 X, x% e( b
- lgdt fword ptr GDT_Addr7 @* h5 ]% ]( H. y n
- /********************2 a* c& O+ ^# L5 P$ i/ V! Y
- * 选择子偏移 *- f- D2 l3 [# O4 z
- ********************/$ A. i+ P6 M% C- i4 c% L$ \
- mov bx, 8
`% A5 \. [; D& a4 R2 K- u9 G! E - mov eax, cr0
% m- W, Q/ |. j3 ^. Z- n+ t- F - or al, 13 `% M2 x, G: W! `0 D1 _8 O
- /**********************: x2 _1 G" l2 ?2 Z/ O
- * 进入保护模式 *+ ]9 a; E/ Q" f, B% E5 w
- **********************/
3 \3 P8 { i8 l2 H - mov cr0, eax
8 E$ l9 r' G9 ~$ X8 n/ `7 X - jmp pMod
& g' G% E' ^* m, i" ^ - }
5 Y6 r) y& u$ L1 D$ f9 q4 x6 e* ?. {
: y, w' }8 k; F1 b `' ^- pMod: asm{& q% ]8 \# a9 w3 [5 y4 S8 _
- /************************************************************
7 U3 D7 r3 U1 H9 @- ~ - * 让fs与gs加载选择子,使其能访问 0xFFFFF * 4K (4GB) 空间 *0 x$ l2 Z' u7 n
- ************************************************************/
$ j: m/ w$ s# Z: O, f2 b - mov fs, bx2 A" n% @0 c k0 {$ U$ O
- mov gs, bx
* i/ j; D* O1 ~6 J: e' O - and al, 0x0FE
1 I, k- v: h8 ` - /******************
U" j& f) q3 K: A# G- r - * 进入实模式 *5 _. `3 Z% \2 Q9 O1 E
- ******************/3 S# |$ R- D/ J k1 _+ B
- mov cr0, eax
+ R' r6 O1 G+ ]7 w. M$ p - jmp rMod1 i! K4 K- x) T5 S( _ u
- }* j2 X# x- Z! C5 f5 {0 M
1 J- N' Z) W# K- z5 }3 R, \- rMod: asm{8 C- w) c! z) W4 `7 E) Z3 Q
- /* ******************************************************************
0 b8 c$ I3 T2 k4 B* k+ f - * 退出,fs、gs清0,访问系统内存可用: gs[32位,相对于0的偏移地址] *8 F. V1 R) s( K
- ********************************************************************/
7 c* |& M# J0 O6 f7 X6 I - mov ax, 0
! ~6 a: b4 C5 P ]# D - mov fs, ax
, L. X4 c7 U1 ~$ a/ E9 Z' i - mov gs, ax
0 o" c& i; d$ O - sti
% T+ ?) t/ O8 ?) J# m4 W - }0 j+ x6 J4 [ Q6 M: W* C
- }
复制代码 这是asm的- ;/********************************************************************
" I0 t* ~1 m l4 U6 V - ;* File: DOS4G.asm *& p: k2 l* f$ ^5 r9 F9 @& r( U; l2 U* a
- ;* Compile with masm ( Editor: Tab size = 4 ) *
* |# J4 A; s8 W b - ;* *0 y* V- S h. D5 M8 s( i$ k8 l* f
- ;* ========================Title=============================== *; y7 W" p# Y) f2 q9 a( t
- ;* 这个demo是让系统进入DOS 4G模式,进行数据访问 *
; U9 n+ v( F3 ^3 f' j - ;* *
" O! t% J8 b+ Y/ D* w2 x. a+ f - ;* ===========================History========================== *) Y* f: [( _8 o6 P: R# b1 H5 L0 {
- ;* author: bini *6 @6 ~1 { D* I# V
- ;* date: 2008-10-08 Frist version. *
* S0 `7 k+ o$ s9 B* U - ;********************************************************************/ . ^5 N4 f: g: J
- .model small1 w- e1 h: v/ ^) y( \. \
- .586p4 H$ B9 G8 o( [! S/ P: U+ D* u
-
" y+ Y5 Q: Z, {6 O/ y1 [ - DSEG SEGMENT USE16 ;16位数据段$ p6 _1 C1 F# E1 [
$ b z9 {! h8 e+ x4 n# @, J8 M- DESC STRUC9 l9 t& Y7 J& E$ B8 Q7 j
- LimitL DW 0 ;段界限(BIT0-15)7 g5 Y/ N K& K# J j0 W& h
- BaseL DW 0 ;段基地址(BIT0-15)% Q A% \, ^; b6 {& C( ^# o# C9 K
- BaseM DB 0 ;段基地址(BIT16-23)
5 V6 k2 I3 \0 k% C0 _) f& R - Attributes DB 0 ;段属性: H& W* i3 R4 I" |4 b7 n* l- W
- LimitH DB 0 ;段界限(BIT16-19)(含段属性的高4位)
' c5 u# b1 U4 h) x( N - BaseH DB 0 ;段基地址(BIT24-31)
% \. d G: F( T# D! \* [# X L" v - DESC ENDS" C2 |4 Z9 a( \0 H' ]
- & u# r+ i9 G2 F3 z) P2 A; _7 M
- PDesc STRUC
( M2 o$ n3 X6 Y" S8 A7 k - Limit DW 0 ;16位界限
x9 M9 [1 l( l5 |% Z5 E0 y - Base DD 0 ;32位基地址
# }0 i0 _- S6 k5 ^7 Y' K7 X- z - PDesc ENDS- c+ B+ C# L8 o' h: l
5 m2 Q# A' E3 c0 l- GDT_def Label Fword# W3 @/ f! L/ k% I8 i3 ^6 }" \- F
- Null_Desc DESC < 0h, 0h, 00h, 00h, 000h, 0>8 ^$ [3 f5 o( N3 i
- Data_Desc DESC < 0FFFFh, 0h, 00h, 92h, 08Fh, 0>4 y' h+ D- h( G
3 \; c" b% V1 Z: l- GDT_Addr PDesc <$-GDT_def-1, >1 e/ e( ]; f. |* V4 B. j% J( ^ q
- DSEG ENDS ;数据段定义结束. X7 T+ T4 @6 m: J/ N1 y
( `/ {3 I3 ?7 F/ y- CSEG SEGMENT USE16 ;16位代码段% x; Y9 u9 U* ^/ S; }' T
- ASSUME CS:CSEG,DS:DSEG
- s7 t: D: z% i! w - .Startup5 G( c& b" J: j7 Y, M8 n- X6 B
- call Set4gb
, ]4 b/ r! m9 r+ ? - ;
# ^3 A9 L- ^7 k2 }: V - ; fs, gs即能访问4GB空间, C& ]1 ~' f$ g9 E B
- ; write your code in here.5 x! |, u I- l9 J0 s: U7 l9 m& ?
- ;
, f( Z9 C0 v, E7 S4 O3 `5 h - .exit# q: J5 i" }3 ~* c
- 0 {3 g) y: K' d* x/ y/ R7 k+ B
- Set4gb PROC NEAR
& O) g# s; w# }2 S - in al, 92h
2 ?) U3 Y4 I# O - or al, 002
4 O6 {) }3 {3 W1 m - out 092h, al7 [+ w$ @ {. M; S- i& f
- out 0edh, al
y c& i/ j2 H) E0 R) w- A& u
( Q: l* T. q5 j) Z- G9 W2 v. L2 D- cli4 ~( t" l3 [: I& F& s
+ @# y/ |8 J: c; @9 Y- ; mov word ptr GDT_Addr, (2*8-1);
2 d, W4 v1 p& d' r0 n - : J9 N! m0 ?: H# M& b& H
- mov eax, ds
2 r) J3 D) j1 G: g - shl eax, 4/ ?! k# F* Y) F- K
- xor ebx, ebx
* L) L% g2 P( f$ F7 ~ e - mov bx, offset GDT_def# D) J3 H: M2 y/ a
- add eax, ebx6 L9 x% ~4 G' i
- mov dword ptr GDT_Addr.Base, eax
+ U) P! c- S' q C% V; c! p: k - lgdt fword ptr GDT_Addr! P1 u9 n7 Z5 }2 v: o f( f4 b
- a" \$ I( p& l7 a( i; f- mov bx, 8: U( A; d# z/ I5 A& e7 `6 b
- mov eax, cr0
* R6 a( L7 w5 r( I! M - or al, 1. @1 F; ~/ [, E7 I6 R T" q
- mov cr0, eax
" ?1 u/ R* `) K' ~- S' a
$ x) K; Y0 h! p' I5 k- jmp pMod
% g' y% n T8 J$ S& @' j - pMod:
" l9 k6 l0 ^; Q3 m7 E - ( X9 b3 J2 O) `: o1 G$ x
- mov fs, bx
9 H1 I& A" T# b6 B$ i1 ?6 V - mov gs, bx
% W* t* Z4 g. p% B( R - and al, 0FEh8 }. N% r( _" \# i( w2 S
- mov cr0, eax
% U( f; h( f- M -
' V% E, m$ b" q$ J5 e k - jmp rMod$ Z* t9 j( w" @( S
- rMod:
- C$ v+ ?( p; l: I1 y - 8 L1 F, A" y' F: ]7 X" c+ |
- mov ax, 0& H2 S5 u& P( T
- mov fs, ax
! T7 j' t) n+ o; D - mov gs, ax
; {: W/ C' I+ c6 D3 n+ h8 v -
1 N" T! ^, H/ @6 b( b4 ~; e - ; 在2M的位置测试写一下数据; C. H. U( y- ^- \7 B! U
- mov esi, 200000h: y4 M- G% J1 Q3 K
- mov dword ptr fs:[esi], 055aa55aah
4 \. e; L+ x7 a5 \ - ; 用RU去看看200000h的位置是否是此数据....' F+ U+ Y: V3 B
- $ H6 W) k) l8 Y" A+ g
- sti
# y/ Z0 m! y+ H3 d, F0 I) F4 i( u - ret8 v7 c: U& ^5 A+ @5 c
- Set4gb ENDP
, G+ c' w+ Z U3 A -
; ]) i( |, p' L/ u* U - CSEG ENDS ;代码段定义结束$ Q& k/ K- Y+ n% d
- end
复制代码 |
|