|
|
刚学习的同学,有些还不会,我这里贴点C和asm的代码。只供参考。
, o" F: m: [7 O$ ?! h& W* i7 \: N/ H
这是C的- /********************************************************************5 e& A$ y# H' K9 L# z$ s9 N) \' C) g
- * File: DOS4G.H *2 U% O3 U9 f$ [* x5 M
- * Compile with BC 3.1 ( Editor: Tab size = 4 ) */ W# M" U0 n8 P
- * *9 l# K4 \- ^5 t/ d* w" V1 T/ V6 [
- * ========================Title=============================== *: }3 |9 W0 K) C3 G7 g6 j9 U
- * 这个函数是让系统进入DOS 4G模式 *
5 F w+ U2 a: S" V% {( x" B( _! b: n - * 程序参考了:陈家琪《DOS实方式下直接访问4GB》 *
. k$ X K- i+ m; P. _ - * *1 N6 [/ Z* X2 v9 t) [5 [- v
- * 使用: openA20(); set4gb(); *
8 ]& I) [& W+ n6 F: K - * *
9 |1 W. t+ K# S+ W. N - * ===========================History========================== *0 \2 o$ g$ }; a, l
- * author: bini *- B, G& b8 ]% m S+ Y
- * date: 2004-11-30 Frist version. *. O7 s* T, t4 f$ d" c Q/ Z* E" h
- ********************************************************************/
. o4 k# G( e. t9 |
; w! _" ?# s2 F, U, T- #include <conio.h>4 P5 ?' V6 ~) S/ s
- #pragma inline7 b2 q# {0 |6 k
* ?# l+ E) W$ A$ P- e4 U7 R- /***********************************************
) @" t8 l, s2 E/ S- O f0 c - * 两个GDT,第一个为系统使用,不管,默认为0 * ^- m0 N [5 {. c" ^8 {) H- Y
- * 第二个为一个数据段,没有代码段。 *
6 y: T' V+ ]! T4 Y% _3 o- E, o - ***********************************************/5 y# ?' K5 P7 [" Q" z
- unsigned long GDT_def[ ]={0,0, /*系统使用*/
" [4 ^" x- J" C/ y- [# h - 0x0000FFFF, /* hi16bit( 0~15 ) is base low=0,
- P$ p: ?% ~( N4 U8 r - low16bit( 0~15 ) is limit low=0xFFFF
f6 X/ v" R/ Q- o! n/ b - */
6 K1 Y; e E# S - 0x008F9200};/* 最低字节为 base( bit 16~23 )* `7 t9 _0 h5 T3 g! K1 Q
- 最高字节为 base( bit 24~31 )
6 v7 s" e7 n# [( V5 ^ - & Z0 r. {3 S j) p$ W+ o5 J: q
- 属性Attrib = 0x8F924 ?; \+ G/ ~$ M, a) z: S
-
! O6 H% | q7 W1 C1 \0 Q - 属性位Hibyte低四位为
" F( f2 |. Q2 N/ ~& J - Limit( 16~19 )=F
# e" H9 }( U0 n i# Y+ R- T - 属性位Hibyte bit7 为粒度 _0 u( k2 n7 F# t ~* f& J% A
- (值1=4KB粒度)6 T* x# H4 ]0 B& W3 J E
- 8F & 0x80 = 1
+ h3 e4 h7 ?6 ^8 R -
/ F0 \" g! V9 C3 M& H5 C - 属性位Lowbyte低四位为段类型,值=2
2 c4 y' @6 q$ m4 y3 b# a - 表示为可读/写段( h+ X# Y* u3 h7 N4 ?) z n- t
- 属性位Hibyte高四位=9,bit3=1表示:
2 ^5 t2 J: @( A9 D0 w+ ` - 描述符对地址转换是有效的。
@5 N, D$ _ L - bit0=1表示为:
. f8 S# g' q, \$ S' d - 系统段描述符。而不是门描述符。' f; L5 \7 T1 j" E% G* P- {
-
2 V- B" v" o0 D6 E3 u# O - */5 K. C; s/ U- W9 o8 s
2 i: X8 F; g* M" c3 l4 { ?, C- /****************************************/ A0 @0 l( [, @' W6 U/ l$ E& j
- * GDTR寄存器, 48bit=6bytes *
8 o1 n. C8 ?+ q, }, `3 u - * +-------------------------------+ *
4 _' I5 v4 r2 o* y9 E, b - * | 32bit基地址 |16bit界限| *
* g# B) ~/ p$ K( d' _/ j: E1 \' Z - * +-------------------------------+ *. h' q: g/ f4 U: @2 j
- ****************************************/, {+ x6 |3 t1 P9 g! g* c3 v2 O$ Y' Q
- unsigned char GDT_Addr[6]={0};9 [0 [* a) S/ }8 S
- ) ~5 q' P3 ^) [5 Z5 N, [
- /****************8 O+ x3 W! i0 ^! v# t0 l1 ~% g1 m+ G
- * 打开A20门 *9 \7 ]5 E# g5 A9 Z
- ****************/
) R+ F& t+ A2 C e - void openA20(void)
: P; ]' ~# m* w; ?" ` - {2 R) C" Z& p: r0 Y3 U0 }
- asm{) K2 _: K8 Z7 K o1 T- B8 b
- pusha8 k) h. U6 _5 k; R
- in al, 92H
' W" k% Y6 T& f0 z7 w4 a. G - or al, 0x02& e7 `. @, P& ]7 B0 X- I4 b
- out 0x92, al1 K' ^. s5 N9 |
- out 0xed, al' X, N" a0 l% n# V
- popa
4 X" u1 _1 \( i K: B8 D6 B - }5 y' L1 S) T* I' d0 E6 _
- }
+ D1 S- D6 n8 J- I) q - - Z3 K' M8 a) s; o6 i
- /***********************************************
$ X" }& j* ?" g: M7 Q8 a `: z - * 函数功能:进入DOS4G ** M9 T2 [! f9 n7 j
- * ==================== *- z$ R7 s3 G5 ?) Z0 q
- * *
8 ]3 _3 J+ X( n( h7 J - * GDT描述符界限计算方式:描述符个数*8-1 *
n1 r; {* A a9 B/ K& J3 C - * 如: *7 R: j, \9 `9 b6 V) m
- * mov word ptr GDT_Addr[0], (2*8-1); *3 A( N g) U; {+ r9 Z' |; S
- * 表示为 2个GTD *
0 G/ ^; J3 q: `% J k - * *6 s( G/ t6 N, h
- * 选择子为所在描述符内的字节偏移。 *8 w, A: e- D! l
- * *+ U* S3 @, D2 w5 y0 q
- ***********************************************/# ?' r" e7 z& w. A' B$ p; _
- void set4gb(void)
/ k2 W7 p( e* ^: n4 h4 b- L% I" c! ] ~ - {$ u* b( ?5 G: P
- asm{
# R4 K8 A4 k5 I - cli- c, M% P5 @; B" v6 W7 a* F
- /****************************************& G- O/ D5 p2 n# m) I
- * GDTR寄存器 *
4 ]- k1 T: ~4 i9 E* Z2 E - * +-------------------------------+ *
5 x9 Z2 l S+ } - * | 32bit基地址 |16bit界限| *
/ b4 x% p: m* _& \' e$ _1 c. Z# y, o - * +-------------------------------+ *' F2 k4 @. i. S" e( \- X: L1 _6 \
- *****************************************/0 l. G% G* R8 Z" f3 n; C1 W; {
- /*********************
E9 G9 q8 }, U6 t - * 得出段界限 *9 k5 T0 C# j/ S! k9 k
- *********************/
" ?$ |: ], U. m' E: E - mov word ptr GDT_Addr[0], (2*8-1);4 c7 T* l* n1 S* S- O& a# Y
- /********************************************5 `0 `4 e7 R; w- G3 S) a+ k
- * 计算GDT表的32位基地址,存入GDTR *
( E2 S% O% j0 F& H9 y6 U - ********************************************/
) K8 X! G0 @8 u, I; r0 B; Q& N$ p - mov eax, ds! k; g$ |9 ?: E. V9 {1 O
- shl eax, 4
/ p% q; K3 }. A - xor ebx, ebx
3 L; T) z: O8 @# P - mov bx, offset GDT_def
( `6 Z* l8 R$ x* n1 Y. L# l/ U - add eax, ebx D& ?& O" ^2 A' x) l
- mov dword ptr GDT_Addr[2], eax
6 w! Z c+ a. g3 H0 ^% K - lgdt fword ptr GDT_Addr3 a' t4 f" B. d1 {& t7 i
- /********************
w8 \' h" X. K; u - * 选择子偏移 *1 b: K7 L: C5 @" A$ I7 C
- ********************/( L2 m. ?9 i0 S+ u0 s
- mov bx, 8
2 Q$ n r8 n$ P" \) |# | - mov eax, cr0; E6 @: P8 D) }5 S( y. J
- or al, 1/ l* T6 O8 ?& }0 v3 |* `
- /**********************( @# A u1 m9 T& I/ J
- * 进入保护模式 *
" }5 v. t2 o! @& Y) x% P. k - **********************/
( @; s6 B/ z+ B - mov cr0, eax
5 [, P( I: k% l0 R - jmp pMod
, ^' P, I: S0 v" B - }
& k. n2 b7 S0 Q" x2 x* O, M+ [ - 3 |/ K+ z" S; t8 e) k% h! W) N
- pMod: asm{
1 H& K# X$ b% z# l, Z. p4 Y - /************************************************************
6 ?9 H, g0 Z9 T% j - * 让fs与gs加载选择子,使其能访问 0xFFFFF * 4K (4GB) 空间 *
5 o9 D2 S7 ?+ Q1 m - ************************************************************/
( W2 E& S/ h' e) Z - mov fs, bx: s, S$ [) x9 ]6 |: L+ d
- mov gs, bx
6 E6 K: J9 ?" i) E0 b; W, A: C - and al, 0x0FE" o& v: Q/ r& E, ~5 k7 E
- /******************
8 H4 T6 r# z* A4 L# U3 ^ - * 进入实模式 *
& d& J( T; W) t7 Y e - ******************/$ p) z: p# t- k2 [% P3 t: f
- mov cr0, eax
K- C& o* {' }& ] - jmp rMod2 X: K* i0 [% Q/ c5 Y% q) ~
- }
% f. B3 z+ m2 S( R6 H8 a
" k* X2 Q" T, k/ B1 Q, \- rMod: asm{% M8 j1 h; k0 z1 \6 Q1 O! A5 h+ j: i4 P
- /* ******************************************************************
$ Y( K/ F* S) G- J/ @4 ^3 G - * 退出,fs、gs清0,访问系统内存可用: gs[32位,相对于0的偏移地址] *2 \, d4 f" H& O- e( ]4 J& |# G( U
- ********************************************************************/
( L' Y2 s' I: X. _1 ] - mov ax, 0
9 U: D$ b% A" J2 a4 Z+ E3 y! v - mov fs, ax0 N1 S, A* n. h- |' C" m
- mov gs, ax* ?9 d# g- H1 Y, X0 k
- sti- ^7 Y0 a8 `0 ?9 s1 v& t) k
- }1 h# z+ ^1 t! o8 M7 T; i/ Q5 p
- }
复制代码 这是asm的- ;/********************************************************************
H. @( Z) P4 y3 w- j4 D - ;* File: DOS4G.asm *6 B: c$ H( Z G8 q1 z
- ;* Compile with masm ( Editor: Tab size = 4 ) *
3 I/ B: Q# s1 x- k - ;* *6 I1 e8 D- t0 C% G; d
- ;* ========================Title=============================== *
d* B. {! i0 ^: E7 O/ S - ;* 这个demo是让系统进入DOS 4G模式,进行数据访问 *: E& M- e5 I4 f+ `
- ;* *
5 m( D @1 N' C) a& H } - ;* ===========================History========================== *
1 X1 Z- \* e9 k1 q( B - ;* author: bini *
* l) [) x* T1 n* V0 P - ;* date: 2008-10-08 Frist version. *
# z: K! r; h- _/ z, I - ;********************************************************************/ - X" t, s8 d B' V9 P7 h
- .model small
* Y) T# U+ \) z3 f4 | - .586p
- K; i! a# f1 n -
3 h* l, j# e# e - DSEG SEGMENT USE16 ;16位数据段- @9 T# E6 M; B# ]; `$ b1 W
- $ D3 a# u: J7 R6 m j- L2 d& @8 o/ s
- DESC STRUC3 F w6 A$ Z7 s U7 b
- LimitL DW 0 ;段界限(BIT0-15)
' _. {8 p8 p$ k8 }+ V+ F. g - BaseL DW 0 ;段基地址(BIT0-15)* F* S/ u- e( n3 {7 t
- BaseM DB 0 ;段基地址(BIT16-23), E7 ?4 l; X/ t# x
- Attributes DB 0 ;段属性) W1 G8 S' c' H. @) k& T7 {1 c
- LimitH DB 0 ;段界限(BIT16-19)(含段属性的高4位)
8 _( k6 u" X8 W2 y - BaseH DB 0 ;段基地址(BIT24-31)6 K1 m1 l& U$ \6 q) ~/ T
- DESC ENDS0 F" R$ w9 | m' R# [' ]3 _, Z
- & i0 I8 c( F+ n
- PDesc STRUC$ \2 w6 q: A$ T
- Limit DW 0 ;16位界限
, k# h9 c7 w5 O! ` - Base DD 0 ;32位基地址/ Q' Y0 y1 h2 M; z4 y0 J
- PDesc ENDS# |/ S- D5 [3 z" q; R! S
& H# v5 N8 R. w' M$ B; U1 j- GDT_def Label Fword
( _; \% o* x$ F. f: Y - Null_Desc DESC < 0h, 0h, 00h, 00h, 000h, 0>
1 G/ L6 c c! i) {. l* G2 L7 p2 o - Data_Desc DESC < 0FFFFh, 0h, 00h, 92h, 08Fh, 0>) @. @ b# _7 W# Z; a
- : i+ g" O ^8 b
- GDT_Addr PDesc <$-GDT_def-1, >
" S% Q- t* r9 @9 y7 f& ^ - DSEG ENDS ;数据段定义结束
_( R1 @' E0 A) ^' R - . z4 L- C/ w. i" [& h( _8 H
- CSEG SEGMENT USE16 ;16位代码段: d& t- N; ]& P- Y V3 ]
- ASSUME CS:CSEG,DS:DSEG' j1 y& p P! ^! A9 R, T
- .Startup v/ f; _. W/ r! D* P
- call Set4gb! x, _0 [# Q' R* h6 P
- ;
X# ]6 g9 `9 D8 o; m& \) ` - ; fs, gs即能访问4GB空间" \: `+ @7 ]/ a' f3 L$ E" B, y
- ; write your code in here.
w. {& u7 s2 @( i3 @/ u - ;' T9 U0 m. V: T5 O7 C
- .exit8 ?/ k7 S" E4 R
- |5 @" T' r) a# w3 ^3 A7 X4 k
- Set4gb PROC NEAR
$ J. w( K! R1 D/ O% M - in al, 92h
! M" i# T- `( S% E1 X( i6 B - or al, 002
S- U1 F5 S6 v* Y* I - out 092h, al* O5 d. ?2 S9 M) z5 i# V
- out 0edh, al: [" w$ l9 y% Q4 j1 c5 c* ?
7 [. |. W: D8 p+ i- cli# e3 o7 ~% X( r/ O0 ^/ j! P6 E
- 1 P+ w3 Z7 U" ?, C+ T. t
- ; mov word ptr GDT_Addr, (2*8-1);
! o* Q% x% J& M2 I+ A- X - & d9 g% L! m# `
- mov eax, ds
- s! K9 @5 s5 F1 \: r% b+ S - shl eax, 46 j9 g- ~! B. C& m- e0 [; f
- xor ebx, ebx- f' U* d7 k% u. e
- mov bx, offset GDT_def
- ~' N2 v7 W! f2 n- m1 v1 q7 O - add eax, ebx% q( v. F i* X a7 [8 k9 Q
- mov dword ptr GDT_Addr.Base, eax
; U5 z& i' @+ X) { - lgdt fword ptr GDT_Addr
' l1 U( [9 I ]! i: C
# A* l; p6 W9 K9 Q# U# j- mov bx, 8
0 O3 U8 {1 M4 p$ j - mov eax, cr0% M" U+ x L# N' C' V
- or al, 12 I2 \" o6 f5 l# I( D8 v/ ?- `
- mov cr0, eax% L" C3 G) v: D7 |7 _5 D. [; }) \
- 3 r0 O/ e$ g$ o
- jmp pMod
. n. N, s. i: {/ z - pMod:
) _" k5 A# D2 F* O0 ^+ f$ _ X - ) n9 A5 C) q G
- mov fs, bx
[# G. K+ ~& h/ \ - mov gs, bx
( ^, L8 i' w1 _ - and al, 0FEh5 t" ~% S* ~* ] y6 i/ g0 `4 y
- mov cr0, eax
0 J+ M" o2 ?, s' B7 K -
: X; w: h6 T0 c7 ~+ f/ H B - jmp rMod
$ J, p5 b& _/ Y8 i& W - rMod:& i7 E: u& l0 r+ R3 ~
- 6 F! r& u% X- q6 Z+ @
- mov ax, 0
2 E& F8 i& O* a. |6 S - mov fs, ax
* C# Q m5 _& U( m - mov gs, ax
- \# ~8 ?, }+ q; ]% o% e -
% {7 G3 Q3 D c/ q6 U5 O! C/ r& E- D - ; 在2M的位置测试写一下数据/ F0 Y8 R3 `7 E/ I
- mov esi, 200000h) W1 f$ S3 e! s" O7 P) g5 n) ?
- mov dword ptr fs:[esi], 055aa55aah1 x' S& R1 I D$ ~( _. W# ]' e2 C& ~# ^
- ; 用RU去看看200000h的位置是否是此数据....
H: G3 U* l" E# _: a4 `8 X. P R - , a3 k6 l- X" ?" C
- sti
" v2 f2 Z. m3 X/ U; w/ Y - ret9 b5 m" O1 ~$ P. t
- Set4gb ENDP+ o5 }6 s7 [5 }* B
- ; f( F3 a( O( N
- CSEG ENDS ;代码段定义结束& |3 g- h0 J1 `
- end
复制代码 |
|