|
刚学习的同学,有些还不会,我这里贴点C和asm的代码。只供参考。
/ `4 }! w/ F9 ]" a) z0 r j2 a0 I/ B, L o) Z! w) j
这是C的- /********************************************************************5 c" t, r" F8 w, Z" v
- * File: DOS4G.H *) x, M- s9 h8 \8 V3 ^
- * Compile with BC 3.1 ( Editor: Tab size = 4 ) *
/ R$ {% X, j* Z# e Q5 Y* D: [ - * *
, O9 B. n N) a0 y1 r - * ========================Title=============================== *
& R5 y4 m: \- W - * 这个函数是让系统进入DOS 4G模式 *$ a# A8 n& |8 z( M- u4 g5 ^: ^! d
- * 程序参考了:陈家琪《DOS实方式下直接访问4GB》 *
5 F! s2 [3 S, _& I1 s) F - * *7 I% p1 x8 m8 a( b# t- n e6 n
- * 使用: openA20(); set4gb(); *- ^$ e: ^& s' ]0 o+ S
- * *
2 j2 @& l7 m) M$ i. Z8 t; Q9 s8 O0 u - * ===========================History========================== *; G( `; R$ y2 _
- * author: bini *
8 y" N5 Y/ i5 Y+ b) Z% d, O - * date: 2004-11-30 Frist version. *1 l1 O; G. T# {: ]1 d% G: H
- ********************************************************************/. D* S! N# U! S8 k$ @4 e
8 k* A( t0 {" E# a5 p- #include <conio.h>" O, W V; y6 e0 P. g; {1 l
- #pragma inline
+ ?% z, S- R! p
# _6 m4 |9 Q$ {( Q% h4 n% E- /***********************************************8 r: X, P& i ]/ Q* }& v/ L
- * 两个GDT,第一个为系统使用,不管,默认为0 *; x# @/ b! U J6 L$ f
- * 第二个为一个数据段,没有代码段。 *
, H* I2 G/ c& `% L4 ? ?) q - ***********************************************/
1 p l8 L6 k5 D7 k k$ ] - unsigned long GDT_def[ ]={0,0, /*系统使用*/
4 E7 k; @' g6 p6 p! O& r; p; M - 0x0000FFFF, /* hi16bit( 0~15 ) is base low=0,
' F9 W% W8 b$ R3 E5 L$ P' y - low16bit( 0~15 ) is limit low=0xFFFF
# Z8 x: w5 L! F9 t - */5 |. ?; D, |( _0 y
- 0x008F9200};/* 最低字节为 base( bit 16~23 )
, [8 ^7 S9 O Y: x* P6 Z - 最高字节为 base( bit 24~31 )
- K. w) m' R, x- M4 y$ K$ G$ }7 } -
7 Q3 l4 D4 ^7 k1 o3 Q - 属性Attrib = 0x8F92
( a. c6 e' D) v# e! b. Q - / d3 ]3 i+ ]5 g2 m! h
- 属性位Hibyte低四位为 3 g2 p& F; T2 T' O2 o1 {
- Limit( 16~19 )=F
! D W% N) }- N/ ~ H( Z9 I0 v6 b - 属性位Hibyte bit7 为粒度* K% P C; P; D$ K
- (值1=4KB粒度)
# m# |% y; I6 T1 `9 ] w2 Q/ G) N - 8F & 0x80 = 1
& W: ~( Z. r1 T( s" u$ v -
" u. b$ k( D3 m, a' y. N2 u+ W - 属性位Lowbyte低四位为段类型,值=2
# E0 N0 A% f |. Y0 u - 表示为可读/写段
+ M8 Q% Z3 x& p e - 属性位Hibyte高四位=9,bit3=1表示:) d2 p9 {: f% W: K: F
- 描述符对地址转换是有效的。
( b5 }$ I. G6 Z2 ~ - bit0=1表示为:
- \$ \0 i( Q; s2 S5 x/ N3 i e - 系统段描述符。而不是门描述符。
! v1 c: k3 `8 R" [+ K7 | -
+ J3 E3 D) [: ^ j - */+ X" d2 p m8 ^8 h
- 2 {9 a' O* B7 O* \
- /****************************************
_1 K2 R# c- H% }+ U% f4 U( v - * GDTR寄存器, 48bit=6bytes *- _2 b$ i3 f4 E" K
- * +-------------------------------+ *
+ [3 A/ }, J9 o - * | 32bit基地址 |16bit界限| *
8 s8 K9 P+ G% ]4 c" s - * +-------------------------------+ *
4 @* d% D E& R9 p4 U, ^8 d6 h" { - ****************************************/' Z% R5 l) i3 u8 l$ K
- unsigned char GDT_Addr[6]={0};
, t6 Q. ~( U! Y5 L. d - & ]- f, O: h# q4 d
- /****************
y9 o' ~) @, f* }+ v7 n/ B, c% R2 O - * 打开A20门 *& j& a1 Z9 l% \
- ****************/
3 i- R$ {" j9 I$ U: B) b - void openA20(void)4 x, d6 E, `" A6 c/ ~0 A* T+ X$ m" |$ m* f5 Z
- {
3 D- ^& m: W! R$ L) B/ R6 u* ? - asm{
* L0 E4 ?9 b6 s0 v - pusha \4 W+ e q! a, b/ G
- in al, 92H
9 e4 k: t) f$ o2 _: s3 O - or al, 0x02
5 H( i7 r; D6 ]' f* L - out 0x92, al
) U, Z) a2 s1 y# D6 } - out 0xed, al1 O: X5 s4 Y) j4 B* O1 y
- popa
5 O* o \& i) }, r - }
- k' t- m; ]$ q9 Q/ g - }3 J: L$ l- c0 Q- q1 M* e* C- x* H
- - |2 M2 T0 T5 _9 U y8 A
- /***********************************************
* A$ b+ `* W- ^* e/ D# T% W - * 函数功能:进入DOS4G *% S- p/ l/ Y; x+ {/ f+ G
- * ==================== *- q& ^3 q3 ]7 X% `- t0 ]
- * */ m: X v) \. h! [, k
- * GDT描述符界限计算方式:描述符个数*8-1 *
$ h" ^6 m2 R: Z5 D0 X. ?# M1 w { - * 如: *
9 Q% p& x: L8 b) M: E - * mov word ptr GDT_Addr[0], (2*8-1); *2 f6 I1 t t- G
- * 表示为 2个GTD *2 i F+ e" y3 n, S
- * *
4 D$ ]: E+ A5 y - * 选择子为所在描述符内的字节偏移。 *1 ^1 y$ o/ r" i; Y8 R
- * *. T' T2 m. H* y" M( u9 L
- ***********************************************/
4 \: B/ S* |; |% ^6 M. M - void set4gb(void)
- x! ?" Q9 n$ _; m$ Z - {
! @4 y+ }& i/ a2 o5 h: V - asm{, {, ^3 B" s0 P/ I, J% E" b2 ]
- cli
# J* F7 m6 C" j' c9 f& ?6 P - /****************************************
3 F: s. B5 O) n4 c% s: E" ]2 Q2 u8 q - * GDTR寄存器 *8 D% R; l1 B" ~1 t0 u1 j
- * +-------------------------------+ *2 Z. n/ W% z- B( S
- * | 32bit基地址 |16bit界限| *. l0 \- ?3 J$ R6 b
- * +-------------------------------+ *$ }* Q0 {; p- a# b4 W, V, t
- *****************************************/. {+ { R, E. [' Q' n5 j' S% y1 y
- /*********************; k7 r: z8 b. U
- * 得出段界限 *
* W2 T8 j" k% H B, {: L - *********************/- T4 }7 b+ Q4 l' J. S6 ?
- mov word ptr GDT_Addr[0], (2*8-1);
4 r% N, A6 H! G. K+ y5 x- B( ? - /********************************************/ W3 s% y3 `" g
- * 计算GDT表的32位基地址,存入GDTR *2 s+ X! d) p3 J$ |9 q
- ********************************************/, c. g5 j6 L' a
- mov eax, ds
3 ~" r- @% m/ d1 M - shl eax, 40 w* p8 x* k% |5 g
- xor ebx, ebx
4 H5 D- a) T5 x3 {; D/ f3 a. s - mov bx, offset GDT_def7 r& c7 ]" s& \. L- p; z
- add eax, ebx
5 ]% _0 X! A6 |6 O; h0 B - mov dword ptr GDT_Addr[2], eax
- j2 X, s7 c! |6 G: D% R6 u - lgdt fword ptr GDT_Addr. K8 K6 r# }3 z' \2 [( c$ s* y% ^3 D
- /******************** O( R% R) v/ N0 u" D: t% w
- * 选择子偏移 *" o6 R M& Z" F. \7 ~# E
- ********************/* ^2 {; } J, ?1 q
- mov bx, 8+ G' Z6 d/ r9 Z$ \: q
- mov eax, cr0
/ a+ V- B2 G( e* {9 S - or al, 17 i- G7 z7 S- P$ u$ L2 |* _* a
- /**********************# E y2 b7 D; s, H w8 o
- * 进入保护模式 *8 V% f, r+ u/ D3 ^
- **********************/
0 n" h8 U! t+ X6 O - mov cr0, eax* ~0 H' Z" H$ H8 ?
- jmp pMod4 a- h$ _% o! U& K. s$ L
- }
. d, Z8 u# L' H: i" D- C - 3 W7 e u9 q/ B9 _9 \9 V
- pMod: asm{( u! V3 D% h3 V! j7 n( b. d
- /************************************************************; z0 J/ b2 U% G2 Y* ^( u
- * 让fs与gs加载选择子,使其能访问 0xFFFFF * 4K (4GB) 空间 *
* V4 u6 X" `% d7 m: Z - ************************************************************/! T. Y- {$ o; [! N* ^2 e
- mov fs, bx
( t) \9 x" y7 i8 ~$ o: `# k9 s O - mov gs, bx
7 ] }) Z4 @8 f - and al, 0x0FE
) m( V2 b& ~9 g7 @8 [9 v) Z - /******************
/ K( u6 ?) M1 `0 O, ?( l - * 进入实模式 * N( W8 q0 g. x" h7 H( q1 i
- ******************/ w/ G' ^ h7 z% T$ c0 Q% F+ O
- mov cr0, eax
2 U3 X7 v9 {2 h3 ]0 W4 i - jmp rMod
9 k! l- u$ u1 f - }
( c. h/ ~! Z: _4 Y6 u; E - , G0 i4 {$ d5 E) @) T# U; @
- rMod: asm{
- I3 _; v& x' Y5 M# @3 B7 \ - /* ******************************************************************) [( N# ^9 y1 W2 ?# N5 g
- * 退出,fs、gs清0,访问系统内存可用: gs[32位,相对于0的偏移地址] *$ l* I/ I8 ^% ~3 Y( P
- ********************************************************************/
4 O0 `5 V6 m3 t* M8 ^/ C - mov ax, 0' p' B% { k; Y
- mov fs, ax5 r+ j5 b- c/ l4 s
- mov gs, ax
7 I- {( X5 y+ A% Z" f - sti# ]7 l3 x& }, w# M$ X& N: K
- }
. a2 |: E1 Z/ J - }
复制代码 这是asm的- ;/********************************************************************5 A: n0 P( X, i, y
- ;* File: DOS4G.asm *5 s0 Q" O+ P% K
- ;* Compile with masm ( Editor: Tab size = 4 ) *
/ F# `7 p+ D0 t T, ?* W - ;* *
6 G5 i- E+ V8 c: M - ;* ========================Title=============================== *
* {, ~' U0 X8 c! h3 } - ;* 这个demo是让系统进入DOS 4G模式,进行数据访问 *+ \8 m9 J/ v0 w& i
- ;* *
; j- `: X1 _5 n9 O0 J: F, T - ;* ===========================History========================== *9 R0 {& G: p) \% A+ {/ w1 L
- ;* author: bini *0 m7 f3 {! I# X9 F
- ;* date: 2008-10-08 Frist version. *4 B8 h/ r0 e. V. {; L5 b* i
- ;********************************************************************/
8 n3 l9 ^. }: E, v, V: ` - .model small
& q; j1 u" l" u) i% ~- V5 u) K - .586p
9 {; C4 M* h' s2 i# ` - * W, k; a% @4 H# h. L5 q
- DSEG SEGMENT USE16 ;16位数据段
% E' ?- u7 G+ \* e; M: L3 [0 X0 M$ T, I/ y
, P: F9 J$ R6 c% O, Q8 D3 r/ c- DESC STRUC5 }3 ]" E* N! O$ N* o( e
- LimitL DW 0 ;段界限(BIT0-15)6 n. b2 \: k1 m& T, o6 _; v0 }
- BaseL DW 0 ;段基地址(BIT0-15)
9 W; Q/ K- {9 y4 i' A& D$ [ - BaseM DB 0 ;段基地址(BIT16-23)+ g2 E* Y2 W3 G- R0 o0 {& c
- Attributes DB 0 ;段属性
/ c( O- x W4 [7 c1 t" y% ?: b - LimitH DB 0 ;段界限(BIT16-19)(含段属性的高4位)6 ~4 ^0 V' {2 |& m( z
- BaseH DB 0 ;段基地址(BIT24-31)
5 ?2 s- Z, u f( K4 A. E' O% w# a - DESC ENDS
8 {( e. V7 M. l* Y! _9 G - * z4 q, O( M$ ]
- PDesc STRUC
7 U" I) @. u" c& J - Limit DW 0 ;16位界限! R* K# [; `* Z: R& F6 t! H: r& `
- Base DD 0 ;32位基地址
5 X& U8 F; v' i5 k# X' Q, m- u) r - PDesc ENDS
; V0 v$ ~; p) ^ - - x. [/ I$ j, @/ f; @
- GDT_def Label Fword! E7 h5 x A) u" g9 j
- Null_Desc DESC < 0h, 0h, 00h, 00h, 000h, 0>
( s7 v$ g: m' d/ O' D r - Data_Desc DESC < 0FFFFh, 0h, 00h, 92h, 08Fh, 0>
6 n7 z" a" r V4 @) m - * Z$ ]4 U* p6 \! T6 ]" G3 t7 Z
- GDT_Addr PDesc <$-GDT_def-1, >
0 W: W2 ?7 ?5 X3 V& w - DSEG ENDS ;数据段定义结束
9 w9 {9 u* f8 u2 F; o: H2 T4 C - 1 U o# |$ v$ p* T3 z
- CSEG SEGMENT USE16 ;16位代码段
5 K4 S! u1 i& M" B0 G - ASSUME CS:CSEG,DS:DSEG
8 T- [8 u3 G5 P2 {! K5 W5 |+ ^ - .Startup
4 o: b8 P7 E, a - call Set4gb
' E6 O2 H: B4 @# j" @" E - ;: M( Q. B; }; s0 l- l+ ?/ v
- ; fs, gs即能访问4GB空间
6 a1 V4 w* t& [4 y( F - ; write your code in here.
2 U( K ]& j! ~+ r2 m, X8 N - ;
' x! j7 g" `9 @" c! G! L - .exit, F8 n; Y: a! q( k8 }4 n% }
-
9 @7 Z$ K- I! x7 e s+ {# f; ` - Set4gb PROC NEAR) T5 s `- `& E- O$ h
- in al, 92h
" J4 z \( {/ v9 w' @. t - or al, 002
7 o5 r- a8 e+ \/ j - out 092h, al
: q/ K0 a* t% g6 d. \ - out 0edh, al
/ E0 X! Q' r! r) L; ]4 X) `
" y* H/ v" a3 ]- cli
2 L/ J: E0 F+ ~* m. `% L; G - 8 M1 M# \5 o- K! X3 N2 Y3 q
- ; mov word ptr GDT_Addr, (2*8-1);
6 e2 G( C; L, h. a1 E
- p; s( f9 v, |) ^3 N& B- mov eax, ds
p* T# g, W: s5 N - shl eax, 4
. E6 U/ Y! W9 X- @ - xor ebx, ebx4 ~1 C8 @- k, h+ c8 O! w% z
- mov bx, offset GDT_def
3 p7 b! ?3 o$ U9 K - add eax, ebx
+ v; |4 K9 t1 L% N, P1 \ - mov dword ptr GDT_Addr.Base, eax7 F. S4 V$ H0 Q9 O/ \
- lgdt fword ptr GDT_Addr$ C6 y* k" o- f% U0 R
- ~5 p( t+ \! e! D( S2 j. P3 q- mov bx, 8
, X( M- o/ ]4 Y: Y$ a$ Z; c - mov eax, cr0
$ M% H0 r! r4 b) A" I$ W - or al, 15 d( K' ~) g# p8 s" Q' j7 z
- mov cr0, eax8 o. |* p7 d2 d3 x
- - w. U- o6 \: y0 j4 \5 q
- jmp pMod' k5 o/ c; \/ \/ C
- pMod:
3 p3 ^' h* h3 ?% _" O - w: K3 A. Y' t) R ^5 e
- mov fs, bx
9 l2 k: K' J6 M5 }; G) E - mov gs, bx
. a9 ~. X3 g; C8 ]% G - and al, 0FEh
% V4 N" S+ g+ y$ F - mov cr0, eax9 s, u7 k9 w, N: D: m
-
& `& Q# @* t9 U( C/ f7 Y" \0 T - jmp rMod
1 K( @& Z: G' G4 }9 y - rMod:2 }% v, q8 B& @3 t
- - {: R) j3 z% f
- mov ax, 0
5 m" ^# M8 f! h% x4 R, g3 w( J - mov fs, ax
5 D7 U0 U2 Q: w5 W - mov gs, ax5 j% J$ X: D3 b+ y6 d1 N/ C$ ?
- ; F8 r# X; L& u# N) @' Q. J
- ; 在2M的位置测试写一下数据) O7 E9 {6 g6 E6 I* V" R
- mov esi, 200000h
8 w4 G( v$ f& t+ l - mov dword ptr fs:[esi], 055aa55aah7 L& C; O- L% W4 }- n1 j7 f9 s
- ; 用RU去看看200000h的位置是否是此数据....
3 w1 e& v- P" @* _+ V+ e
. l3 E Z% ?7 D- t% a9 w. S- sti# A. \% |" }# p+ k( s0 Z& \
- ret
, u+ ?8 |- _+ J3 B* t: [ - Set4gb ENDP
; s5 r% a, n7 E8 ?0 i -
% U( V/ T7 ^$ C: S% ]- P- J% n - CSEG ENDS ;代码段定义结束7 G7 [- G5 V/ B; G% g% |2 R
- end
复制代码 |
|