|
|
刚学习的同学,有些还不会,我这里贴点C和asm的代码。只供参考。
$ r5 n9 z) k9 v4 x. N W* {8 m& n" q! {9 j! a
这是C的- /********************************************************************# S, {8 T2 y9 K8 U5 ?" H
- * File: DOS4G.H *
% A0 F" F" I! h5 _% R5 G - * Compile with BC 3.1 ( Editor: Tab size = 4 ) *) O* |) M4 J( E6 u! V
- * *4 s" p6 h& n/ N. L
- * ========================Title=============================== *
6 A7 |4 d9 X9 c* j5 w/ o% N - * 这个函数是让系统进入DOS 4G模式 *
) _ Y d( D$ K2 @) b - * 程序参考了:陈家琪《DOS实方式下直接访问4GB》 *8 t/ b( V; b6 j( R+ A
- * *! B( Q; A4 K& p8 L& l1 m3 W
- * 使用: openA20(); set4gb(); *
$ i% t/ \' G- N8 v: D - * *0 o [! G& P' e6 ~; o9 J
- * ===========================History========================== *" R1 D: J( o1 w2 y* y. a
- * author: bini *7 |7 H) ~; t$ D
- * date: 2004-11-30 Frist version. *- W4 T" ]& _% ~5 e" P
- ********************************************************************/
/ V2 A( K: c) ^+ ~ - # @! F# r; a; r/ B' }
- #include <conio.h>* `- i8 J% Q# a2 s
- #pragma inline, a/ w' N4 c/ t+ G5 v: H
- 4 y$ o" o6 ^+ }
- /***********************************************# \# @- ^$ E) [
- * 两个GDT,第一个为系统使用,不管,默认为0 *
; c3 E. b- b5 @7 Y# f - * 第二个为一个数据段,没有代码段。 *: ^$ X7 [: G T/ w
- ***********************************************/
/ c4 s( P0 N1 i6 o" y, l - unsigned long GDT_def[ ]={0,0, /*系统使用*/0 }% W7 ~7 w3 T7 V5 ?
- 0x0000FFFF, /* hi16bit( 0~15 ) is base low=0,
+ j9 d' m. L6 f) l2 S$ m! Y - low16bit( 0~15 ) is limit low=0xFFFF % v2 p. a3 f: T, H3 ^3 L0 O+ i0 K$ F% a
- */9 j- e4 D; n. J* g
- 0x008F9200};/* 最低字节为 base( bit 16~23 )
- u$ {+ l6 d7 \' m5 n; j. i& a7 @. \ - 最高字节为 base( bit 24~31 )0 q; u" P( S9 L3 ?' x
- 1 J' T+ W& ?# z) e
- 属性Attrib = 0x8F925 c8 N; I# B* z" A8 `
- ( Z/ ]" `3 k; e3 D. a* }3 F# w' w Q$ i
- 属性位Hibyte低四位为 6 V; P* ]- j+ z, c4 T0 K
- Limit( 16~19 )=F* x0 a) J2 r" d! u# r. G" y
- 属性位Hibyte bit7 为粒度& p$ w* W0 L4 a- D4 f: n
- (值1=4KB粒度)
8 `" ]# Z e7 c7 L - 8F & 0x80 = 1
# `( m/ e8 P. `) N" o* K - 4 U: v# I9 D% w+ S6 M9 n
- 属性位Lowbyte低四位为段类型,值=2
; y/ m% y/ W0 a7 z0 s, N$ x9 T/ k - 表示为可读/写段% h5 G% H& p2 m @" L) \# b
- 属性位Hibyte高四位=9,bit3=1表示:! N$ W1 f5 L% B5 }" M# S
- 描述符对地址转换是有效的。6 l! ~1 h# o" [3 B* s! {
- bit0=1表示为:
# M( f! m1 D* G/ U1 W - 系统段描述符。而不是门描述符。
n, g$ w2 T2 `. w; Z -
1 h5 A( `' ~, Q" f+ [ - */
9 s4 E/ S- L0 F! x - + S) \' B: a& h. H4 ]
- /****************************************
3 p, L% Z. r' h$ |; T - * GDTR寄存器, 48bit=6bytes *
& B3 d& |8 Z7 ^$ Q- b' y - * +-------------------------------+ *! v. y+ X9 ~3 c2 j
- * | 32bit基地址 |16bit界限| *
X) q/ q3 I5 Y1 n5 k; n E - * +-------------------------------+ *
; w7 T" l3 n, z9 o- m+ E3 w: B2 J - ****************************************/6 W2 j$ F: C1 l1 x, H
- unsigned char GDT_Addr[6]={0};
9 I% \8 i0 Z7 u1 S j5 H$ L - & L. u3 v( v* R, _. H
- /****************( a+ C- M0 E5 s0 ~$ `- U% N
- * 打开A20门 *
$ K5 I2 R9 u, D9 p - ****************/
8 d1 g, x6 t, b - void openA20(void)
3 H/ ]# v2 r& t- m+ y7 k6 G7 k0 ~ - {
) u7 V! a2 m: w$ H4 @ - asm{( K+ }+ k3 @1 H6 F
- pusha
+ y+ x9 w, I! a* ?9 I/ P: r0 U. I - in al, 92H
& l e: F5 R" r5 k! R1 v4 F9 t* G# Q - or al, 0x02
f1 R' o/ O) \5 o: s0 K - out 0x92, al' t1 n' ^7 @# ~/ ^2 d6 y
- out 0xed, al
; {" G5 G4 u7 }" a0 n, F4 x' } - popa
% L C2 w9 k$ i) q- z* v. d0 T - }. ~0 C* j8 K y7 @/ B
- }, k2 b& b. g0 C# o6 k
& o" y+ {% V: ] p& O5 T- /***********************************************- p$ R7 z5 G# H9 Z" n
- * 函数功能:进入DOS4G *
0 m. Z7 D* G3 M m& l - * ==================== *
/ i: L9 \0 _+ w1 U4 l8 S% O) y# A4 O - * *
! G: P) R6 |1 H - * GDT描述符界限计算方式:描述符个数*8-1 *
* X+ w+ M l' d, b7 T' C$ q - * 如: *! r' {- t3 ]% S) |3 [- E& @
- * mov word ptr GDT_Addr[0], (2*8-1); *
" k' s! z/ H, y) V: N# S: b - * 表示为 2个GTD *9 k9 P" i& c4 G$ E2 z
- * *
5 C; Q/ ^ g8 K. O/ a' W% W" }9 S - * 选择子为所在描述符内的字节偏移。 *$ [! j4 Q H5 Q
- * *: z, I. {8 ^1 X* X( u P
- ***********************************************/
% r; Y9 @2 r8 I6 f, } - void set4gb(void)8 x6 Q) Q8 z1 p8 o) a
- {' ^$ K* Q3 \- J( x$ P, Q
- asm{) K8 g5 i, @* k5 q* p* h S
- cli
9 y4 ]4 J$ O4 P* w s - /****************************************2 r. V7 T l( ~
- * GDTR寄存器 *
3 L7 V. r f; z, S( }1 D' P - * +-------------------------------+ *3 ~/ ?6 I" D0 V# p/ p' X
- * | 32bit基地址 |16bit界限| *
* n M- J' V, o5 J w0 n2 P1 f5 w: o - * +-------------------------------+ *
( p1 C+ l" s/ [ n$ Y - *****************************************/
8 r. s i* ~1 m' v, b+ S, o, L v' B - /*********************
% Y: u6 ]' g. R - * 得出段界限 *9 @+ f1 b1 y; U% X
- *********************/
3 _0 G. [8 O% r" R+ l - mov word ptr GDT_Addr[0], (2*8-1);
% ]- h9 m0 G# w2 o - /********************************************
, O* i8 `7 j0 \ b& j$ G - * 计算GDT表的32位基地址,存入GDTR *
# G& _6 O! V% ]0 Q: | - ********************************************/. F5 i! Y* y7 N" M; ^
- mov eax, ds/ j9 G" ]+ ]1 c% h, F% I) E
- shl eax, 4
: X& Y- q r) Y. f - xor ebx, ebx
2 F5 a7 a. P1 Z/ L g& D! { - mov bx, offset GDT_def: j1 ^9 h4 v, e2 Z
- add eax, ebx3 I6 X( B) t% P9 Z+ P* U' b
- mov dword ptr GDT_Addr[2], eax
+ X* x. L6 A1 f- d9 I- C1 L - lgdt fword ptr GDT_Addr0 k9 `- [, U1 Z' T4 M& a
- /********************
: u9 W4 l1 J5 S, ?. B8 J: M - * 选择子偏移 *, m7 Q& d: B7 {, q
- ********************/3 W* \7 \" D# B+ X% Y$ W, F- n7 w
- mov bx, 8
) ?& G$ |, I; r# T: u - mov eax, cr04 J1 g2 m+ z1 ^4 N* k9 h
- or al, 1, z' `2 H& I) c. ~: W M- a
- /**********************
+ |' {3 h, z( R& w8 }3 _0 f. [ - * 进入保护模式 *
8 [# x+ {" F* v# N% y - **********************/7 F, i: b7 x- E- H
- mov cr0, eax
9 i; F3 t2 N; d6 F - jmp pMod B2 u! D' s9 \* n/ F
- }
+ w: S! _- W' K( r9 N - ( X( S) a: o* B0 Z) L
- pMod: asm{
) _* P' p' j. L' z; N' G - /************************************************************
- U1 K4 F* t: J. S - * 让fs与gs加载选择子,使其能访问 0xFFFFF * 4K (4GB) 空间 *
' k: d6 t Z& v9 F* a; f" ~$ ?, _ - ************************************************************/: j) C4 ?; [" P* R, [$ ~, Z: ]
- mov fs, bx
: ~- }) Z9 z% `4 F5 } - mov gs, bx# H- ^* E* T9 C
- and al, 0x0FE4 j. K, v; Q q" D1 U9 L3 |5 u+ @
- /******************7 l" F" x) W0 Q4 f1 O# e$ C
- * 进入实模式 *
/ Y. B6 s/ R) H- }4 Z - ******************/% B1 ]( `: w P% B1 u2 Q
- mov cr0, eax
6 _" Y% F! O4 h1 y1 x: F - jmp rMod
4 w* o$ |5 H2 j8 A; f - }
3 g" l6 `) ~7 h9 b+ T- U
) z/ h2 {1 w& h0 E A) V- rMod: asm{
$ K; ]! m6 j; ~ S- o& P - /* ******************************************************************1 B+ z# Z/ w( {1 Z
- * 退出,fs、gs清0,访问系统内存可用: gs[32位,相对于0的偏移地址] *0 V J! _' G. B7 @
- ********************************************************************/
+ }+ ~0 ]9 |8 E r5 ^6 v. P - mov ax, 0( ^! P, t' f* Z; q9 @6 @7 m" T$ P; O. B
- mov fs, ax
! B& D" J# F6 ? - mov gs, ax
/ \' |+ O3 ?, I8 t& t! n8 ~* i - sti8 E2 J* f: t- Q( a# |9 l3 a$ T( A
- }
% `1 f& r5 c; e! J" A, K G - }
复制代码 这是asm的- ;/********************************************************************, D" Q9 ^5 ?% O& H* E* S2 C
- ;* File: DOS4G.asm *7 y1 H/ X t7 L2 f$ t) s
- ;* Compile with masm ( Editor: Tab size = 4 ) *
; U/ o( D9 k- `# `3 p( L& Y - ;* *8 Q& }& q& }2 ^0 f. F# z9 S7 ^
- ;* ========================Title=============================== *
1 t/ v/ a9 h# A( P. l/ ?, [ - ;* 这个demo是让系统进入DOS 4G模式,进行数据访问 *
; l, `; J: `: ~) } - ;* ** a+ w% |, O; _+ [4 J" L9 q
- ;* ===========================History========================== *
5 v$ `. p+ M4 X6 q: W# m _ - ;* author: bini *
9 f% i. T. n* ?2 q - ;* date: 2008-10-08 Frist version. *8 }; b$ L0 u" n# ~% d5 u
- ;********************************************************************/ 2 e8 M+ [. U- N; k3 C/ Z
- .model small
" C& h# l- [4 @( m/ z3 W - .586p
) G" J2 e& P! N+ U/ Z+ U - - t) ~, m9 G. u8 `* X/ J$ d- ]7 k# \
- DSEG SEGMENT USE16 ;16位数据段$ q" T0 g/ N* B- q
- 7 q" S" s2 [5 T6 U$ I# m
- DESC STRUC+ h% E0 y7 S" ?$ D9 i
- LimitL DW 0 ;段界限(BIT0-15)
* |/ _0 Y4 S; `. r6 U7 \ - BaseL DW 0 ;段基地址(BIT0-15)" s3 T6 [6 g3 G' m! P- }9 b
- BaseM DB 0 ;段基地址(BIT16-23)! x8 ^ ?, _, d# p1 E0 _
- Attributes DB 0 ;段属性6 z c8 f R$ C* |! i/ y! {6 F" s
- LimitH DB 0 ;段界限(BIT16-19)(含段属性的高4位). f) u- a8 ?. n" N8 w1 w
- BaseH DB 0 ;段基地址(BIT24-31)6 S# K" J: K: a9 a
- DESC ENDS# X/ e0 \# l5 S0 ]: T
- , c2 m3 Z6 }& R: H R
- PDesc STRUC
; V1 J( N6 C& Q5 S+ k7 Q8 c# W - Limit DW 0 ;16位界限
/ m5 f! v* H4 v" N4 b/ X8 [: t5 T - Base DD 0 ;32位基地址. m2 j3 a [& ^ d
- PDesc ENDS
! Z7 z+ {% ^+ j% g
1 j- G9 D3 Z" x+ W: M J- GDT_def Label Fword
4 N& x1 ?* b* e; H( B# r/ X% g - Null_Desc DESC < 0h, 0h, 00h, 00h, 000h, 0>; W1 `( P& D; d
- Data_Desc DESC < 0FFFFh, 0h, 00h, 92h, 08Fh, 0>' R+ m% j" M+ m( A1 K
- # l% R' P" T9 S' R3 [+ k& Z1 s$ u
- GDT_Addr PDesc <$-GDT_def-1, >
; {( g3 E' E* Y. W& ~1 s- h( b* n x - DSEG ENDS ;数据段定义结束' B# u6 S' |+ l
* n2 l% P* q+ F, ]: a- ~- CSEG SEGMENT USE16 ;16位代码段
. M" E' N2 h3 i1 I5 J7 K3 N" a - ASSUME CS:CSEG,DS:DSEG* X3 o( k E' D* b2 n' q9 h! i9 N
- .Startup6 h) ~9 {5 K j( i7 b
- call Set4gb. `, m0 y% l* X! ~& {2 l4 L' C& k ^
- ;
6 |: e9 Z1 v$ g0 R* s - ; fs, gs即能访问4GB空间
9 C1 d5 ` U$ R" G, O - ; write your code in here.1 Y" _5 m5 f, i$ _$ Z) k9 Z7 m
- ;4 [* w9 A4 U1 Y3 `6 f+ w& C9 K
- .exit R* A/ J+ _' Z. P
- , M$ L9 L% S: R
- Set4gb PROC NEAR
7 o6 Q! x* N# v( c- L - in al, 92h* s8 P1 Z T8 d$ n" n+ l
- or al, 0020 J. e4 r8 M! C5 k6 [# T, Q" l
- out 092h, al* e) R0 M: v8 e; E( `( y
- out 0edh, al- f# K5 t, F' k \
l% e) s( L, z& }+ r0 w, u- cli
0 k7 P( B! s0 l7 E$ y
& j- j5 Z+ F& p( [: B- ; mov word ptr GDT_Addr, (2*8-1);, x2 G% U( a+ h7 _+ A; K
W1 Q+ k& N; d' \- mov eax, ds- c1 D# v" _+ M% [
- shl eax, 4
. A* h5 R( O/ N, T# a! A. N - xor ebx, ebx- K# ]2 y7 H4 }; X# w+ A( P
- mov bx, offset GDT_def
/ B5 |4 u4 N8 R# G - add eax, ebx
+ ]0 T: E, t8 A/ t4 g+ | - mov dword ptr GDT_Addr.Base, eax
6 y9 q6 i! D# Y1 L7 N) W - lgdt fword ptr GDT_Addr7 H/ k( C7 C- W1 s1 u
- & u3 z: v5 E3 k
- mov bx, 8, P5 O6 w, G; }: l
- mov eax, cr04 q! Z* W% F( y4 Y
- or al, 15 B8 I c# i3 \: v& I7 }
- mov cr0, eax
7 {: q/ `+ p8 J F* i1 j' j* c" {
% [, ?: J" v- I. Q- jmp pMod+ m! X8 G3 E7 h5 Z4 I
- pMod:
, \, J9 j, T, R$ Y- r8 s2 V - \# P$ `: d9 J* A; A: v
- mov fs, bx' M$ H/ z, P) W* R; T+ t$ D& C* s
- mov gs, bx& x, R- x) M5 I0 Z0 }/ {; D
- and al, 0FEh
2 A3 r2 L* q" E2 _+ E - mov cr0, eax
( C( L! p6 B j7 B) y; D I* A" d -
7 Z Y+ Y: q4 O/ L- Y - jmp rMod
w: F3 k9 Y% k: Y - rMod:/ E- G" w0 Q2 Y. m
- 0 L. H" z2 \# t
- mov ax, 0% n: C, |7 w* V" Z
- mov fs, ax
( I( Q3 _2 G0 m& h - mov gs, ax8 s2 [0 I5 A5 Z# B/ R! S# F
-
0 A+ A8 c) p/ w! e - ; 在2M的位置测试写一下数据
2 ]; V7 _: E P+ y# A/ \ - mov esi, 200000h9 x2 c2 K$ n% [5 S: d# [5 f
- mov dword ptr fs:[esi], 055aa55aah k# j* X$ d4 X o, m
- ; 用RU去看看200000h的位置是否是此数据....% q! j+ O1 M; o' _# e1 S/ o" O2 }
" X, m6 R/ ~9 y2 E- sti' [" V1 Q j- Z/ G
- ret/ O$ ]! M) A$ Q$ F5 T) B( A( B3 h4 t9 f+ N
- Set4gb ENDP9 w. |8 u3 O) h5 O. _: Y! D
- 7 F, |2 A* D7 b# }) @0 `; j/ {
- CSEG ENDS ;代码段定义结束( c/ G' s" I" ~/ h3 J; M
- end
复制代码 |
|