|
|
刚学习的同学,有些还不会,我这里贴点C和asm的代码。只供参考。 i* s5 ]) w5 N: [
( Q7 v( K/ v' C/ [+ Z% a1 E( v( h这是C的- /********************************************************************' a( v0 A+ g0 H! N+ w+ Q' W
- * File: DOS4G.H *
. ^2 v0 {( E4 y: G8 v7 d) K - * Compile with BC 3.1 ( Editor: Tab size = 4 ) *
: }/ Y7 K7 ]% ? u" @ - * *
7 C( v7 L! ~3 k) H7 [, ~ - * ========================Title=============================== *; Q8 M% K1 A% y- y I# x$ {& \/ d! H
- * 这个函数是让系统进入DOS 4G模式 *6 O) t2 s: U% _$ K, M) F
- * 程序参考了:陈家琪《DOS实方式下直接访问4GB》 * l* G F0 G) @7 s( B4 v- U
- * */ B$ |' u: B5 A$ l4 k0 Y+ J
- * 使用: openA20(); set4gb(); *
: x4 F+ p0 y' d% z - * *
) y. [0 [1 U( k - * ===========================History========================== *
4 H; O4 |# Y9 F0 C) ?8 d) n# k2 F - * author: bini * h" h' d8 P0 c1 d9 }
- * date: 2004-11-30 Frist version. *) }/ l8 I+ N5 z! ?
- ********************************************************************/
5 X) w) T7 j3 c) I
9 `" G9 @6 m3 \9 Z& \* ]. v- #include <conio.h>
5 @: B) o3 t- j+ J9 c - #pragma inline
+ B, s* `1 C2 {- D - 2 O0 w' V& Z* u J: k1 Q
- /***********************************************
1 u( J- P# Y4 K6 T+ g1 P - * 两个GDT,第一个为系统使用,不管,默认为0 *0 v, ?- a* l; T- T. e0 S
- * 第二个为一个数据段,没有代码段。 *6 X1 r" z1 q8 z- a1 n% A
- ***********************************************/
, }; l% I# H8 v8 B9 @6 F( m - unsigned long GDT_def[ ]={0,0, /*系统使用*/
8 R7 `8 s5 @: w$ E' ~+ \ - 0x0000FFFF, /* hi16bit( 0~15 ) is base low=0, ! Q3 c5 [* K+ s9 g* V
- low16bit( 0~15 ) is limit low=0xFFFF + k+ n b T# p9 |# r6 s% } k
- */
" @ C$ L5 j3 K0 ] - 0x008F9200};/* 最低字节为 base( bit 16~23 )* N8 F2 l- ?" I4 H3 w1 \" L
- 最高字节为 base( bit 24~31 )& m5 H# j/ I6 S( h, n0 r4 z
-
" \. D( H5 q! F% h; o - 属性Attrib = 0x8F92" z) R7 C! o$ I" `5 ^
-
3 I1 }, c9 U, r3 ^3 |; z1 S# r - 属性位Hibyte低四位为 ! e7 |/ L: _9 C* N; h! Q# j
- Limit( 16~19 )=F
: w" ]* ~/ U2 F6 L) r' V - 属性位Hibyte bit7 为粒度
8 Y0 J4 Q, T/ t8 o8 ~ - (值1=4KB粒度)
+ \6 m7 L' u5 X- B; o4 p; }% q - 8F & 0x80 = 15 M1 d9 L9 [7 N( z) x& q. Q
- ) i' w0 W! H1 U9 X# D0 q
- 属性位Lowbyte低四位为段类型,值=20 x: v; r5 U( o1 L3 y' {2 |% |) j
- 表示为可读/写段8 v8 z, `" M* c; q; Q7 n0 F
- 属性位Hibyte高四位=9,bit3=1表示:8 l5 ~1 W# I# p0 u' u8 I
- 描述符对地址转换是有效的。/ s: G6 E7 U9 B; M* O. S
- bit0=1表示为:0 }! G& d# J& [
- 系统段描述符。而不是门描述符。6 j, N w6 ^ A* p
-
0 w7 k5 M: ]3 ~7 p t* B/ R" V: ~2 p - */
8 I3 _5 ~# I9 U% O$ k1 I- J( K - 3 }1 T: ^$ u0 h% K: Y
- /****************************************- p, g; I; u; A6 s$ e! v) d j
- * GDTR寄存器, 48bit=6bytes *
( m; [; R! T$ k0 p3 R - * +-------------------------------+ *
! j: {7 o- A2 N0 R8 h# T - * | 32bit基地址 |16bit界限| *2 G+ l4 M9 q) r
- * +-------------------------------+ *) i9 v3 x- a' T$ T; G5 p3 J" x/ T
- ****************************************/0 {' K# z6 a6 X$ W7 w, L
- unsigned char GDT_Addr[6]={0};; P2 D$ X( q4 c N4 h& ?
- : Z/ `" _' n& R4 D3 P( m2 u# \; P/ P
- /****************9 T! K" ^$ i1 O! I+ X+ [# w
- * 打开A20门 *
- ?/ y6 h) T) d, b( l* ~ - ****************/1 q: S) w% B" w8 C! i& B7 X; x
- void openA20(void)
* h! Q/ Z- `* B5 y( ~0 W- l- Q - {
" U1 i2 N( l8 f. u - asm{- S4 R g0 I0 M4 f
- pusha L( B$ @; v# K+ C# e
- in al, 92H" @: O( U$ K0 }; o
- or al, 0x02. {! T; p. y8 U$ Q8 S
- out 0x92, al
5 E8 c( Q8 b2 J1 \ o8 n* t9 Z7 e& p - out 0xed, al
; ~# Y( b& ?! r; l! }/ I/ `& N# U& S - popa
q8 w) P& l0 }! d - }
. j8 u0 K! c1 ]8 ^ - }/ b s3 q; s7 C _7 W
9 n v! ~6 M6 A3 m O- /***********************************************' f4 ~3 m; E, L6 l( C j
- * 函数功能:进入DOS4G *0 }# q( R. J) u4 M! h/ ]. Y, N8 Z
- * ==================== *
, o+ _5 x- X1 S3 K - * *3 I F& I e8 T }
- * GDT描述符界限计算方式:描述符个数*8-1 *6 g0 w& ~" B; U9 p9 i
- * 如: *
0 ?2 }* U7 p2 P! c6 o: L% i - * mov word ptr GDT_Addr[0], (2*8-1); *" F- ]) c& k X: j3 ?0 j: d T
- * 表示为 2个GTD *
. C4 j( t, J. H. g/ @ - * *( e8 _) V! m# t+ y
- * 选择子为所在描述符内的字节偏移。 *
4 I9 j; e9 y+ D# y - * *+ A; w+ R/ m) g" l; [
- ***********************************************/0 f% ^0 h) W. \* ?; t
- void set4gb(void)
% ?, b$ L( [& b - {
0 X9 j; {5 J( K - asm{
3 G( n1 t9 f, ]# M/ A0 x6 K! z - cli
* V2 X) {# C5 C6 Q4 O- \+ C - /****************************************
; t0 z; U& D1 A, O) M$ m - * GDTR寄存器 *
$ t; R7 i/ c& W8 ` - * +-------------------------------+ *$ M# K* R, t5 S6 G6 \
- * | 32bit基地址 |16bit界限| *
! n, v0 }' d3 M. m; g! h - * +-------------------------------+ *! d% v# i. s8 }
- *****************************************/
7 T* p- f; Z3 V- j; ^4 { - /*********************( A+ J l, g4 B) I; C. l
- * 得出段界限 *
1 w) @- j# [8 M. C4 h5 F1 F/ X - *********************/
$ [8 j8 ~1 d0 j+ B% g- l - mov word ptr GDT_Addr[0], (2*8-1); j- _8 M$ v8 C; ?
- /********************************************) L$ i$ V; T1 }% T. ~1 c+ |
- * 计算GDT表的32位基地址,存入GDTR *
7 D, E. X* M c1 T/ V$ p% W - ********************************************/1 @. @- O8 x# f$ H, Z( Z( V0 Y
- mov eax, ds9 h8 S, i0 O3 w- g; n) [4 D
- shl eax, 4
2 q1 |1 \7 D2 v6 H C6 V7 }4 e, p - xor ebx, ebx' M3 p* }, u) E. g1 }4 q3 W
- mov bx, offset GDT_def
0 m4 [5 Y% i8 M% M - add eax, ebx9 u* {9 c2 E: p* }$ i8 m
- mov dword ptr GDT_Addr[2], eax
0 u: O# I! q, J { - lgdt fword ptr GDT_Addr3 b0 X5 l7 X d9 s
- /********************* |* y* P* i j/ j! p0 \
- * 选择子偏移 *- G: E& b. S9 b$ U S
- ********************/
( y$ B2 {% a- c4 b9 ^6 ^ - mov bx, 8) `/ j4 s v& m( k, D+ i1 O" d
- mov eax, cr00 A4 ^) `" s: E6 _6 h7 c1 I
- or al, 1
# s% R. B& m3 j5 D - /**********************
! W! i5 k% }; L - * 进入保护模式 *
) g& v+ ^3 z1 |9 u - **********************/6 u- x+ S7 d R1 [" }8 G+ C
- mov cr0, eax+ B. s, N7 ~0 K: \2 g
- jmp pMod* N3 m p4 f, r6 y( @1 N- G' E
- }
0 R5 G# S$ i' q4 _: A
3 W7 E, ]0 m8 T: e! G) {& Z( ^- pMod: asm{. J; p! U% c+ |2 n% N
- /************************************************************" ?( c& ]9 Z; O! m$ I. j, \
- * 让fs与gs加载选择子,使其能访问 0xFFFFF * 4K (4GB) 空间 ** s. K8 N; ^# G _* E
- ************************************************************/
/ ?% B' `( n1 c' [4 ~5 m% K - mov fs, bx
" Q1 j+ {# q% b# q9 O, }, ~ - mov gs, bx
# Q# s8 h& P1 ^) w* m - and al, 0x0FE4 c. J! W U' s/ O4 p
- /******************
8 X+ i. A- f% W2 { - * 进入实模式 *- ]( ~# g* r9 |0 L7 y6 w/ j& f
- ******************/' C& `- p6 `& O3 N
- mov cr0, eax
' X& ^8 p* f9 J$ _1 L5 X - jmp rMod& Y7 o4 N) o9 C! H
- }! e" ~( M+ _" M/ B6 }: L+ ]
- ! [1 _+ J/ b0 T: E
- rMod: asm{
+ U2 m, A5 v- `" y' H( b1 m# @9 X - /* ******************************************************************% Z! ?* z+ t1 w0 s3 [1 c6 w
- * 退出,fs、gs清0,访问系统内存可用: gs[32位,相对于0的偏移地址] *
; Z) z) {2 u+ ~6 n1 ]/ v+ B# ?2 D - ********************************************************************/# [8 ~5 b% C6 ]3 P0 K5 a- o9 H
- mov ax, 0. r, [$ G+ n( q- L0 J$ ~
- mov fs, ax
8 m/ M2 M( v* T: z" C - mov gs, ax
/ f/ ]0 C+ w3 I% J1 g - sti
' h1 l) P- A9 L: H" B& D$ J - }
* i; [4 t/ d1 J3 D - }
复制代码 这是asm的- ;/********************************************************************4 l( Y7 l" H9 J3 z
- ;* File: DOS4G.asm *
- O0 F) b+ `) @' d W5 L2 {( @' F - ;* Compile with masm ( Editor: Tab size = 4 ) *' H( l1 L+ H# u) ~+ ?
- ;* *5 P7 D8 v* B/ B( x+ K$ z. S% W/ o
- ;* ========================Title=============================== *
7 \, X6 |3 l% T7 f - ;* 这个demo是让系统进入DOS 4G模式,进行数据访问 *
8 e2 m: v' J% ~$ n - ;* *
: h3 U$ |' k7 F2 x a - ;* ===========================History========================== *: g9 E5 ?! k- v. F0 r
- ;* author: bini *5 S# M1 P$ [/ U
- ;* date: 2008-10-08 Frist version. *
$ _0 Z, u- M; l - ;********************************************************************/ / r5 f% l1 D. M" B( y
- .model small4 x6 d( T4 ~% r3 N4 n6 R
- .586p
Q7 f, y& y8 @8 v/ x6 ?8 g! q4 ?1 J$ | -
" C1 t) I2 K, P: s4 w0 i - DSEG SEGMENT USE16 ;16位数据段
* ?/ Z1 C/ H8 n: R
$ o5 n1 |% {, D! T+ B, ?% K- DESC STRUC
, N5 D3 W5 e0 V- z$ ^6 M - LimitL DW 0 ;段界限(BIT0-15)
9 q' v- t2 l% _2 H) f - BaseL DW 0 ;段基地址(BIT0-15)
. ]7 _$ Y. m& m4 q2 T - BaseM DB 0 ;段基地址(BIT16-23)! b' c6 `' j: D B
- Attributes DB 0 ;段属性
2 z: H% \/ R! f7 w& {! }5 V+ W& q& y - LimitH DB 0 ;段界限(BIT16-19)(含段属性的高4位): v+ m# [& y! N$ x0 u4 ]! _+ [$ k$ ?
- BaseH DB 0 ;段基地址(BIT24-31)
. B, Q) y" I5 j( q - DESC ENDS
3 a a- L: P. K% }1 @- y - ; h7 t0 v; T2 `% p, P
- PDesc STRUC
& d% |6 Q6 K) N. C - Limit DW 0 ;16位界限
, v8 c8 d" g8 q8 S - Base DD 0 ;32位基地址
7 N9 p% S8 `# F |( e8 O# ` - PDesc ENDS; `) u; r( l, m/ T) m; {& Q
- 0 D5 V# @5 A4 c% y1 j7 c: I
- GDT_def Label Fword
# Q7 o& Q+ s* c4 f8 C - Null_Desc DESC < 0h, 0h, 00h, 00h, 000h, 0>! y4 j* m# S+ l( z% |1 w
- Data_Desc DESC < 0FFFFh, 0h, 00h, 92h, 08Fh, 0>5 [2 `! T! C8 k9 z6 U" d
- 3 l8 ?5 K$ p' F2 a/ K: \
- GDT_Addr PDesc <$-GDT_def-1, >3 |% r1 {; x& g$ G# V4 ]
- DSEG ENDS ;数据段定义结束" u1 W; H, _" Z0 D
- ' q* t: p7 c* I) }- T$ K
- CSEG SEGMENT USE16 ;16位代码段 W, C8 ]- G" s
- ASSUME CS:CSEG,DS:DSEG8 |6 z( X2 L. _, O/ c0 u
- .Startup0 R4 H; f) F" [0 |! q
- call Set4gb" @5 I& P7 J: @* [4 w. D5 t2 Q
- ;
1 m) }2 y% w, Q - ; fs, gs即能访问4GB空间% b8 o! r+ | C4 z) |! j6 q
- ; write your code in here." ?+ y8 ?' V0 x* F+ F- e: S
- ;6 X9 `; M0 y q; l9 k6 c- i1 d% O
- .exit0 H% l( W" Z( i. g
-
$ ^' v9 |. z* a) [* y - Set4gb PROC NEAR
5 h! A( `" b5 q' ~9 d - in al, 92h! }3 E5 s* @8 U& b e( @1 Q
- or al, 002
) y# J. H8 U# ?. [ - out 092h, al7 W7 w* Q! H) e2 b D# G
- out 0edh, al
' c2 |6 \# Y$ _1 G: C2 I - 0 p! I2 V3 R4 [' F' P
- cli2 }9 l5 n; R" `1 k
- & G. R5 G4 K+ a' r* a
- ; mov word ptr GDT_Addr, (2*8-1);+ I' f3 Q4 h: a+ e$ R* |
1 b6 v4 M; Q# V9 |8 l; z4 t2 a- mov eax, ds- I7 u0 i0 T p8 z3 l o2 r) R
- shl eax, 4
. [* X" N- O/ U: q" L! y2 }, w4 s - xor ebx, ebx
0 } r$ g2 S6 f7 @( G - mov bx, offset GDT_def
3 f, K! H N, ^ - add eax, ebx
! ?% r2 |- D8 \' A4 w$ ~ - mov dword ptr GDT_Addr.Base, eax$ a; r j3 p$ p# G4 J- x: F
- lgdt fword ptr GDT_Addr
1 S8 C" X4 g7 J7 o- T- }' A - ( C- z U/ l9 o% _: ~
- mov bx, 8+ s; `6 y, e. `) r) w2 V: [6 n0 [* W' G
- mov eax, cr0
8 q1 M0 ]0 u& O0 j - or al, 1
. U6 P; V& V; u l1 Z0 g - mov cr0, eax, z; |5 Z5 Z# `1 e" V g: m
- ' u; Y- d% q. w) j
- jmp pMod
# ~9 V) I* q' h9 M. \. ?# |8 @, q - pMod:) T+ L; T0 R$ o- N
: X6 A; ]1 T5 K" L) ?& g- mov fs, bx8 C h. T/ t. U8 z$ G4 [' }' P3 {+ Y
- mov gs, bx6 P- a, P+ O5 M7 k, y, b
- and al, 0FEh
: X' ~% v& y( t# M0 M, f# W - mov cr0, eax& L' Q% l3 t( V) {& F R
-
$ M9 g# L9 r1 [ - jmp rMod
7 Q. V+ n* R: z, p1 S- P - rMod:. D4 C, P: M4 B1 [5 f% h3 O1 D
6 p) F8 ~/ c& m* W3 }- mov ax, 0/ O6 n3 B( l, U2 U
- mov fs, ax3 l7 ]) f3 K" S
- mov gs, ax
+ u6 {9 U1 u! _+ N: b' u/ {* c -
7 M/ r0 [$ S8 }" ? - ; 在2M的位置测试写一下数据
4 Y, r. z) W0 c( F# ~" [/ \: I4 ^ - mov esi, 200000h) Z9 b/ `8 W3 F9 n2 r
- mov dword ptr fs:[esi], 055aa55aah( ?& P' E' Q: @* I
- ; 用RU去看看200000h的位置是否是此数据....
1 {; t* L" ~; }2 d - ( z+ @" y6 n6 U) h5 }
- sti
9 s4 H. n% n5 v, K: s' u' k7 e - ret
3 c9 o9 Z! ^ ^) h& m6 H - Set4gb ENDP8 f% ?) ~$ K5 Y* H/ a* d
- * X ^! [3 v& a2 Z2 D
- CSEG ENDS ;代码段定义结束2 j- B% Y8 N) X+ Y
- end
复制代码 |
|