|
|
刚学习的同学,有些还不会,我这里贴点C和asm的代码。只供参考。
! j! r( m2 A5 @8 Z i
, a3 i1 r6 S+ Z: m* @这是C的- /********************************************************************5 [! v' B+ D; E+ c4 L6 Q8 \* q# {
- * File: DOS4G.H *
+ z* B- M7 C1 c1 n7 K - * Compile with BC 3.1 ( Editor: Tab size = 4 ) *" m2 F" \! J7 S3 k) l9 D( F
- * *
6 f! e8 k- S k5 @$ R! D7 c - * ========================Title=============================== *
0 @+ t" z- U6 [ - * 这个函数是让系统进入DOS 4G模式 *
: ^( p9 B" e) p" l3 w% L& d f - * 程序参考了:陈家琪《DOS实方式下直接访问4GB》 *
$ z/ @: \# R/ m4 ^% {) R9 G - * * G3 B4 F5 t g8 n2 l3 S
- * 使用: openA20(); set4gb(); *# w3 [* i! f; z
- * *
" q2 y. L7 d$ Z/ s3 Z3 t: I6 f1 y - * ===========================History========================== *
. C3 V Q3 G0 T: M - * author: bini *
# h1 ^7 q( x# ?% \4 ?$ f: p - * date: 2004-11-30 Frist version. *0 Z0 }1 D* A/ n9 y/ l
- ********************************************************************/% Q7 d' D- U1 {! l
- , F* r: t7 A: i' b& W9 h
- #include <conio.h>& W! R& d7 r/ y+ Y
- #pragma inline0 V, |6 y8 c- f) V% V" ?4 C
- ( Q k9 I" j; ]9 e: e( b; m; A
- /***********************************************8 \5 E* p9 Q) J& I& i9 n6 e
- * 两个GDT,第一个为系统使用,不管,默认为0 *; T3 R1 N$ F& C I
- * 第二个为一个数据段,没有代码段。 ** t7 X$ \9 \) c# \3 p
- ***********************************************/# p5 V. u' Z* x* v2 ?) m& R6 A4 `
- unsigned long GDT_def[ ]={0,0, /*系统使用*/
1 X Y8 Y' A& V% `8 F& v/ I - 0x0000FFFF, /* hi16bit( 0~15 ) is base low=0,
) U) ?8 W9 c( Y/ Y9 f5 I - low16bit( 0~15 ) is limit low=0xFFFF 6 f1 _9 f3 C; W$ B7 ?
- */
t+ C n" i I# D/ R: R - 0x008F9200};/* 最低字节为 base( bit 16~23 )& u( G) b- B9 d" D9 \' u3 |7 [
- 最高字节为 base( bit 24~31 )$ A; H* F8 @( ?8 ?/ i3 M6 u% l. [' `
-
e% Z# V( m* p! k - 属性Attrib = 0x8F92# M0 d7 Q0 Q; i0 d2 p% r( N- k/ f
-
! R4 A$ F! @; i. B8 g8 u) F& c - 属性位Hibyte低四位为
" c. w# w$ d4 f- L1 b( b9 J' U8 K - Limit( 16~19 )=F
7 Y2 \6 t: q/ Y8 t( f - 属性位Hibyte bit7 为粒度; \- e8 d: Z/ L8 ?
- (值1=4KB粒度)8 K# f0 p3 F3 G# V* H6 y
- 8F & 0x80 = 1, x' A6 C& M5 q, X. O2 `
- - F: @+ _; h* {8 U0 P
- 属性位Lowbyte低四位为段类型,值=20 z% M6 F: l: T' n
- 表示为可读/写段
. ]* z* n2 m3 A; c! h7 R% n - 属性位Hibyte高四位=9,bit3=1表示:3 E# _$ |8 T m8 [) P7 n
- 描述符对地址转换是有效的。3 U2 O7 G& ^: U2 ?' {: c
- bit0=1表示为:
3 C& V% M0 F" H( i1 w" c - 系统段描述符。而不是门描述符。& Y; B* |) x4 y, \$ u; q; o
-
) Y8 s. c, p% m - */+ F0 r+ L5 r" O4 @
- " v$ Y/ w+ M8 c" @4 g& ]- Z) T
- /****************************************
! P$ L6 w6 X2 a E" h* [ - * GDTR寄存器, 48bit=6bytes *
/ N! S- x2 J' J. I6 ^7 H, |! q$ k; V- m - * +-------------------------------+ *
: Q2 C5 w, f" d) j9 X/ b# r - * | 32bit基地址 |16bit界限| *
) H, p% e5 O: ~( G6 w* D7 L - * +-------------------------------+ *: \0 Y6 G1 {5 r3 \8 w
- ****************************************/8 J2 q; ~; }6 ~7 y) n9 S# o
- unsigned char GDT_Addr[6]={0};6 D' b9 q A' D: M* ?
- 8 g: J8 A* u8 D: v3 a$ I
- /****************2 _' Z& r- ~: c1 x3 r% z4 k, D
- * 打开A20门 *
7 }: j0 W6 I; q, S/ _1 Q3 y; _5 P - ****************/0 C$ J4 o. D1 d9 A" H& l* x! @
- void openA20(void)/ h. G1 z& E& q9 y* @
- {
9 h. p. P, ]3 W4 Q3 H - asm{3 m3 |% T# R& j4 H3 w, p% m
- pusha5 B) V1 P. ?; r
- in al, 92H) Q3 }) k3 B4 M# E- G
- or al, 0x024 F7 O0 C& M5 A( x+ y7 y
- out 0x92, al
+ e: H) x# m9 g" k4 D, D: } - out 0xed, al3 L! T- X' n& }! n6 [
- popa
1 i. v/ x6 I, Q( a( L" o& f6 p - }
; @. W) K: Q3 p - }
* [4 j1 A" L4 i! C - 6 ~: f2 M! \( [2 R3 p. Z4 |- X' o
- /***********************************************6 m" Z3 w( [7 N7 V/ ^4 n
- * 函数功能:进入DOS4G *
5 q1 d( B$ f1 r. F- g - * ==================== *
; k2 b3 w1 a- t) {: Z - * *
( D& k! `4 n- f' B - * GDT描述符界限计算方式:描述符个数*8-1 *1 t$ r* c* s- ^- g' `* C: ?1 S, M( R
- * 如: *. l4 }( m( h. j: D& r; Z
- * mov word ptr GDT_Addr[0], (2*8-1); *
0 _4 C7 }" l# O9 _" u: i - * 表示为 2个GTD *
/ B0 t) W3 N4 o1 C" E - * *+ Y- ?, y! C6 N8 G
- * 选择子为所在描述符内的字节偏移。 *
( [, f/ {& R7 @* }6 r - * *
1 g7 [& d2 ~7 z% g C) t0 ^ - ***********************************************/) }7 ^! V- E/ [* `, p+ \
- void set4gb(void)
f5 t/ d- n% k: `$ k! H7 P; z) { G. ` - {! ^8 B# J8 N$ G" R; r
- asm{! D2 e6 K9 s* k/ p. T5 e
- cli
, Q% J8 a- m/ X6 j$ @2 S1 i8 G - /****************************************
) V* r8 }) Y' _1 O0 d3 S - * GDTR寄存器 */ Z Q5 K9 {) c- u- j
- * +-------------------------------+ *
, L/ A8 y3 G1 M5 r, I% j2 v - * | 32bit基地址 |16bit界限| *
7 ?" w/ r! z( A2 ~( h) b - * +-------------------------------+ *
- U8 j% R$ e' O7 I; ~; n7 c - *****************************************/2 K$ k+ k" N& F1 |# L, u0 j
- /*********************
/ B9 I; G/ C: U9 j - * 得出段界限 *
6 s/ s1 a" f3 G4 r$ h R - *********************/' y5 p1 k( W) F) Q
- mov word ptr GDT_Addr[0], (2*8-1);; I+ |3 {. z6 M2 J9 m& \# Z
- /********************************************3 B- Z* j; h; z, } M
- * 计算GDT表的32位基地址,存入GDTR *8 K& H2 e6 q% O9 S
- ********************************************/
- H6 x: N, q7 {' Y9 J - mov eax, ds z* p( n0 R0 y1 X4 H: D
- shl eax, 4
, `; [: @, M3 N& ~ - xor ebx, ebx$ X9 v* Y: {* s# Q
- mov bx, offset GDT_def
( N/ \; F. {) \. E, R3 T - add eax, ebx
; l, y9 Q+ l5 G& { - mov dword ptr GDT_Addr[2], eax
$ F8 h! `( W6 h4 S) d! \ - lgdt fword ptr GDT_Addr# Z! W9 t3 l) N/ j6 x
- /********************9 T: N, H! Q( C: @/ K- H
- * 选择子偏移 */ ?7 A5 ~# T6 R" k8 u: W* }
- ********************/
4 |( i5 m. A6 C( y" g( A4 u9 a% Y - mov bx, 87 w# t- T8 b; ?3 Q' J+ j, T& A
- mov eax, cr0
' @0 \% p" ~* k+ K: k3 g% m - or al, 1
/ F# a. W% ` t. C0 _( @; o: h - /**********************
$ H/ b: ^- b* Z - * 进入保护模式 *
$ w) L9 a' j# S5 S% k# i7 Y - **********************/
$ w" Q: g7 G& ?6 }4 b0 `( K8 n1 R - mov cr0, eax
$ n" D7 k9 T( c% g$ x- S E: `- P% i - jmp pMod' ]8 h) S* W4 E7 M9 b$ j4 V
- }
: j; O* x2 R, P2 S2 k/ J
$ H \1 N0 w, L, n8 E/ N- pMod: asm{& j) G, W+ s! r* u, T
- /************************************************************
& n6 `. t' ~6 c3 V! x& _2 f - * 让fs与gs加载选择子,使其能访问 0xFFFFF * 4K (4GB) 空间 *0 l0 h' s- t4 `( f1 R
- ************************************************************/8 a. F- x: h! c
- mov fs, bx- d* P* ?; g. h5 p/ H" g5 ]
- mov gs, bx
6 p# p. l/ T0 r. Y: U, g - and al, 0x0FE
1 a* \- z' H; e/ a - /******************( o9 N3 O' c7 g, ^/ y
- * 进入实模式 *
, h' D6 u, i u0 R6 h1 ` - ******************/; T* K. U2 e& O3 `
- mov cr0, eax' o/ |) ^: N8 y; [ ?$ v
- jmp rMod- w' H# C7 S9 s
- }
& H( y6 f$ ?* R L: X
2 P1 t$ k. O! J. |# b5 L. x- rMod: asm{
) q0 }2 J: e# i. z9 {, l - /* ******************************************************************
% f5 W Y& @7 e( X+ }: e# V - * 退出,fs、gs清0,访问系统内存可用: gs[32位,相对于0的偏移地址] *- R9 U" V) G, X& G& I
- ********************************************************************/
( l3 Z6 k& G! J* X& e; u - mov ax, 0
+ G7 [9 s" `0 I3 O8 e - mov fs, ax
* y% J" u8 O1 } - mov gs, ax7 H3 K5 C0 Z5 d' e8 X
- sti
! ?' A1 m. e+ n: A6 W - }% N, x$ ~8 a& L* ~
- }
复制代码 这是asm的- ;/********************************************************************
% E# `( f/ v) W; `# A0 p+ P5 l - ;* File: DOS4G.asm *
. G0 W3 x# R ^4 G - ;* Compile with masm ( Editor: Tab size = 4 ) *6 @3 f" Y: ^ v, [! C% P. g
- ;* *
, F4 f& S( l! D - ;* ========================Title=============================== *( R+ |" i9 D, j$ M. H5 [: ~ |
- ;* 这个demo是让系统进入DOS 4G模式,进行数据访问 *
+ E; w' S: i& a3 L - ;* *
9 A/ a# T" R9 V/ x; z3 g5 S - ;* ===========================History========================== *6 q2 l1 C8 D, T
- ;* author: bini *. L {( ^6 k- P5 a8 u
- ;* date: 2008-10-08 Frist version. *7 Z# E% }, K; |3 v ?
- ;********************************************************************/
5 s! w4 q$ u2 _% A- \- ~! B: u - .model small3 D* Y& P' @; F. A# C
- .586p& q: N0 O+ a( d
-
$ F; O; k6 v, [$ w - DSEG SEGMENT USE16 ;16位数据段( P& p5 P' n2 U: P7 p8 w
- 8 }1 ?9 u* \; `. G( u) X
- DESC STRUC
n7 [8 t/ z' v2 C) W* K; } - LimitL DW 0 ;段界限(BIT0-15), w: L- T! Z. G# t4 O1 M' r! ?; b
- BaseL DW 0 ;段基地址(BIT0-15)) j" G$ Z: Z) b, G" t
- BaseM DB 0 ;段基地址(BIT16-23)
+ |% @( b; m, V9 \( \ - Attributes DB 0 ;段属性) Q+ J3 O& U* q$ G W! ^! ]
- LimitH DB 0 ;段界限(BIT16-19)(含段属性的高4位)
+ F8 }# Q) J7 J0 d - BaseH DB 0 ;段基地址(BIT24-31)' j2 b- r) q7 o. z3 N) s
- DESC ENDS
9 F) P K0 p5 w2 U6 {: t3 s- V0 |
4 I5 k3 c0 K8 }( x* P7 M0 ^- PDesc STRUC
3 X( H" `: F( H7 D - Limit DW 0 ;16位界限9 C, I* }+ g9 w% ]
- Base DD 0 ;32位基地址
' u. u6 M: a& {1 ^ - PDesc ENDS
6 U% M( u3 H8 n" h1 j& v
) |: |! r+ Y% B! s$ x- GDT_def Label Fword
! C& S# S& q. f, z4 o' P - Null_Desc DESC < 0h, 0h, 00h, 00h, 000h, 0>
. n z6 j# y" i0 Y9 D - Data_Desc DESC < 0FFFFh, 0h, 00h, 92h, 08Fh, 0>, K- q: J- R' B( r: p4 T1 I) C
8 w( z* }3 S9 C! m( x- GDT_Addr PDesc <$-GDT_def-1, >* B1 K6 L: V# c8 n
- DSEG ENDS ;数据段定义结束0 M8 [: I6 r1 h; L! c" o
- 2 ~. m9 y* a5 d
- CSEG SEGMENT USE16 ;16位代码段
9 T: ]5 p) B- d9 ^5 ~) r" k" r - ASSUME CS:CSEG,DS:DSEG
; ^+ @, I7 Q9 q- u' b - .Startup2 ] \% G4 D4 d! W7 M# o9 L( B" q
- call Set4gb
& v9 P N. r0 X9 U - ;4 [1 ~9 [ {) j% ^1 W# [
- ; fs, gs即能访问4GB空间7 p4 ]! T2 R! w8 H9 w" D5 ?+ p {
- ; write your code in here.
2 `/ o1 ^1 O/ X7 q0 F" ? - ;! E, B, v5 I. D1 ?0 x
- .exit
% \+ u0 N; O2 S2 T6 [/ {' M -
% }( V, v! U# l9 z! I' B" d - Set4gb PROC NEAR
/ k% s T( r1 u4 I - in al, 92h
- [2 A% z$ L& o1 {3 b0 ~ - or al, 0028 i" y* t9 l) M) x9 M9 |2 {3 T
- out 092h, al8 c1 i2 V: H. m& ^# S+ ?
- out 0edh, al
: l7 W# Y9 K: p! V7 s' z7 F( V
# n6 T" m$ u) B+ _8 P* }- cli
' Q5 E, T- C' i3 r9 [% y, B# {1 g/ [ - - `! v" Z: H. K; g8 R
- ; mov word ptr GDT_Addr, (2*8-1);
/ L4 z+ \3 {+ h" ` - % A$ j w. D8 ?% R/ d, K
- mov eax, ds t p. M+ A0 j) R; w7 N
- shl eax, 4: ?7 T! S! z: H# u% S* w" t
- xor ebx, ebx
9 F# m4 J/ N9 C& n( F9 x) k! Y - mov bx, offset GDT_def/ M. J- k* [- U1 p
- add eax, ebx, w2 ?1 J. p$ H- G: Y
- mov dword ptr GDT_Addr.Base, eax
) g, i0 [; s; r+ g - lgdt fword ptr GDT_Addr/ w. T* p3 x* z& d) V/ K- N0 N
, E! z1 M/ i( L* b- mov bx, 8
' L3 f% ?. L9 \$ i. j - mov eax, cr0
$ `2 C; G9 T2 e6 i# ~6 G: s7 a - or al, 1
: ^% }0 E& F! d% q - mov cr0, eax
0 G: @3 k, b p4 T7 F" F% b$ x
. I- W/ l3 p* h- jmp pMod
8 y& K' |$ t) s8 L8 ^ - pMod:/ C) z& j5 _" n2 I
- 7 P! Z+ m( g: j0 E- b4 S" f
- mov fs, bx
* _1 J! q6 c- f; K: \ - mov gs, bx I# p3 [9 M6 g
- and al, 0FEh, c( w, o" g3 q# {. _9 ?% i W6 `
- mov cr0, eax
- i! \1 \4 B. G ~% K. r -
+ x" d" `. v7 ^) f/ o# w o( \' ? - jmp rMod W5 @" b- Q# g) z2 N" Q, A% Y
- rMod:
9 h+ p1 _ N7 m! x5 Z3 m
: K0 d5 d; u- W# r Q# e- mov ax, 0
2 `1 A1 p( `( s: { - mov fs, ax
6 f( _- W: l( v- C# Q. S - mov gs, ax
- ?2 N3 l0 V- V3 T) Y3 g3 e - . H# a- R# }% P1 A$ E1 A
- ; 在2M的位置测试写一下数据
* [1 F# I, K- F: ~6 e2 X! Y - mov esi, 200000h
# W, K! X5 G M4 a/ S0 Y2 f$ k$ z - mov dword ptr fs:[esi], 055aa55aah3 t1 M! ?0 I7 e+ V
- ; 用RU去看看200000h的位置是否是此数据.... J2 v! ~- Y! H: P# E& `; G" ^ N# W- \
/ t) K, x5 k3 A+ B* w- sti
) P" t% \4 s; m8 a" Z - ret
* Z C; B1 \6 o% x - Set4gb ENDP( c Z* ^/ A& n" h- ~
-
8 d) R2 l/ s/ q3 o! P - CSEG ENDS ;代码段定义结束
{; m! A" d8 W - end
复制代码 |
|