|
|
刚学习的同学,有些还不会,我这里贴点C和asm的代码。只供参考。
& m, |* ]2 |! B l Z9 o
+ \: S7 ^4 ?% D' K# H& p这是C的- /********************************************************************
* s; t) k$ g A6 ~1 Z0 b' l9 { - * File: DOS4G.H *8 |- |, Z4 f9 v8 U) Z
- * Compile with BC 3.1 ( Editor: Tab size = 4 ) *
, b! ^# m' T q7 T& J - * *! K, @1 I% w2 m+ {: w' v
- * ========================Title=============================== *" \. X0 t2 M1 _
- * 这个函数是让系统进入DOS 4G模式 */ v0 c1 \7 c7 {0 e4 q% V$ v5 n7 v
- * 程序参考了:陈家琪《DOS实方式下直接访问4GB》 *# a8 c7 ~0 K, E6 A, Z; l. O! |& d+ C; M
- * *0 I5 h5 T3 G* |, o2 n/ ^- H9 Y4 g( D
- * 使用: openA20(); set4gb(); *+ ~$ M! I2 i. |: s! S A
- * *
% C- W6 C: d- d- L6 j0 y+ a - * ===========================History========================== *
5 D" {- O' Q' l, F6 _ - * author: bini *
1 l! i* n1 D) N" `2 p# b) @0 f - * date: 2004-11-30 Frist version. *
5 X& c* ]8 f. q0 Z5 f8 \6 [ - ********************************************************************/. c- x) Y( k% H; X9 r
( } N* d. ~' B6 k- #include <conio.h>/ ?8 b1 |. y8 k
- #pragma inline
4 W: Y; K% f Z
- k. p. B8 x; n9 G- /***********************************************- E# |0 x& m+ y( m0 i* q
- * 两个GDT,第一个为系统使用,不管,默认为0 *
8 t! t9 {' H! h# _ ]7 S - * 第二个为一个数据段,没有代码段。 *
/ x) n+ Q+ |4 T& X - ***********************************************/
/ H# q( R! U! |4 J$ [ - unsigned long GDT_def[ ]={0,0, /*系统使用*/2 h$ v: g' @" u. E
- 0x0000FFFF, /* hi16bit( 0~15 ) is base low=0,
9 t) }+ f) X9 O) A, @9 h: u# c$ B - low16bit( 0~15 ) is limit low=0xFFFF ' J6 l7 i+ t* w+ r7 V
- */0 O5 f' j! x( i9 z6 L
- 0x008F9200};/* 最低字节为 base( bit 16~23 )
8 K6 c$ c- o' ?" B, l( U - 最高字节为 base( bit 24~31 )( I/ g- q" }$ K7 G( V* ?( u
- 0 C6 x' i) U0 ]
- 属性Attrib = 0x8F921 {5 k1 f; { k
- 4 B/ A, U# z& m0 ?
- 属性位Hibyte低四位为
1 \1 g* J9 @, J - Limit( 16~19 )=F
: P) v9 |2 h- O0 [) [- [ L - 属性位Hibyte bit7 为粒度% L. X! @4 B9 N4 B* i
- (值1=4KB粒度)
$ @) @1 ~) D- d5 p% e& Z& h( ?1 ` - 8F & 0x80 = 1
: V3 J3 a1 o+ Q+ Y. \& I+ r - " z$ ^# I% t& b0 U# P
- 属性位Lowbyte低四位为段类型,值=2
1 e+ [) p# {' @7 ]6 b" b - 表示为可读/写段2 C; T& ]# a G
- 属性位Hibyte高四位=9,bit3=1表示:2 z+ B, ~ Z, [' Q
- 描述符对地址转换是有效的。
2 j# i, m/ E5 M4 m - bit0=1表示为:
9 a' o/ g( R8 x" A" H - 系统段描述符。而不是门描述符。
% f- ^; m' O* |% L, x - " V- m3 G: M1 z$ y
- */( O2 R6 l% d1 ]" N5 ^8 I
# h1 `0 m: e; x$ U, ^- /****************************************
+ X( s7 k$ o/ [4 B6 { - * GDTR寄存器, 48bit=6bytes * }5 B& s% W6 h+ a- q% U; F9 E4 @
- * +-------------------------------+ *9 x; x7 Z6 f/ [0 ? I& H4 y
- * | 32bit基地址 |16bit界限| *3 b" t7 x% C) t f
- * +-------------------------------+ * w* x2 E3 B& w
- ****************************************/
( |4 Z! W. X( f( _3 g- q( N* ? - unsigned char GDT_Addr[6]={0};' e0 i: g1 z' e1 [! Y! }5 l
% m! v& l, _+ e$ D$ e5 j- /****************
- t2 }$ K+ P" @" M - * 打开A20门 *
7 w* [8 h9 Y6 T W# B+ L - ****************/
1 v& T: g; }1 z! C - void openA20(void)
. P% t/ j+ P/ T7 D - {
0 F* M$ u3 n, \7 h" ? - asm{6 `9 D; h- W+ i# w
- pusha) W- ?! x% T0 ~0 V7 F2 A' K
- in al, 92H6 N R; @8 R# N" ~( i
- or al, 0x02
4 q; D% i$ G1 a2 m* C! Z - out 0x92, al
+ c s* G! n% Z0 _% ]" o" I% y - out 0xed, al
' v5 h% E/ L5 J; V8 R - popa
& g: P& x6 k0 Y( ` - }
$ y/ W7 Z6 x0 V" M3 c" s3 A" z - }3 H) j" {* y" C& u/ T/ V, g
- 1 m; Y; G* C7 l- T
- /***********************************************
, o" G* z+ \& _1 T, H - * 函数功能:进入DOS4G *, M t, [ R# g& p, S, G. R
- * ==================== *
6 R" D# h/ v+ ?* O8 N - * *0 R" a" J; F! ]/ z
- * GDT描述符界限计算方式:描述符个数*8-1 *
" n* n0 G% @; l3 _9 J - * 如: *- E! `1 Y& g* \0 b
- * mov word ptr GDT_Addr[0], (2*8-1); *
. B1 {% e; a$ d/ z# l/ W" Y - * 表示为 2个GTD *
( I9 z) U; f- {& U% C - * *
; A/ g; X5 p" C1 D - * 选择子为所在描述符内的字节偏移。 *
x0 W3 y _1 ?" N U - * *, g7 z8 h! ^& l: c; H
- ***********************************************/
7 Q- z2 `/ {4 h1 Q3 A( G* W- _ - void set4gb(void)
) A7 N. j2 l9 R2 a. O - {' l% C3 S$ A3 g3 C
- asm{
- T7 z) K/ O. x$ \9 m - cli
/ H# k6 Z# A9 v* X - /****************************************
4 \/ u- t0 s$ h - * GDTR寄存器 *
. o, `6 M2 u# n+ W1 m - * +-------------------------------+ *
3 n! z+ g2 ?3 G) D - * | 32bit基地址 |16bit界限| */ f9 B/ Y1 Y5 U H& M7 Y) n4 \
- * +-------------------------------+ *4 l- d$ ?' w# ~/ p7 J; O
- *****************************************/7 F. Q2 v+ S) }( h# f; f0 V
- /*********************5 j9 ]9 A2 o- N1 B5 J' l
- * 得出段界限 *; X; \ \' D! U8 x8 j9 q
- *********************/
5 E0 X$ U# i7 C8 k. \ - mov word ptr GDT_Addr[0], (2*8-1);. J1 N. {! ^& S% \2 ]* J9 f A6 ?
- /********************************************
( G8 f. U: Y# s - * 计算GDT表的32位基地址,存入GDTR *8 w! @8 K* u, n( l
- ********************************************/9 U( `& D( W# }* r6 q
- mov eax, ds
$ u5 E" ?& T7 ~$ ^" k& j - shl eax, 4
# X* D3 g, _* }7 q5 V* i$ _+ d - xor ebx, ebx3 h( n: l& R- @" V" A. Z* @% C
- mov bx, offset GDT_def4 d- A! `0 q0 x/ c: S
- add eax, ebx
5 I; [: X$ W% u/ M( K - mov dword ptr GDT_Addr[2], eax6 s! r' L b. L% {" a: B
- lgdt fword ptr GDT_Addr8 Z3 U8 f& I) Q4 w
- /********************
7 w3 t O" E0 @4 s3 L: F k3 ] - * 选择子偏移 *
9 y/ _ ]/ ~$ B* `, x - ********************/
7 S1 a+ d* J" K+ g2 L" [ - mov bx, 8" {% k+ [; c% d; U! U: F
- mov eax, cr0
2 z% F+ b+ j; F; X! U - or al, 1
- A! h7 ~& i4 z0 [) i8 E! q - /**********************
, O; \6 D! [4 b* X$ r7 Z - * 进入保护模式 *
! X' F. N# p9 S: f }" p l - **********************/
# V, c, D Y2 U- W0 a - mov cr0, eax
8 f6 ^" ] ]* U* i - jmp pMod
1 C) W% I# Y$ }& \ l# T7 r4 N - }% O; @: s6 I6 H& g+ g
- - M R0 ^* a( B6 b' ~
- pMod: asm{
' b) y: Z3 L4 o8 m, C, h! ? - /************************************************************
: r9 E% F5 Q3 n/ @' ~8 o& x: h; K& ] - * 让fs与gs加载选择子,使其能访问 0xFFFFF * 4K (4GB) 空间 *$ K& h9 I% c4 [0 s
- ************************************************************/
. c4 r' s3 `% e& u - mov fs, bx
/ P8 o" b7 K( j% E3 O. U6 p, O0 ] - mov gs, bx4 V9 Y3 w" Z4 V3 B8 k* B5 q! P
- and al, 0x0FE/ H1 x2 k4 n, X: R* i8 b
- /******************
' ~* N+ U( i- P. i - * 进入实模式 *2 ?$ \3 c' k# U; R7 W: G* t
- ******************/
6 Q5 r: L) s6 ?( P - mov cr0, eax6 c) s# ]' L) h
- jmp rMod# `) V+ l. J9 _5 Z2 ]' f
- }1 A. n* D6 v7 P4 o1 N
; j9 a4 R6 [7 p: Q& {- rMod: asm{" D4 ]" _" m# o: ]3 A
- /* ******************************************************************
8 r! v7 i0 `3 m* N* s W( H9 D- C4 ? - * 退出,fs、gs清0,访问系统内存可用: gs[32位,相对于0的偏移地址] *3 f6 r6 B* }9 p# I7 O1 E x9 A
- ********************************************************************/
$ E) p& g" f8 B$ H6 [7 i - mov ax, 09 h# e8 ]( p# _# N$ t3 n
- mov fs, ax, H( f/ H5 C$ V# m7 A+ }' @
- mov gs, ax! k6 c k) s! o: K; E
- sti
9 N- ]# T( I& I6 ]7 H4 z - }
/ k0 L& V. C2 ~) l; J0 U6 c - }
复制代码 这是asm的- ;/********************************************************************7 F; R* a; s! A4 I8 Y. z& w7 e
- ;* File: DOS4G.asm *( W- c q9 Y8 u9 P
- ;* Compile with masm ( Editor: Tab size = 4 ) *& @* |1 g! y8 e3 n
- ;* *
0 Z; z1 C& ]) p% c8 Z/ S - ;* ========================Title=============================== *6 ^8 v) O# a4 g- E N8 W+ p
- ;* 这个demo是让系统进入DOS 4G模式,进行数据访问 *4 T/ H# k8 G' |. f: N9 t
- ;* *
& H# w$ U% J$ P9 t - ;* ===========================History========================== *
( S) T) F. G' A - ;* author: bini *: N& m ?- V+ a# j4 [* n
- ;* date: 2008-10-08 Frist version. *
+ ]! R: A0 j% Q }& |1 ` - ;********************************************************************/
5 m9 R9 U' o2 o, p* S3 k - .model small
2 v; Z" \; T% V7 b& g0 Z - .586p* W$ |" T, F' q. ^
- : B6 K8 S& p* U/ A- P
- DSEG SEGMENT USE16 ;16位数据段
4 h8 Q/ `. | M* J1 Y
* `6 }5 J! U$ E- DESC STRUC# o# [/ R; d a& g4 V. _4 u
- LimitL DW 0 ;段界限(BIT0-15)# o- {. z: H% O8 `
- BaseL DW 0 ;段基地址(BIT0-15)7 X$ s, R0 m' Z9 U: M$ K
- BaseM DB 0 ;段基地址(BIT16-23)! T; W5 H6 D& X" e4 u
- Attributes DB 0 ;段属性% r$ J) l [) R8 v& Q: K0 k+ T
- LimitH DB 0 ;段界限(BIT16-19)(含段属性的高4位)
- F6 b* e a9 L5 F5 R - BaseH DB 0 ;段基地址(BIT24-31)" L, p6 L3 l& t- c" n
- DESC ENDS2 ^4 u* R- }+ a& |
- 3 ^! c6 z, Z1 A" n, S' |. p% E9 x
- PDesc STRUC7 t8 Y& v$ ?2 i; q' r* ^; V. @* z
- Limit DW 0 ;16位界限& B9 T5 w9 D b8 M7 f# x8 h
- Base DD 0 ;32位基地址
/ i. p* R' \& `' }6 | - PDesc ENDS0 g: P0 t) J) v8 c( h
- t3 o) D; |' j- \( @, m" \! [- GDT_def Label Fword5 {" A* r/ V; M
- Null_Desc DESC < 0h, 0h, 00h, 00h, 000h, 0>* `6 u! S# U3 j/ ]9 p% t
- Data_Desc DESC < 0FFFFh, 0h, 00h, 92h, 08Fh, 0>% l' Z/ i. p2 K% s l
- ) n$ w9 Z+ V' H4 X# q
- GDT_Addr PDesc <$-GDT_def-1, >
" ?! F- b9 s0 e+ H$ {) p9 Z - DSEG ENDS ;数据段定义结束9 f3 D7 E/ r7 o% W% u2 g% k7 o
9 n) T' j, N7 _$ V/ f5 r+ e- CSEG SEGMENT USE16 ;16位代码段
5 P1 ?8 b& T% o% @3 t4 i4 f - ASSUME CS:CSEG,DS:DSEG. X# q) z4 Z( E* h6 s
- .Startup9 Y$ [( j q3 a R- z- J0 o, ~
- call Set4gb9 t4 w% s% [. D
- ;
: g/ ^0 m; W6 S0 R/ O2 l3 K9 F - ; fs, gs即能访问4GB空间0 B. c; A& n, C
- ; write your code in here.6 ?& ?0 L$ J8 o: a
- ;
6 `( ^" R% J: ^* K O4 Z - .exit% r/ W1 s0 g y8 ~9 M9 B( u
-
, j6 t6 J8 D( }; N - Set4gb PROC NEAR
( f8 w% [& U. \6 p2 O" X - in al, 92h
0 K5 P8 }- b& g _4 q3 i - or al, 002
5 ^4 d3 x& |- Z7 P5 p9 j - out 092h, al; T% x0 B2 w. K: r U3 h1 K
- out 0edh, al6 _( V2 N! u: ~1 @4 ^; o( D
7 Y- S5 X2 @# w" {* h- cli. x+ p6 ]' s: T7 ?4 N
- 1 w) {7 U: v5 E7 R) T
- ; mov word ptr GDT_Addr, (2*8-1);
B0 k& y6 i' Z2 l3 [ S; W" N% M8 K/ m0 F - f8 D5 c3 f/ Z1 O
- mov eax, ds Q# A1 a& f4 p3 |3 z
- shl eax, 4
) t9 G- E+ ?* x - xor ebx, ebx6 L B# p8 k0 t% }( `* k( d( j
- mov bx, offset GDT_def4 E2 o7 `( o$ J8 t2 P4 o# H
- add eax, ebx! [2 o2 Q1 |) ^+ F
- mov dword ptr GDT_Addr.Base, eax! C% V/ V4 f5 F4 d" @, k/ V
- lgdt fword ptr GDT_Addr( j( v G3 f( Z
7 X: c5 H5 s& a$ x" D- mov bx, 8) Y* H& a6 z" w4 ^0 `
- mov eax, cr0& f$ k ]4 d( B( R2 H& K6 M
- or al, 1, C/ J. h* ~! k, f: a
- mov cr0, eax
* H& K* P; m6 b+ _* z
& F- W& M' V! g- G! g! A- jmp pMod8 M" G' k% G& ]2 p+ @
- pMod:
* V0 M8 s; n% A3 c
" c- x! K7 u0 J E( @ |- mov fs, bx% K. [: M* h0 a7 G- y. E( Q7 d
- mov gs, bx9 |7 _8 I9 v) \4 f
- and al, 0FEh5 b/ v0 D1 p) C. H4 U5 `2 h
- mov cr0, eax
' f4 O, {0 T. ^+ p8 L9 \ - + b& r e8 q- `7 u$ C
- jmp rMod
( i5 u$ Q1 F! w# s! Y; V! `0 n5 p3 K - rMod:& }& B1 w1 R6 o- T6 I3 {8 C: u
0 |* M3 C+ k/ c: j' q. y- mov ax, 0
4 b! D0 r) f {5 `# g! x3 g - mov fs, ax. k# \8 P+ s/ a0 u( x
- mov gs, ax+ G5 W8 e+ L* r. k7 g
-
& B' ?, a" o" [+ o8 A - ; 在2M的位置测试写一下数据6 n/ H' d* r' Q; m
- mov esi, 200000h
& Q/ D" Q7 x5 p8 h: f0 M6 y* ? - mov dword ptr fs:[esi], 055aa55aah
& L/ ?+ E) T+ u1 F/ M - ; 用RU去看看200000h的位置是否是此数据....
: Y' C9 C* Y! C
! @1 B2 G. X( q- sti
$ S% N. ~: W4 \$ { - ret) B {9 k/ _1 f" z; e/ Q: c
- Set4gb ENDP
8 h: r: l) `0 ]- j -
; Q( k' a; S* v# R, Z0 h - CSEG ENDS ;代码段定义结束
! K6 |( H: ?# F7 r3 z7 L5 S2 h* W" d - end
复制代码 |
|