|
|
刚学习的同学,有些还不会,我这里贴点C和asm的代码。只供参考。# k1 Z7 P; J: Y+ f4 X
) z" c& |, |* s' ?
这是C的- /******************************************************************** Y! `8 m) V! {& C T. L- K1 ^2 \- V
- * File: DOS4G.H *
2 u E) s0 ~1 b* t - * Compile with BC 3.1 ( Editor: Tab size = 4 ) *
# t* Q' R) |* E - * *, h, t$ s- k" e' X( W
- * ========================Title=============================== *4 l7 R% Q T# ]" Q% y& F& t
- * 这个函数是让系统进入DOS 4G模式 *
2 B5 m; X H9 t! X - * 程序参考了:陈家琪《DOS实方式下直接访问4GB》 *- M7 f7 h( R' t( y" e# Z; x
- * *
+ V( y5 G/ g, T. j- X$ k1 Q" p - * 使用: openA20(); set4gb(); *9 j- G% H2 s* f
- * *, I" ~: `+ |# O" B7 R
- * ===========================History========================== *
3 c1 n9 e, b# @* ?3 v# ~ - * author: bini *6 O; z) ]$ h! V) i. {6 ?+ K6 @) C
- * date: 2004-11-30 Frist version. *# T" L6 h3 S: B7 ^/ Q
- ********************************************************************/% K3 g! l- j- S
, q( [3 e. G. X& U, @- #include <conio.h>+ B4 b! ~# i5 ?9 W. k. e
- #pragma inline" q. [! P( D' h6 V% c6 [4 k5 v
- k2 w0 A1 T: B) H: L
- /***********************************************1 M- k$ }5 t) Y* Z7 ~
- * 两个GDT,第一个为系统使用,不管,默认为0 *
! {0 f7 Y1 s% B9 S% u7 K3 N" y - * 第二个为一个数据段,没有代码段。 *
) D- p' b" U; }, F: h - ***********************************************/, R M+ f$ e0 n: ~) D
- unsigned long GDT_def[ ]={0,0, /*系统使用*/* f% Z0 d( K! j0 D% I! M- R
- 0x0000FFFF, /* hi16bit( 0~15 ) is base low=0, * e: p$ B3 i# U* a" ^8 k1 b0 `5 B
- low16bit( 0~15 ) is limit low=0xFFFF
a; ?; p* `4 W4 V: x - */
3 y2 D$ t" v# g/ x - 0x008F9200};/* 最低字节为 base( bit 16~23 )
# |2 y# j; ]" |4 |, S# I( D - 最高字节为 base( bit 24~31 )
- x& r* Q3 o" d. h+ G. ] - 7 y5 |( h& q' b+ Q7 _( l0 n# K
- 属性Attrib = 0x8F926 S. U; ]! c- }/ [: V0 x, B! J( v
-
# t+ F" a& D7 h" } [0 V! ^ - 属性位Hibyte低四位为 7 ?# k+ v6 H" h5 j1 t- B4 {
- Limit( 16~19 )=F
, m% N9 Z' d; i8 T2 a - 属性位Hibyte bit7 为粒度
% q j d! g z* f - (值1=4KB粒度)4 j' C' @+ k- Z9 g& A' B
- 8F & 0x80 = 1
' t3 L6 @* {3 _" b- v - ) |7 X. O& f7 {2 ^( u) m2 n
- 属性位Lowbyte低四位为段类型,值=20 k- B# G. s) g* x: Y/ n5 K
- 表示为可读/写段 l* J+ x0 `# |; w
- 属性位Hibyte高四位=9,bit3=1表示:- w! G9 t, q- S) w/ b/ s0 l
- 描述符对地址转换是有效的。
! N8 C) ?4 L- h- Y( R9 @1 d - bit0=1表示为:5 {4 r: L! Z9 W( w x/ g1 H5 O
- 系统段描述符。而不是门描述符。: |4 {6 X1 Y6 f6 u
- $ A4 h/ c2 a [/ |; D
- */5 e) S P* ]+ P! t' b' i o" _
% K& ~ u$ T* R4 e9 S5 t7 Z- /****************************************
# S9 Q2 @+ k. X. V3 w - * GDTR寄存器, 48bit=6bytes *) L3 a+ o4 y# Z7 y
- * +-------------------------------+ *
( h2 g2 ]$ G9 L/ b3 z i& U, w; |& }2 { - * | 32bit基地址 |16bit界限| *
0 n1 L; u, n3 j' S4 ] - * +-------------------------------+ *
7 j& o& X1 D' x7 q: I - ****************************************/2 p# o, Z3 Y% S q8 a+ J
- unsigned char GDT_Addr[6]={0};
+ K6 o2 z" P5 f) }
; t& ^# Q" i6 w+ `. F- /****************
3 W5 |! \2 r( K' `- I: l& ] - * 打开A20门 *
) G! l Y& t# L - ****************/. ^$ Z/ |& g# t3 K/ h$ I+ M
- void openA20(void)9 w: _8 s, q& W, K- ` X
- {5 @. T$ v) P- m7 ?8 r
- asm{% r$ m( E: r& ^# C
- pusha
8 B" Z7 R& [- s9 t. K - in al, 92H
1 ]0 A; d+ W" d - or al, 0x02
) V) I% i9 {1 a% b+ x+ o2 e. o - out 0x92, al
4 n/ {2 C8 K: K$ s9 `6 ~6 y - out 0xed, al
8 z2 u ?. x) o) @ m - popa
& [5 `. a! k/ t/ i( h" @ - }
" d( n3 e( }: n; w& v - }& E4 l- ]: Y- n* |
- + J& M, O, I# m+ Y3 I* u9 ]
- /***********************************************$ O2 _2 h( u0 A! U
- * 函数功能:进入DOS4G *5 W, C; ^& C, F
- * ==================== *
7 ^ T, p$ L2 R8 A2 x - * *! ?# x5 ?) {/ c/ Q- D$ Y
- * GDT描述符界限计算方式:描述符个数*8-1 *7 V& ~ f' S* }5 u
- * 如: *4 ^' e8 t L% i1 G
- * mov word ptr GDT_Addr[0], (2*8-1); *
0 l3 Y- c6 M' R$ [& m { - * 表示为 2个GTD *
M; D7 S( o$ ~% o3 c - * *
) w! i( ]- _' ~: u6 Q6 X0 Y - * 选择子为所在描述符内的字节偏移。 *, @. i b9 F. E' K5 R
- * */ I( O6 E5 }" P. e; X+ W- {+ m
- ***********************************************/
" }# ]! ]1 O1 x* J Q# K i# N - void set4gb(void)
. f3 g. E. W5 L# J7 T# L - {
) C: u' z$ j' \. {3 w7 | - asm{
4 c4 x! I# H0 u% b/ r7 D( O - cli8 f8 q- w! A% f% V0 h
- /****************************************
" ]$ D0 b7 g6 }/ s - * GDTR寄存器 *7 v ~: k9 V" Z; J- `2 e5 m9 A9 P
- * +-------------------------------+ *& T1 d" e7 l7 W0 K8 D$ L
- * | 32bit基地址 |16bit界限| *
z) P6 v1 {1 u* L- ?: x - * +-------------------------------+ *- {) t1 d1 L8 S: |/ j
- *****************************************/ ~* {9 y8 O# j. j5 X k, j) ^/ z
- /*********************
$ Q) }/ J1 C2 Q% L& |; Q - * 得出段界限 *
" P; _% P* v1 N( f: ~8 l5 d- c - *********************/
: ^3 q4 O- @6 E y2 l6 }) U - mov word ptr GDT_Addr[0], (2*8-1);
4 H9 s ~6 T4 t6 U - /********************************************! j! K& }' D* Y, ^
- * 计算GDT表的32位基地址,存入GDTR *4 c" i- [2 q& N) R( k
- ********************************************/
, j+ X" y# o( |1 j3 O! o - mov eax, ds% e9 Z1 Z; X) s' z4 l/ L5 G
- shl eax, 4
# I( {+ m' ^8 \' z% B7 d - xor ebx, ebx
+ m! F, j- B e! I6 B) O - mov bx, offset GDT_def+ { t, c4 U+ p8 A; C
- add eax, ebx% t! z% ?% f7 P# E/ b4 U. ^
- mov dword ptr GDT_Addr[2], eax8 J( c% O6 ?% X' q9 ?
- lgdt fword ptr GDT_Addr9 |. n1 ]7 k% b D& ]
- /********************' r8 Q }( a) h+ t
- * 选择子偏移 *
( r" _& U7 t) J) E# {, F" } - ********************/8 y _' b) i& B) P- m
- mov bx, 8
0 `/ }5 k" B$ X/ Z8 a - mov eax, cr0
y9 i- w( w+ m - or al, 1 u# Y+ ?: E5 w: d
- /**********************
" S+ U1 l& c; E - * 进入保护模式 *; t( A/ X1 m; f8 V8 B( B3 `
- **********************/9 d$ w" C% d$ ]2 X
- mov cr0, eax* a& D8 J0 R+ A3 e3 U. k+ s
- jmp pMod
8 S" }$ W2 U4 Q9 c% p) a - }
+ e3 y! `0 p4 D, B
; D& R6 e8 @$ m0 @1 `" v; T- pMod: asm{$ u L/ H5 k# [/ O2 [4 S. i
- /************************************************************
6 M" T0 K9 G- n5 m5 v6 t. u - * 让fs与gs加载选择子,使其能访问 0xFFFFF * 4K (4GB) 空间 *: {% b$ K$ E5 Q
- ************************************************************/8 H( O2 \# p5 A7 E
- mov fs, bx
( ]0 r5 P6 Q3 Q! O4 f" K - mov gs, bx5 e: k4 }5 w2 X4 O1 c: }; `; `' I5 n
- and al, 0x0FE
9 P# \5 f: e X7 q - /******************( X7 v+ n% |% C; o
- * 进入实模式 *" R6 O) M% F: e6 }4 R
- ******************/
: v: _' |8 b" [- s( H, ]% P: R - mov cr0, eax. y/ @! b' Z Y
- jmp rMod
( x# K1 _* O5 B1 B ?' u - }
6 ]5 b" r5 e$ O, {# I - ! I% s; g5 ~6 m( @6 i, C
- rMod: asm{- F& ~ {& G2 v& s' g* T
- /* ******************************************************************0 l& @- s, p% O, U2 u0 H! }- n! b2 B
- * 退出,fs、gs清0,访问系统内存可用: gs[32位,相对于0的偏移地址] *5 y( l( L5 }, J* `( q' E8 i
- ********************************************************************/
8 g ^ q6 C( \# Q5 a - mov ax, 0$ C7 O5 t: i) y! |
- mov fs, ax2 n: X; o; ?7 o! R2 d
- mov gs, ax
4 J# ?9 r) |8 j6 U' J - sti' |# E! Q) G1 N* A n7 x
- }8 }8 @# P, O. M: I
- }
复制代码 这是asm的- ;/********************************************************************
% `# L' o' M8 D6 s, ~; V; t - ;* File: DOS4G.asm *
, w3 ~9 z& P( h! p - ;* Compile with masm ( Editor: Tab size = 4 ) *9 _1 N- q2 w& f4 X* w8 k1 d
- ;* *
" V( `: _1 E" L! I" m/ s - ;* ========================Title=============================== *
; A! Z4 h7 n& s7 E+ t" p - ;* 这个demo是让系统进入DOS 4G模式,进行数据访问 *$ f9 w# X$ q: K) y: B: C. r
- ;* *
3 N; u* ]6 D% G- D! r3 C) g3 V - ;* ===========================History========================== * }1 G0 P; J' P, ^' M8 J& A
- ;* author: bini *
i4 q% j5 H0 Y7 l/ X# P - ;* date: 2008-10-08 Frist version. *- s& ?% z' M* r! p d
- ;********************************************************************/ 4 D/ z3 Z+ k6 z8 c- I& b9 s4 T; D# i
- .model small; g6 z0 I" m7 s9 _ v2 V; @3 J
- .586p
1 t; ]! [5 w) {7 q' w( x$ {0 u - / ]) m+ o& e e: T# a% {
- DSEG SEGMENT USE16 ;16位数据段
+ z# R* g" a1 G - ' N" D* @* q8 z2 Z2 s/ y" u2 v
- DESC STRUC
( v0 p" g6 P i5 ] H' z, k e# T - LimitL DW 0 ;段界限(BIT0-15)
+ S% F& m z( W& }1 I( n - BaseL DW 0 ;段基地址(BIT0-15)
! L# j" y9 G% i$ D5 I - BaseM DB 0 ;段基地址(BIT16-23)
6 w7 C+ K9 r4 [ - Attributes DB 0 ;段属性5 v. J' Q+ ?/ N! X5 Z
- LimitH DB 0 ;段界限(BIT16-19)(含段属性的高4位)$ ?1 U2 G5 U& [) o `
- BaseH DB 0 ;段基地址(BIT24-31)7 H1 F6 d1 w' l$ _' R9 w
- DESC ENDS4 O I0 ~9 ~% K# K' L H
; L# J5 z/ C6 X; {7 u+ p& J- PDesc STRUC
& N" t# s% A" d4 {$ n1 g5 h6 @ - Limit DW 0 ;16位界限
5 S) E/ T f& j: S$ C( H - Base DD 0 ;32位基地址
7 P& s, k# h* V - PDesc ENDS6 ~/ [. z7 A% ~+ A/ K4 a
- 6 O$ t% s" k6 K9 \/ _* J; ^
- GDT_def Label Fword# W, C( g9 R D5 D. _
- Null_Desc DESC < 0h, 0h, 00h, 00h, 000h, 0>
) n& d$ K+ Y( S0 E - Data_Desc DESC < 0FFFFh, 0h, 00h, 92h, 08Fh, 0>
( b8 j# m2 E( P' F: b8 x" m
7 e; i% {1 S9 D6 K$ p8 m$ t+ |- GDT_Addr PDesc <$-GDT_def-1, >9 s1 Z8 h2 D# ~3 y4 e
- DSEG ENDS ;数据段定义结束; U3 r& w, i a- T
- ) s& J/ g$ p4 E3 [; l
- CSEG SEGMENT USE16 ;16位代码段5 Z- @- J& m# V/ h4 F# e
- ASSUME CS:CSEG,DS:DSEG# P$ `7 i S5 }" r6 P7 s* f
- .Startup* s$ m3 U* n- F( u7 w; ?; J' }
- call Set4gb
! V! ?* Y) ?2 v3 g - ;
: O: X s: z% g$ s! d/ ] s - ; fs, gs即能访问4GB空间. g7 P, O# t9 M4 N. b, b
- ; write your code in here.) E0 t7 }3 P' B% X+ f$ [
- ;* j, ?8 k/ f+ O) l+ A" g
- .exit
, w4 S. f) m9 H B -
4 W0 W# j. k6 D1 C - Set4gb PROC NEAR
3 l- c/ \( B, S - in al, 92h
# L& }/ O* q! v( ] - or al, 002
# A/ C6 t; l0 x) A - out 092h, al b! H- Z7 T' Z5 [
- out 0edh, al
6 _1 s* E2 j2 ^: [ - n6 q; j' [/ [( b8 }3 J0 T
- cli
1 c& t+ _/ r2 t/ K$ z. C" n4 V5 _
$ E5 P9 v( G6 K7 Z2 H- ; mov word ptr GDT_Addr, (2*8-1);" m& c0 B* z; Y7 R4 s8 t p' }
& S R# U) K& O3 t$ J, d# T- mov eax, ds) j$ J9 f7 V* [. V% ^
- shl eax, 4
) f: d! P6 Z$ D' Y% V8 ~ - xor ebx, ebx
+ v- u, P' ^; ]3 ~) W2 B% A" K - mov bx, offset GDT_def7 ]7 h/ n* z+ f+ D' M& W) D
- add eax, ebx: K# ]; P# d5 e0 _2 \/ `
- mov dword ptr GDT_Addr.Base, eax; S( D! v- J K" B: X7 x
- lgdt fword ptr GDT_Addr" q; ~0 j3 N- d. P( Z/ M1 B/ G" ~
+ W3 [. n. g% Y" Y6 @- mov bx, 8$ t0 a. S6 T6 B3 `) D- m
- mov eax, cr0
" d" z# | w9 T* W - or al, 1
* f5 h5 r( f0 v/ k1 r - mov cr0, eax
# W% e6 ?( [: E9 W/ d+ ~ t - , u0 S( u6 a4 b. X
- jmp pMod, t8 t; S5 I+ L+ D8 F- J- `, K0 }
- pMod:# Q3 ]- V+ Q A) n# }5 }* m
- 1 Q' I/ y, w) c1 I j# X- ~* L. [) p
- mov fs, bx4 k: C$ v' G7 i/ r. v. h
- mov gs, bx
. O- \; s% a: A - and al, 0FEh
" t+ l+ c/ D7 V; n; e3 A: `6 y - mov cr0, eax: M$ L0 ]& n9 k D5 Z$ d3 z
-
+ P, g1 w2 F. | - jmp rMod
: Y1 Z( r; p; R- z7 \5 t - rMod:
. D1 H/ N" E! P, q/ i7 `
6 U0 Y# h" Z6 @0 ? P8 X- mov ax, 0
! M8 N8 T& _- w, b L! b+ S% t - mov fs, ax
9 \" j, @" S& |! g - mov gs, ax
5 n: g5 c3 G# u0 f, a/ [% H- T- H - 1 ?& }3 J* V0 c( h0 `. M0 I
- ; 在2M的位置测试写一下数据* X0 \7 g1 g- ?) p9 I8 ?
- mov esi, 200000h8 l5 f$ w( }; B
- mov dword ptr fs:[esi], 055aa55aah" o6 I+ F$ C2 D3 h1 ~' d% q
- ; 用RU去看看200000h的位置是否是此数据....
' G4 k) t# j P8 s6 v - - {+ Z: K/ D' }# N
- sti0 n+ \) O. O" K" f! q, F0 b
- ret
1 q3 U1 g- j# m) t- G+ L- p - Set4gb ENDP
+ }+ I! H: G& v4 D5 J3 e9 @, G# | - 6 F$ V) E% l4 N
- CSEG ENDS ;代码段定义结束, e' Q- A" |1 K+ F W# A1 j
- end
复制代码 |
|