|
|
刚学习的同学,有些还不会,我这里贴点C和asm的代码。只供参考。
3 r, n5 H8 n: f+ x Q6 { D; e4 @, E, ]0 s( H* `) o/ x
这是C的- /********************************************************************/ M+ c9 |8 T6 v6 c3 J
- * File: DOS4G.H *
4 Q1 u$ ]* n, W( b/ e1 r - * Compile with BC 3.1 ( Editor: Tab size = 4 ) *
7 T" e# p9 m# t7 O' A - * *
0 B7 Q; |0 s$ Q: W3 a - * ========================Title=============================== *7 |0 ?0 n3 a$ E. p+ {7 }1 e3 y G
- * 这个函数是让系统进入DOS 4G模式 ** s) E4 p7 F0 h0 Z
- * 程序参考了:陈家琪《DOS实方式下直接访问4GB》 *
2 i) a) U2 J# @+ p. T - * *
& n- g }0 S8 U% Z: H. q- D, F - * 使用: openA20(); set4gb(); *
3 G' r# q$ K$ \/ J: E8 ? P - * *
5 c8 @5 i B( r6 Y* B0 ~ X5 k7 S( O - * ===========================History========================== *
* o* y+ @8 b% e L: e. U# k - * author: bini *( F: W8 A( }! \
- * date: 2004-11-30 Frist version. *
! U9 n9 x( v7 w - ********************************************************************/
% k. A% j W0 \/ U' m/ T. T) r. Y - , A1 f! ?! |3 W- d7 Q' S
- #include <conio.h>: C, o# T* V. l, H) v/ T- {' K
- #pragma inline) m" \6 V5 U" V4 o' I" p
- 7 }# y8 ?, E. q& v% E+ c1 q \
- /***********************************************6 H5 M/ h& a" K: o3 e3 }+ a
- * 两个GDT,第一个为系统使用,不管,默认为0 *
$ @: H# f$ Z4 _3 N2 J# o, | - * 第二个为一个数据段,没有代码段。 *) o: m$ Q' r; ~
- ***********************************************/
" R3 _' m2 D/ t7 C" X3 s) F } - unsigned long GDT_def[ ]={0,0, /*系统使用*/
8 ^% d% d2 `8 J3 Q - 0x0000FFFF, /* hi16bit( 0~15 ) is base low=0, 3 n" m3 n; f4 x3 a" Y. S
- low16bit( 0~15 ) is limit low=0xFFFF
& \8 C* [- t1 z; A9 _3 [6 _3 m - */
9 @3 b4 O5 j4 r' A/ Y$ p! |% p+ J - 0x008F9200};/* 最低字节为 base( bit 16~23 )
2 Z9 q9 F) E/ t9 R - 最高字节为 base( bit 24~31 )$ g" p L/ m( O2 g$ t/ _
- # Q: n9 o9 a, L C. `" R
- 属性Attrib = 0x8F929 U E D, O: J
- " G e! L8 X% b
- 属性位Hibyte低四位为 ( F3 y3 l! y/ X' Q" R' \% x V
- Limit( 16~19 )=F
( E8 Y! ~* s1 w2 A6 d2 E# F6 u - 属性位Hibyte bit7 为粒度% U- x' k. R% s3 f2 B1 j
- (值1=4KB粒度)
5 y& E4 K# M: W: E$ K! O - 8F & 0x80 = 1
* n. l: G2 i% H2 r% M - ) M" A, K/ p* T. g9 D8 d
- 属性位Lowbyte低四位为段类型,值=23 b) c. w4 O3 b! v5 \# S7 T( h
- 表示为可读/写段2 r, b+ \+ u1 o4 }! x6 `3 h1 R5 k" z. U
- 属性位Hibyte高四位=9,bit3=1表示:
' a' m. [$ v7 l( _/ H - 描述符对地址转换是有效的。
' K" S, m; P0 X - bit0=1表示为:
0 K/ F. w' x: R5 D P' @ - 系统段描述符。而不是门描述符。
- w" j/ S4 O) V$ j - 3 f0 S% v& P2 Q @
- */
! b( ~# \0 J4 B. h. m7 q
' m$ _4 b F4 v$ G) P8 `8 C+ [& r- /****************************************
& V/ l" H0 F1 U8 S, V) @: c g - * GDTR寄存器, 48bit=6bytes *+ i& V/ w. }& V' s/ s" j( |- D
- * +-------------------------------+ *
" ?/ r5 U6 M/ `# ?. y& Y9 ? - * | 32bit基地址 |16bit界限| *
3 v/ j* V' A! i4 R - * +-------------------------------+ *8 g- S* P9 s+ m y7 Z0 Z8 I3 M R
- ****************************************/5 L: N W. p5 F6 u; g
- unsigned char GDT_Addr[6]={0};
$ W. k. L3 b+ G0 i l1 E& Q - : Q2 Z1 f9 x$ W3 Y
- /****************- t) V+ z$ X9 {. |& P
- * 打开A20门 *$ K( s( c- `& a/ s7 l& A$ C; `
- ****************/7 K$ R4 ^' C) _) U8 r; w
- void openA20(void)
( P8 v& I. l9 G: t- l3 f' K - {
4 ?3 h, H& q+ j" O( | - asm{+ S0 v9 ~. w& `& W, u- @! |
- pusha
# B. ?" v6 @& K: G - in al, 92H
; n; `( ]4 J. \* U - or al, 0x020 g; F4 U3 O7 m6 W, y' J
- out 0x92, al
; d' Q2 ^6 ?/ r) A: o - out 0xed, al
/ N( b1 @6 X+ c6 ~/ h, J4 W - popa
) Z) x: W+ w1 }" o. Q: t - }4 |% p: f# i; T9 `# Y4 e0 O9 r
- }
7 ^! g" B9 u) P* m! {, v2 q5 Q+ s - + l+ J9 v6 @5 J# D9 u8 X6 m, X
- /***********************************************
' }8 @/ A) j* | - * 函数功能:进入DOS4G *1 A3 Z& C, n% g9 W! S
- * ==================== *
! v- e; o! W" M8 i( ` - * * P8 e9 ?8 x0 S; c" b, U
- * GDT描述符界限计算方式:描述符个数*8-1 *- z7 N2 h6 U- m
- * 如: *
: T3 V+ ]6 q& @1 s+ r - * mov word ptr GDT_Addr[0], (2*8-1); *
7 E8 u3 @0 e. {$ C - * 表示为 2个GTD *& s' `& l( L5 [) N
- * *: p& t ?7 y5 R; b- t8 x* O1 f
- * 选择子为所在描述符内的字节偏移。 *
" x. [# t% v7 t _' G) J - * *
- O, c& y, I2 u, K5 h% ~- E - ***********************************************/
! U: D# a1 `/ ?. l - void set4gb(void)! D: ?5 J7 u0 i6 e& s2 R( \
- {
& { F1 F$ A% L# G2 U& s/ j - asm{
) c$ q7 X. Z( w: G; d1 V1 ^ - cli# V. ?; x; \; j0 S
- /****************************************
+ y7 z+ W4 E; }: K4 q6 j" _* \ - * GDTR寄存器 *
6 K4 c1 v T* @ h" h- {9 p - * +-------------------------------+ *
7 S; O' D, U- b) c - * | 32bit基地址 |16bit界限| *
Y# T: F u- i* b3 E7 t, @$ R8 r1 A - * +-------------------------------+ *% v4 A2 W; T- A+ I; \7 `
- *****************************************/
7 _" y5 Y: }9 V3 J# Q7 G' m- F - /*********************/ f; a5 ]1 ~" p; k6 e
- * 得出段界限 *
; I9 ^4 k2 o6 E0 V( { - *********************/
r5 \, \5 p, n6 o' c- p3 t - mov word ptr GDT_Addr[0], (2*8-1);
! R5 j$ [$ Z, m - /********************************************) d3 |: ]$ j ^2 W& L+ b B- P
- * 计算GDT表的32位基地址,存入GDTR *% R7 x( v: r: ]: k2 Z
- ********************************************/ }" \5 I, f: S/ I8 y
- mov eax, ds t4 i, U6 z! B' c& I: b
- shl eax, 4
0 m. w w4 o Y) s9 l6 F: o p& M1 l - xor ebx, ebx$ |4 o4 | L+ W. k7 |0 h; g
- mov bx, offset GDT_def5 l$ H2 [! ^7 V$ @/ s
- add eax, ebx
5 y& { z0 q* ]$ M, b. F- a - mov dword ptr GDT_Addr[2], eax1 d/ u% n8 N3 e2 H
- lgdt fword ptr GDT_Addr' [* `( E% j5 [5 j* ?
- /********************+ h6 {6 G: t* n* `/ q
- * 选择子偏移 *
& p9 {, P# W1 n' C - ********************/, ?% B4 k# B/ H$ n6 y$ d
- mov bx, 8
. R9 x: `/ Y. g2 D - mov eax, cr0, z& M' g3 q0 H" V; D. ]
- or al, 1 W4 d' E1 W0 ?( p8 j+ N
- /**********************8 \, ]0 B( O! D2 o# Z
- * 进入保护模式 *' I. J: V" L! _0 {. P" r0 x
- **********************/
) _0 f/ r. G# B7 q - mov cr0, eax
* x! t; u, ?- q# X1 o - jmp pMod1 u" J% t; [ i$ q. H& p
- }
9 M# G; b: }5 g2 j' w1 V5 K7 g- n$ G - ' o$ i1 N* y- }% j! @' P
- pMod: asm{5 c8 N2 I: k0 B+ R
- /************************************************************ h, d3 i; R& Q5 M4 D% g7 _- o3 O6 [
- * 让fs与gs加载选择子,使其能访问 0xFFFFF * 4K (4GB) 空间 *
6 k5 B$ n5 w: u - ************************************************************/
$ Z- @0 A$ r+ A; ~- [ - mov fs, bx
7 |5 {* Q* Q) p6 W - mov gs, bx
! y0 t0 @; u# J% Q/ w8 e+ L - and al, 0x0FE4 v% @7 O$ L( {
- /******************
7 k- L+ U" L, W; i - * 进入实模式 *
% M, J5 D' S& H/ Q+ E - ******************/9 y: u3 k9 S. ]# f: _
- mov cr0, eax
& r% S+ b) a' F; X6 p9 j! w0 [ - jmp rMod
; p5 N- j8 C# J - }
) Z9 V$ ^' P: _8 Z+ g - * v: T' ~7 p5 v1 U; Z
- rMod: asm{
: Q& W$ E5 l$ R - /* ******************************************************************
4 _3 z* v* g" D( y: ^+ k' ?6 a - * 退出,fs、gs清0,访问系统内存可用: gs[32位,相对于0的偏移地址] *: v) m5 B! T" ~! }0 z* Q: e5 v
- ********************************************************************/
9 f! }9 v( k" X7 Q) T7 g7 l) a$ s5 o+ n, X - mov ax, 0
3 l- e$ b' _- z8 A4 V) b - mov fs, ax
6 L, `) }# y' Q. j, k - mov gs, ax
. x: k5 `- d2 a! s6 e c5 [/ ~ - sti" c7 i, [( R$ Q X
- }
9 Y# K: g- x! @( j w' {: w* X& \ - }
复制代码 这是asm的- ;/********************************************************************
# }3 Z& D0 t3 }6 R. [! q4 s. M - ;* File: DOS4G.asm * |5 C5 m6 w, E& Z) ~- c- w" C- q [1 q
- ;* Compile with masm ( Editor: Tab size = 4 ) *
/ r9 Z" [6 P; l/ [& P6 u - ;* *: b% ?+ M/ H! V# D
- ;* ========================Title=============================== *
9 m( _- H9 [5 y% Z) A - ;* 这个demo是让系统进入DOS 4G模式,进行数据访问 *( V J6 J4 R8 y0 W; N
- ;* *, j0 T7 G) M. ^6 o7 k1 o
- ;* ===========================History========================== *
3 ~% b; c2 N/ O - ;* author: bini *
5 M5 i( v* Z& F7 W& _7 g8 X% { - ;* date: 2008-10-08 Frist version. *
7 z: p( c" V& `& e, u7 E - ;********************************************************************/ 8 B& f; R+ k. o% w( z
- .model small
3 j9 {& f" Y: n2 R) \+ \ - .586p* h5 I( s! R9 y U5 L
-
! ? U0 u n: d$ z+ i6 S - DSEG SEGMENT USE16 ;16位数据段
0 B4 m& x5 y+ x* V - # t) q, Y% f" f% P+ S, |9 g
- DESC STRUC
- } V! P1 Q- t, l - LimitL DW 0 ;段界限(BIT0-15)
. p/ W- j0 L4 }* Z1 R - BaseL DW 0 ;段基地址(BIT0-15)4 r% g) R& k& L
- BaseM DB 0 ;段基地址(BIT16-23)
/ P; H5 N$ o: C& U' ^ - Attributes DB 0 ;段属性( a/ r7 |. Y$ @8 I* @$ H
- LimitH DB 0 ;段界限(BIT16-19)(含段属性的高4位)
. H/ @, B$ p& R- I - BaseH DB 0 ;段基地址(BIT24-31)6 P* Y) H) M( M, M" A% y: E
- DESC ENDS+ e8 `9 ^( O! ?" Q6 q. N+ G9 p
6 w) _0 V7 n9 z6 a- PDesc STRUC3 w; ~# q/ C9 y% R$ [' N. @8 F. H
- Limit DW 0 ;16位界限( b( R) w, P% S
- Base DD 0 ;32位基地址
6 g* }' P7 N" U3 K& ? - PDesc ENDS
) Y8 k/ e/ {5 A; S! j - 8 I( n Y; G' K& ^
- GDT_def Label Fword' h- G- |$ n- b: ]* ?: D
- Null_Desc DESC < 0h, 0h, 00h, 00h, 000h, 0>
, |7 c4 f$ R+ \1 L - Data_Desc DESC < 0FFFFh, 0h, 00h, 92h, 08Fh, 0>
' O/ W0 A! _( c# R/ n5 _ - : _: p: Q3 n; p: j
- GDT_Addr PDesc <$-GDT_def-1, >% R/ i. Z& @) N* L
- DSEG ENDS ;数据段定义结束
P: D9 W! @& j0 L! S7 { - # u$ U! ^2 J% Y
- CSEG SEGMENT USE16 ;16位代码段
! K2 P5 I; ~6 R3 w' J* U3 f! h - ASSUME CS:CSEG,DS:DSEG
; Y) r% I* E" r: f1 e - .Startup0 m j0 W$ u% j) M- @7 p5 ~
- call Set4gb
7 h: Z+ Y- `0 m$ }; Q3 e( g - ;+ r, `) f L$ d4 i9 u8 g/ v
- ; fs, gs即能访问4GB空间9 E) S; v. r" j1 C, C2 k
- ; write your code in here.
8 N5 B2 g% W5 L - ;
8 }6 `& m! S/ [/ f4 s - .exit3 K4 K7 G' D% y: W1 |& h
- ' N+ P6 Q4 v( ]2 Z( E6 g0 Q" i9 X/ Q+ Z
- Set4gb PROC NEAR+ e! E5 O+ F& [) n
- in al, 92h% j% p* m( f+ O; R5 Z8 o
- or al, 002" {4 ~1 J" c: W% v d
- out 092h, al+ W( u2 M \; S; Q4 v5 o ^. h
- out 0edh, al, R* l/ Z- B n8 C! ^8 u
- " D8 q" x4 ~& n0 p
- cli
! @# q8 ?# i3 I# c7 S% u
4 V: X9 {0 v: L) ? V+ S1 H% U2 I$ J- ; mov word ptr GDT_Addr, (2*8-1);
( c/ |: O+ G+ e# W9 P6 X - 1 n3 P+ l4 }4 i$ l+ I0 `
- mov eax, ds4 t4 t! y7 q4 w A
- shl eax, 4
6 t. d7 s* a' f - xor ebx, ebx
5 w5 V6 x" u3 P: R! [ u - mov bx, offset GDT_def* i& R# K2 G* Y z; D7 ^4 d- ~ `" w
- add eax, ebx
' g) G- O3 d5 x' i$ V3 S& H# V - mov dword ptr GDT_Addr.Base, eax
1 X! a) f9 i( O. S - lgdt fword ptr GDT_Addr; \( |& v% U; S
* a, Q" o& q. n- mov bx, 8
5 v4 n' j n- K; Y - mov eax, cr0
% `' c5 G3 i, y5 S+ L2 W8 v5 f - or al, 1! _( _6 X1 f' [. n
- mov cr0, eax+ }1 o/ J9 F1 T
' f! {& M& Q8 q, L- _- jmp pMod: i: h0 |. M6 ?+ a8 u" V Q
- pMod:
9 \+ C$ Y! r& P, u e# Y0 ^
9 g# B+ O$ l; w- mov fs, bx
; A1 n. u8 X) c5 `+ S - mov gs, bx
2 G9 v" Y( f; j ~. T+ ` - and al, 0FEh$ j1 [! E' m. G! A% e. ^
- mov cr0, eax
/ W6 Y3 v0 g# _ -
x9 v5 P& z( S) j6 @- J" T - jmp rMod
" Y' F j+ B! S& f, i$ @8 h - rMod:* V& h7 Y8 \; C5 T7 L
# `* N0 C" R" ]' q% n- mov ax, 0* ^2 b* }& ?9 r1 D o% o" R/ l
- mov fs, ax
. R% I) H! q) k/ M - mov gs, ax$ L/ b8 {9 r! O3 f2 X" ^
- 3 E* y! D+ |! T+ ?6 G# |8 s7 U
- ; 在2M的位置测试写一下数据, N3 ^) Z$ O" i% c: C
- mov esi, 200000h
, t% u4 w1 o8 S" N0 X7 D3 ? _ - mov dword ptr fs:[esi], 055aa55aah$ Z! @1 q9 L" w: D; m# u
- ; 用RU去看看200000h的位置是否是此数据....
! ^2 L. {3 y# [2 v
$ E/ e+ v* W( X; {+ d# H- sti
' Z- O) W$ L1 q; J( v# Q - ret/ s- l# K" U6 }3 D8 z5 E
- Set4gb ENDP
, m4 b8 z, \1 i -
! e- j" {0 x6 X% R: a - CSEG ENDS ;代码段定义结束
- R( ?: w% z' c4 | S% n- R - end
复制代码 |
|