|
|
刚学习的同学,有些还不会,我这里贴点C和asm的代码。只供参考。' W. k3 M- T3 i; n) W
4 }$ e5 R4 T) M3 }4 f这是C的- /********************************************************************
& ?, R& D9 z7 I2 x - * File: DOS4G.H *8 R0 @! G% p/ s9 F- ]
- * Compile with BC 3.1 ( Editor: Tab size = 4 ) *3 b" z% k$ h+ m7 h
- * *" S. w2 E" Z* b) K) S
- * ========================Title=============================== *
# d5 l2 B! o& M' s - * 这个函数是让系统进入DOS 4G模式 *) x Z, e; P' T/ s1 ^' d0 i7 a
- * 程序参考了:陈家琪《DOS实方式下直接访问4GB》 *
0 t7 s6 O0 L* k8 B$ z2 U, G, O - * * u9 Y. Q. q' Q- t
- * 使用: openA20(); set4gb(); *9 j/ _$ d+ _9 @7 F. @) J9 ^
- * *3 x4 p6 w- a1 `5 a$ y+ }
- * ===========================History========================== *" K6 E1 S& V, Y! [9 z2 D" j& x* p
- * author: bini *
& m2 I9 D9 I) U* |2 w" I - * date: 2004-11-30 Frist version. *! i2 r" [9 w; F
- ********************************************************************// E2 K; j2 o6 \6 m
- 6 J8 X. j3 T: x( c, {& C
- #include <conio.h>& P0 o- _6 k2 h9 u3 n( x" J9 V* P
- #pragma inline
1 K6 H7 d' j* Q* }- r- J% q- | - 6 Q9 i% D0 X/ ~
- /*********************************************** }. a) G" B5 y9 h/ I& l5 ^
- * 两个GDT,第一个为系统使用,不管,默认为0 *( k" R- r \! X! Y
- * 第二个为一个数据段,没有代码段。 *
7 m- z% z2 f- l" F& b) k - ***********************************************/
- O9 u0 m1 }% a - unsigned long GDT_def[ ]={0,0, /*系统使用*/
8 R M# Q0 Q# A5 i5 t% i+ O/ V6 W - 0x0000FFFF, /* hi16bit( 0~15 ) is base low=0, ! j; k" A1 C) L
- low16bit( 0~15 ) is limit low=0xFFFF
5 l- @8 L# ^, r7 y: j8 E - */
8 F; W' C) u. Q, ^' _ - 0x008F9200};/* 最低字节为 base( bit 16~23 )# Y# O, s F7 K) ]. D" c0 m
- 最高字节为 base( bit 24~31 ) i7 R* x. j1 z$ }9 H9 J
-
; q# P- s/ X. q1 S - 属性Attrib = 0x8F92
" U' p, e! y7 e/ _# l: S - 6 {$ B. J0 x+ A2 Z1 M3 ^9 m y
- 属性位Hibyte低四位为
R" Q& ?/ k6 L1 ? - Limit( 16~19 )=F- c7 b- ^, ?: x+ L
- 属性位Hibyte bit7 为粒度
( g9 }5 s% b+ R1 h - (值1=4KB粒度)
0 L. U* {- b5 T! H2 { - 8F & 0x80 = 12 h3 J" h$ Q4 d+ j: Y, e: }! x
-
7 p! S1 F4 Y: j4 U; o8 R - 属性位Lowbyte低四位为段类型,值=2" R7 I7 S% O- H* }5 P
- 表示为可读/写段
9 V' `% ]# u8 O, N, r. L - 属性位Hibyte高四位=9,bit3=1表示:
2 T+ r, s1 }9 O( F$ u - 描述符对地址转换是有效的。
3 r3 P/ Q, M9 W - bit0=1表示为:& E s8 q9 Z4 }! x) @; B
- 系统段描述符。而不是门描述符。/ v5 \ e5 K( y! q. c# T# Z- j4 l
-
" O) O. D) y2 k: z - */" E& s; _0 p3 T, O& z' B
- / G4 L+ o/ Z2 e( j9 p5 B7 k* F$ \8 K
- /****************************************8 u* {/ `' s* y- [* I1 m: J
- * GDTR寄存器, 48bit=6bytes *
0 D9 [% T' C: f' F9 R - * +-------------------------------+ *; C# y( }1 z# r1 ?0 |& _' ]1 a
- * | 32bit基地址 |16bit界限| *
% y ?; I$ w* n- @ - * +-------------------------------+ *
8 E0 e) G/ |7 R2 I$ Q4 m - ****************************************/0 k0 w D, f- f% w' v% p$ g
- unsigned char GDT_Addr[6]={0};( b' ?3 K: y$ p; k3 q( t8 X& ^6 B
2 P. U% t# G& ~ r- /****************7 d& L* X) |: S6 H
- * 打开A20门 *# z/ m1 l- c7 p5 n
- ****************/
, N6 P+ O R! t - void openA20(void)* I$ G2 J/ b7 w* N
- {
: u, t8 o" g4 r# D6 y* C - asm{/ t5 b6 p$ h$ ]* h
- pusha
7 C+ h: q: y& {" o9 @9 [ - in al, 92H
/ ]1 J9 w8 p2 A* A - or al, 0x02
0 T0 A* z) U* e8 N3 `: B - out 0x92, al
3 h1 x1 g. Z0 j9 e - out 0xed, al
) D! e$ z( w6 s& L, w - popa
# A7 t" e) q/ l F) ] - }. M' V3 h- i1 z5 l
- }: h7 ~( {! c8 x0 q3 L v
- , ~8 _' j: a2 ]$ @. A1 ]
- /***********************************************
! ~1 ~, e0 w3 H! L E! k5 O - * 函数功能:进入DOS4G *: z- V( Y2 I" s8 \0 u
- * ==================== *
, ~! X$ x9 T& s2 c - * *9 V- C, A+ {) h4 X
- * GDT描述符界限计算方式:描述符个数*8-1 *$ t) p2 U* e0 S" M$ O1 `7 E7 n
- * 如: *
9 R+ S1 T4 B% I: R+ \! V$ C4 j - * mov word ptr GDT_Addr[0], (2*8-1); *' _9 x: X; k. C ^) ^
- * 表示为 2个GTD *; Z8 Z$ w. s' P$ v3 N0 `* T' }
- * *( K6 d7 Z! S" a' b; t4 n2 G: t
- * 选择子为所在描述符内的字节偏移。 */ Q6 B5 a u# P# ^/ ^) k" J
- * *! z7 F/ H9 K' x$ o# y0 Y/ m& l7 m8 q
- ***********************************************/
* _% T+ M6 G: F2 G, z6 E - void set4gb(void)/ p- p% X* ~1 W
- {& l3 V: @' {6 ~' F; ^5 [8 x
- asm{& `: s1 v/ H- x$ P
- cli/ D, O% k4 L& d+ b( y
- /****************************************
0 n `: E/ X$ D, v6 ? - * GDTR寄存器 *1 ]5 ]/ S4 K1 H
- * +-------------------------------+ *- y' S* B% \4 d6 L, q( l9 ~
- * | 32bit基地址 |16bit界限| *
+ T2 W/ A; E5 B2 c) b7 E - * +-------------------------------+ ** ^* _5 I* r( g2 M& X
- *****************************************/
& e% \. U0 q7 ?3 k- u - /*********************, a, B- e( H# @% J6 s
- * 得出段界限 *
, o2 ` w6 r# |, B ]% e: U - *********************/' t9 a# R0 H: n& p' W2 T
- mov word ptr GDT_Addr[0], (2*8-1);
* \ J. [6 Z6 W' ~" N- z5 s, \ - /********************************************( l6 t8 u+ ^% T- X+ V
- * 计算GDT表的32位基地址,存入GDTR *! }' f# ^8 \9 |% V# O
- ********************************************/& Y. K1 Q7 N6 g
- mov eax, ds+ I" U$ ]4 V" }. Y
- shl eax, 4
7 r0 t* ^5 A. u5 K- v6 } - xor ebx, ebx+ Y3 e% s9 P% X; ^# J) Q
- mov bx, offset GDT_def
+ [0 `4 D5 f/ h8 v! m% }% I - add eax, ebx+ B7 }# }( L& @: k7 \4 u1 b
- mov dword ptr GDT_Addr[2], eax
0 V/ Z" r; D) r# j1 N* F/ P - lgdt fword ptr GDT_Addr
1 V* I3 R; _; j! B; ~# j+ G - /********************
/ M; J9 @1 W5 v7 d( ^% Y3 U/ M; O - * 选择子偏移 *& z& e( i- d# G. K
- ********************/$ ~$ u& Y& i; i8 ~5 ]
- mov bx, 8* Q+ l) ?$ i" l& v* P
- mov eax, cr0
: j3 A# O8 J6 ]% Y7 C1 w8 g( Y) D. ?: R - or al, 19 j9 _" q# x, T: Q
- /**********************
& J4 B9 F. }1 v# ]2 X2 p1 @ - * 进入保护模式 *
) \& q. i) F3 H! P( \6 |7 t - **********************/
* b5 k- B: P7 d$ p- Z) g" V - mov cr0, eax9 f+ e: s& m" p0 {! W
- jmp pMod6 ~( e, I7 ?8 ]4 A, s
- }. r' a: P3 f2 {8 }# M" w
7 I. {% R) e) p; l% b0 w' k/ [: M1 P! Q- pMod: asm{% N/ d9 F& D& O3 c' l7 I+ s) i
- /************************************************************, ~/ l3 e$ k6 D( Z
- * 让fs与gs加载选择子,使其能访问 0xFFFFF * 4K (4GB) 空间 *
) o+ T$ m! c+ j. r, }8 T- h - ************************************************************/
2 V3 O2 ]& ]. J1 g% t8 u& s% R& m8 p - mov fs, bx: j& n0 o- ~% ]1 c
- mov gs, bx) x* k8 t: c/ D) W2 V3 X
- and al, 0x0FE
* E* X- @/ v5 c& m - /******************0 M' `4 H- q- O! L
- * 进入实模式 *
$ @+ p8 w$ m% w0 J% V3 x8 [ - ******************/
7 b/ M- v" d0 q/ ]2 ]2 N3 h - mov cr0, eax& I' u& V) E3 l
- jmp rMod5 \4 I' H- C2 C! v$ I- C& w
- }& ?, J i; K$ y+ R6 K" p
7 ?8 N. q5 k0 i6 M- rMod: asm{" _& N" V% j9 D5 t( { g
- /* ******************************************************************
; Q8 d7 h) l4 Q" @/ W+ ^ - * 退出,fs、gs清0,访问系统内存可用: gs[32位,相对于0的偏移地址] *9 H; v& h; G- j7 ~5 g: D7 h
- ********************************************************************/
' v' f- C3 P. g - mov ax, 0* U4 ` o4 q& q' i0 x/ H$ G, j, S3 m
- mov fs, ax/ m$ n# n1 m; B: m
- mov gs, ax0 D4 s `3 O" R0 H7 n7 @, u
- sti3 j5 r, T! Q( p$ _) N" }
- }
$ N5 D E* d; c - }
复制代码 这是asm的- ;/********************************************************************% c/ o4 ~$ ?$ q( }+ a
- ;* File: DOS4G.asm *; o$ m; W$ n- f, h5 F
- ;* Compile with masm ( Editor: Tab size = 4 ) *
4 H) c' a7 T) @# t! P3 g R - ;* *
5 ?3 L( G) D' X& K9 R; E - ;* ========================Title=============================== *- w1 U' p* c. T/ Z* E8 J$ e; F$ q2 y
- ;* 这个demo是让系统进入DOS 4G模式,进行数据访问 *
7 e$ w% F* ]' l; I - ;* *2 \% p: |" l; Z
- ;* ===========================History========================== *
1 ^4 x7 N# `. j3 S: A/ k; k L - ;* author: bini *
) @' g2 D( L. A. @& Z* t5 P - ;* date: 2008-10-08 Frist version. *
G; p, ~( ~8 @0 k* ^ ^ - ;********************************************************************/
6 T- h9 x3 {, e7 S( H0 G - .model small
0 G8 u; `! {% n) ^& l$ s7 A, n; N# ] - .586p. g T5 T3 Q* d6 T/ v3 ?- W1 @- d5 C
-
0 e g1 y% v0 ?- K5 Q6 I8 h; D) D - DSEG SEGMENT USE16 ;16位数据段3 o, y+ S" M# }: E# S
- / ~9 D6 @9 n9 N) y
- DESC STRUC
+ r# f8 A7 U4 A3 T6 A% { - LimitL DW 0 ;段界限(BIT0-15)
8 E( ~7 A* \( B - BaseL DW 0 ;段基地址(BIT0-15)
! y4 v+ H9 A$ V$ I. z, X0 ~) d - BaseM DB 0 ;段基地址(BIT16-23)
' n+ j3 _& b" z5 o! r8 J$ |+ r, J - Attributes DB 0 ;段属性6 p1 L) N" r, n2 p6 R0 J
- LimitH DB 0 ;段界限(BIT16-19)(含段属性的高4位)
, H* e! M# \2 C7 k/ n! ~" Z1 F - BaseH DB 0 ;段基地址(BIT24-31): Z" {9 x$ s4 Y
- DESC ENDS7 `# x- m8 W9 c0 W
; y4 M+ `! v- W8 _! @) V- PDesc STRUC8 T4 `% f( G O5 g e
- Limit DW 0 ;16位界限9 _! b6 m. y% g
- Base DD 0 ;32位基地址
5 F& l. o0 i2 g/ f$ Q - PDesc ENDS7 O) X4 F) v8 r8 v8 a
6 U3 u0 e$ ?# J" z- GDT_def Label Fword
- b+ L1 J& \) D4 F* m6 P1 P - Null_Desc DESC < 0h, 0h, 00h, 00h, 000h, 0>% }7 z o; w$ y# t* g/ l5 n
- Data_Desc DESC < 0FFFFh, 0h, 00h, 92h, 08Fh, 0>
) L6 L$ H3 D% J; a& s
$ D+ g' f/ y7 v3 k; T- GDT_Addr PDesc <$-GDT_def-1, >/ X$ P4 L# m: X- }: E) E- ^" a
- DSEG ENDS ;数据段定义结束9 O; \2 J7 C# N, m w+ v6 C7 P
) p4 C; S4 T% T; Z4 ^- CSEG SEGMENT USE16 ;16位代码段
* Q1 O4 |7 ]& S - ASSUME CS:CSEG,DS:DSEG, |0 ^9 @( D3 I7 @! F( O8 P! H
- .Startup |, l+ X" d) v
- call Set4gb: A$ ]9 U5 g: b! V8 V
- ;
) {. }; r6 I5 e - ; fs, gs即能访问4GB空间
, W! U6 z9 u# e: o, F# t - ; write your code in here.
/ C* F) |' r7 h9 x# k - ;
3 r4 U7 v; Q1 z$ w) a6 c - .exit
9 N8 Y( {. T4 I7 Q! L: c! ~ - 2 G6 I! A: y0 U
- Set4gb PROC NEAR- M8 ?/ ?! X1 a+ R; z2 ^' o2 V
- in al, 92h* `& |, U& Q9 J" z! ~
- or al, 002
! m- \' Q& @# q8 ^* Q2 N4 c( J6 Z - out 092h, al
; a9 D1 m) I7 ]0 O, V& k5 W - out 0edh, al! y* f1 \# j4 g
# {- [+ o7 d, D; y. `- cli
$ q# v7 a1 h. u* j' _1 ^& v7 D - 7 D% c2 P: e8 @ v7 c- c- `+ t7 o
- ; mov word ptr GDT_Addr, (2*8-1);
# I& @ t# n9 Y# y0 K - ( j+ P* D3 k( o7 N8 }
- mov eax, ds
: F( u. {: `6 O0 ] - shl eax, 4
; f' z# F8 H3 q' G @ - xor ebx, ebx5 K; k5 E. d1 k. J: Q) d. r, \
- mov bx, offset GDT_def
0 b9 @5 A3 |$ K% E w5 U6 z - add eax, ebx
. \2 c9 c* M- \$ Z1 v$ n - mov dword ptr GDT_Addr.Base, eax
$ R5 l5 ?$ j+ |& W# s% e/ k - lgdt fword ptr GDT_Addr
4 V$ Y1 n/ o0 f4 [$ } G1 [ - ; h) }+ I9 i% d- I! f# b, D
- mov bx, 8- C( k) ]0 G3 J) v8 K$ X$ L
- mov eax, cr0% d* G: T( |" X* \! g
- or al, 1
% G6 A) S" L) Y# b% `& @) k - mov cr0, eax# S0 y4 ?8 m4 y) r$ d
- 4 z( ~2 W/ ]0 u
- jmp pMod
. Q3 W: c6 _1 @( y% y1 b& |8 r6 N. ` - pMod:
6 x; \5 v0 S T* p0 Z6 p1 M1 [ - % c) d2 J2 r( G- J
- mov fs, bx
b: x. p" w. J" D4 o. I) P - mov gs, bx3 N8 s% f+ ~# [4 ?
- and al, 0FEh$ Z ]- L9 u4 ?' m
- mov cr0, eax
0 V/ T2 S+ @7 E9 A/ @' x, k: E9 F - . n; f# S0 ?9 J+ c) Q% O: M7 z
- jmp rMod9 K4 c; h. g) h4 A
- rMod:
% B/ y5 a! L, n4 T; f: j - " y$ ?, b, K4 `/ m
- mov ax, 0
8 W9 A2 }# y5 I' y - mov fs, ax/ P( A# \& z+ D* Z4 S. b$ U# Q. j8 z6 [7 T
- mov gs, ax
/ [; \; a# Y4 e! k1 k2 ~7 ?& E - 1 { H2 i% N5 B' Y
- ; 在2M的位置测试写一下数据; I' o' m6 N9 x) h/ x
- mov esi, 200000h
( l+ H$ ~3 C* `7 W- ` - mov dword ptr fs:[esi], 055aa55aah
}" X9 y2 z+ \+ \% Z - ; 用RU去看看200000h的位置是否是此数据....$ l# U# b/ v9 N, _, S
% n4 ^- t3 @* |1 i- ?% S- sti
$ B4 p1 P, c7 t. x% M - ret
5 i' e1 P! `: p+ j5 ~, o- \ - Set4gb ENDP8 j" w. q2 Z$ b7 B
-
$ \3 Y7 o5 A! S2 f3 F+ U8 Z - CSEG ENDS ;代码段定义结束
2 C$ g# A( @) I3 i/ T: C) p% S' w - end
复制代码 |
|