|
|
刚学习的同学,有些还不会,我这里贴点C和asm的代码。只供参考。% P+ f$ c% a5 y
( X# s' T; z2 w+ Q. q! B; Z: p% k+ `5 @这是C的- /********************************************************************
- {( w* p/ u* K0 v* D! a% Y - * File: DOS4G.H *
1 A8 Y4 U) V$ U: R, p/ q - * Compile with BC 3.1 ( Editor: Tab size = 4 ) *( r$ U/ h4 n+ ~* b. A6 m
- * *3 P1 T+ F( g/ T3 D! V
- * ========================Title=============================== *
. R% g: x7 k$ q: Y+ H - * 这个函数是让系统进入DOS 4G模式 *# R3 `# s6 r( ?. l
- * 程序参考了:陈家琪《DOS实方式下直接访问4GB》 *
4 i1 {& O b6 Q* X% b - * *) d' V2 s; a+ T6 v4 M3 t* X
- * 使用: openA20(); set4gb(); *7 I! n1 [, X( D* h8 `: M9 X& {; ]4 {
- * *
- G2 m7 `9 o' x% p( j3 z - * ===========================History========================== *
+ Y, }8 `& R; |, u5 N - * author: bini *
1 v+ r( L: u8 t7 @3 {; B - * date: 2004-11-30 Frist version. *
+ m; h! Q b& ~- e% {, n0 ] - ********************************************************************/' @0 K2 b. I; j$ A0 E
- 6 I u/ ~& A, m( h" [
- #include <conio.h>
" d& v3 r2 R! e/ s - #pragma inline
/ N P# m% [- q* M
# S9 R( A; Z; m$ o) q8 U- /***********************************************
( z! O4 k7 } k, e/ t - * 两个GDT,第一个为系统使用,不管,默认为0 *% z$ y1 L* w( f
- * 第二个为一个数据段,没有代码段。 *
/ b& O6 W9 a6 S, C0 l) M - ***********************************************/" S/ q$ Y, R3 X( C% Z
- unsigned long GDT_def[ ]={0,0, /*系统使用*/ x# P5 B& u" w0 t
- 0x0000FFFF, /* hi16bit( 0~15 ) is base low=0,
! m5 b9 m) j- }+ i) K" K# F* n$ t - low16bit( 0~15 ) is limit low=0xFFFF , w6 F* |5 p) I5 ^6 l
- */, J7 G( K# G& f2 U2 T- m
- 0x008F9200};/* 最低字节为 base( bit 16~23 )
, w& k* K# r) {. H7 N - 最高字节为 base( bit 24~31 ) ?: T' B. B G
-
- @9 m1 i1 @% K6 A5 D' ?# [2 t - 属性Attrib = 0x8F92
5 f* d# ?6 k X+ g7 t -
9 v* T. j/ e/ F- _/ k - 属性位Hibyte低四位为
* T7 Z8 _7 N' R+ P# i! h - Limit( 16~19 )=F# C; Q" b# ^; L0 ^1 |! F" `
- 属性位Hibyte bit7 为粒度7 I) d1 S$ }6 ^( J7 H" A; e* J
- (值1=4KB粒度)
# F' Q' M2 T. b8 I+ z - 8F & 0x80 = 1& G. S" T& O" a5 f" `
-
3 J6 N% W9 x* t, z: A - 属性位Lowbyte低四位为段类型,值=2
/ U4 ]" | J9 X: F. } - 表示为可读/写段
! u$ _' r; f" ?9 _7 M - 属性位Hibyte高四位=9,bit3=1表示:6 k m) F7 N7 U
- 描述符对地址转换是有效的。3 Y6 z; G7 ]$ q# M3 x8 w
- bit0=1表示为:* K) l% Z+ [6 K; U+ y8 E
- 系统段描述符。而不是门描述符。
$ p7 T1 M/ j/ i4 w: n W/ c - 2 H# i- z3 Y! i# r' h
- */
: W ~3 ]6 N9 l6 }+ e5 Q - ' ]& ?8 N% v9 P8 C+ y" R5 f
- /****************************************
0 U* w, [! r1 P* e - * GDTR寄存器, 48bit=6bytes *
8 I: u& ?( L2 L! I7 c - * +-------------------------------+ *
1 z0 x x! m0 I1 ` B - * | 32bit基地址 |16bit界限| *
2 U/ v( M/ J, q3 `( ] - * +-------------------------------+ *4 ?7 ^# [2 w. u* r( o! @8 C
- ****************************************/
4 K( T" E' Z/ Y, f; v. m; K) K - unsigned char GDT_Addr[6]={0};9 Y! Z: e8 u1 A b) i. R
" j! D1 a6 b( `- /****************( d! s0 M0 x" @9 E# e
- * 打开A20门 *
C4 |1 q2 g% I. q' Z$ X" n( y - ****************/
" ^3 k, b# ~* z+ C4 K& s' O- M - void openA20(void)% I. E) o% b- |8 @- ^5 {1 M
- {8 H L4 E8 v% J# s3 r
- asm{
" w' z& L! {/ S) u) F# d( {$ v - pusha
3 R* r" v- F/ y& i# H - in al, 92H: O$ W( j8 f# [. l5 B* O- q! t
- or al, 0x02, p0 k% l. A4 G- G0 M: v, U* I
- out 0x92, al1 F, f, o7 ]: X7 ~& h8 }' z
- out 0xed, al8 L- g+ Z/ z0 b
- popa
8 y4 f( O* Z H9 n1 l2 y: I4 {7 A - }
1 B/ q; y, ~; I/ r- E - }
' W: _1 ?/ p5 O+ M. f6 L5 c/ ^ - ( V! c; M* Q R: n: ~; x
- /***********************************************! O9 T, O- ~$ I
- * 函数功能:进入DOS4G *
" j' s+ o* R5 [$ D5 n; q* C! [ - * ==================== *3 @# B! d; s, Y/ t
- * * m Q9 P( M' I
- * GDT描述符界限计算方式:描述符个数*8-1 *; e* K, Q. Z; j& t
- * 如: *. f0 l7 q- \- q! F
- * mov word ptr GDT_Addr[0], (2*8-1); *" b. L, m9 c! f% q6 q2 h
- * 表示为 2个GTD *& _) O7 u1 ]- R4 o; a* I0 Y" t
- * *
( z J, ~ V9 g6 ]# c - * 选择子为所在描述符内的字节偏移。 *
x1 `" e& V9 ] s - * *
' Y T& g Y6 ^4 ]0 G - ***********************************************/" Q# B$ G: p0 m# q# |4 v- D
- void set4gb(void)
0 e* \( h. C1 _9 n" P - {
. H; P4 C% j0 A, h9 z - asm{
3 K! _+ W- ?& _# |# Y - cli
0 s' l7 E7 l# A - /****************************************2 ]0 J+ w" n' c2 L* V4 d1 r
- * GDTR寄存器 *4 D* E( t; @& l$ J/ _
- * +-------------------------------+ *
2 K5 J" j. M, W" v) V8 G3 J, J5 E - * | 32bit基地址 |16bit界限| *
9 H; h6 h3 O9 j, D/ G% L - * +-------------------------------+ *" K: H* }4 f' Z! k! E4 u
- *****************************************/+ o/ W3 ]' g0 E" \8 } \+ I; h. t
- /*********************
0 e# X& F( ^6 A; \8 x* R7 ? - * 得出段界限 *
8 x$ V6 P% `) @7 R* A - *********************/: I0 F9 t6 n- }; ^- \
- mov word ptr GDT_Addr[0], (2*8-1);5 d& c6 }/ M4 @+ @; |- G
- /********************************************* z! a$ G3 q$ H4 c* D0 s, y3 i
- * 计算GDT表的32位基地址,存入GDTR *2 A$ m! {0 y( c& ^. t1 I. f c
- ********************************************/
4 B. { i; I1 |7 i) M1 k - mov eax, ds
|, V8 j* k' k( o" I& A. K3 l - shl eax, 4, ?8 U6 J6 L* \$ Y s! ^
- xor ebx, ebx
+ c. \9 X0 _, l! |: ~ - mov bx, offset GDT_def
* P5 d4 ^ H! T) k. W - add eax, ebx6 A5 w/ x: _2 @: d$ _: B+ b$ h0 v
- mov dword ptr GDT_Addr[2], eax
% L% g- v+ [/ B" h# e - lgdt fword ptr GDT_Addr, P9 ]% M. S( H
- /********************2 w4 v( H4 k' m/ M Q( a
- * 选择子偏移 *
) G& R2 E7 u1 P - ********************/
. M o" d9 ^" V6 i - mov bx, 8/ `( c# T+ \* Q
- mov eax, cr0 c9 u5 z+ w7 C& m
- or al, 16 u3 \) o4 l3 P( _9 k
- /**********************
( N! P% y9 o! b2 F" \: F, j - * 进入保护模式 *3 t/ w' L& ]' M, J0 a# c3 l3 i1 P: z, A$ Q
- **********************/
/ i" R( K, z+ e& Y$ E: O. M3 n - mov cr0, eax7 S2 D6 [: E( O6 @! U4 S
- jmp pMod
/ z5 |5 M$ {* _0 G* k8 I - }
# h* M8 _9 `& }8 f' u5 Y
# a6 A& J0 i4 }2 J9 P- pMod: asm{" A) L( z! n0 b8 G6 M& ?
- /************************************************************
+ M' r2 x; c3 A8 W' m9 M - * 让fs与gs加载选择子,使其能访问 0xFFFFF * 4K (4GB) 空间 *- Y9 d3 U5 ~) N% a- H$ R- Y
- ************************************************************/, l7 r% u/ k) s/ \1 k% a
- mov fs, bx; r2 L& w2 j. g- m9 W5 p! P* E
- mov gs, bx
# ~5 X9 e4 D! N, L/ S - and al, 0x0FE" [4 x- e# I' N3 } s$ M
- /******************
/ Q3 p) P* i% v |( O2 W - * 进入实模式 *
( X' |) k' I9 `2 u - ******************/
! A `* o- C$ p2 o" {3 n; E- e$ e4 u - mov cr0, eax/ i* W' F6 W5 @+ n$ T
- jmp rMod
( k6 a. T5 H% O8 Q o; D - }
& s: X$ c" O% w* g - * w$ M! v, t9 ?" o! H) p
- rMod: asm{
7 k. [1 g: x: _1 C+ L# `, k - /* ******************************************************************7 S# v6 h: k: \! E- j6 n
- * 退出,fs、gs清0,访问系统内存可用: gs[32位,相对于0的偏移地址] *
4 a5 z0 r/ P. l, n* n3 k8 l$ J" O9 n - ********************************************************************/
) h4 U) Q8 A# d; t1 N: d, Q& { y - mov ax, 0! R& |/ O' J" u8 h* ^* r
- mov fs, ax; z1 `- b/ y" {- n
- mov gs, ax
2 D- y. B4 K1 x6 A - sti- v( D4 N+ R$ T7 p2 C+ t3 J
- }
+ F; E! H' A+ A2 ?+ [3 X8 O - }
复制代码 这是asm的- ;/********************************************************************7 c2 J4 x* r1 I
- ;* File: DOS4G.asm *) B2 r, F5 L% Y8 q/ y6 N- u
- ;* Compile with masm ( Editor: Tab size = 4 ) *+ a2 X) n. [% T: l U! S
- ;* *
# I/ D6 `: y6 C0 E! J+ g - ;* ========================Title=============================== *4 F0 G$ }: f2 T# e' Y, ?; n+ q
- ;* 这个demo是让系统进入DOS 4G模式,进行数据访问 *
; S: y0 a/ E9 a7 V3 e+ E) q8 q" U5 q - ;* *
8 H, C1 G" w( Q" v& s! a - ;* ===========================History========================== *8 Y1 }) r$ \. Q. H. B7 g& \
- ;* author: bini *
7 _, }7 b' T( z+ g& I' l) Z8 ` - ;* date: 2008-10-08 Frist version. *' G: V! [: z, N& U, ?9 |8 x
- ;********************************************************************/
8 N& E+ M( Q' L+ U* F - .model small7 W( v8 i# a& k
- .586p
" W+ Z6 j+ o. c" _! T0 W -
8 ^6 W- q+ _- R& s0 @ - DSEG SEGMENT USE16 ;16位数据段8 W+ H8 b6 s- R$ U& o4 P8 d
* ?$ } M9 P# t# k- DESC STRUC
. r" d2 r" ?" y5 a% O - LimitL DW 0 ;段界限(BIT0-15)+ ]5 y, ^3 G& ^" H
- BaseL DW 0 ;段基地址(BIT0-15)
. c3 J$ W5 z5 Y( h, D; e - BaseM DB 0 ;段基地址(BIT16-23)
# {+ Z3 y) i+ h% v7 z: J - Attributes DB 0 ;段属性6 }" B" Z4 k+ W; N. w
- LimitH DB 0 ;段界限(BIT16-19)(含段属性的高4位)3 Z3 N" W( U, F! a; r/ y& o9 x
- BaseH DB 0 ;段基地址(BIT24-31)
6 h- T( D- n8 W& p - DESC ENDS! F8 h! Y' [7 B' Y
- 7 B# S3 g- M+ ~! X) [
- PDesc STRUC( S ]( N8 @. N# G" O$ U% `
- Limit DW 0 ;16位界限
3 L+ l, ` e* i& t7 z" Y# b - Base DD 0 ;32位基地址
$ X. L" O) f' l" L& A) [: b - PDesc ENDS
8 R- [# R7 n8 c2 ?$ |0 F - $ g& F% b: O t! O
- GDT_def Label Fword, k* P w. y( N/ x0 W6 _8 a/ k" J
- Null_Desc DESC < 0h, 0h, 00h, 00h, 000h, 0>
7 B/ t B6 m2 `7 E3 x9 r2 s - Data_Desc DESC < 0FFFFh, 0h, 00h, 92h, 08Fh, 0>2 J0 n- [$ ~. ]* G C# `
K) G c7 B! x, x- GDT_Addr PDesc <$-GDT_def-1, >
5 u0 V; r5 n) U! }9 J9 J - DSEG ENDS ;数据段定义结束! B; i. B: b8 N- ~) A
i$ u+ E2 T3 \- CSEG SEGMENT USE16 ;16位代码段
~4 k% y, I( _7 @1 c6 U2 { - ASSUME CS:CSEG,DS:DSEG
( I, ~$ w1 q x' J - .Startup
8 }1 |* [7 i# F: E2 A# b. g& Q7 r - call Set4gb& T2 R9 i3 P6 T0 B2 P4 |) `
- ;8 F# |1 u6 r# m
- ; fs, gs即能访问4GB空间
) H! R' V& A6 k4 T6 D - ; write your code in here.+ K2 ~/ p R5 X5 r R3 n
- ;0 n% ?/ y( F2 w2 z, L5 L
- .exit! ?& K* D! k8 L8 o, { o
- ' d% Q* S7 ]3 H; A, x$ i& x
- Set4gb PROC NEAR
" r4 n. `* K7 {" _- ^ - in al, 92h/ r7 Q) l( [: z# S, ~$ X/ B/ A5 a. @
- or al, 002
% k) T4 u1 e2 `* k2 A6 ] - out 092h, al
6 A6 W& o6 y! ?- N9 m+ y' c% h - out 0edh, al; v/ N! k0 b7 L; s: P
- . A4 T ~* A/ |% ]( \3 P2 ]
- cli
( l! p) F2 A$ _ - 3 k# r' M7 i1 \! L% d
- ; mov word ptr GDT_Addr, (2*8-1);) K3 F% F1 v" f
- ) r7 _! G. s- z1 v/ a& ?
- mov eax, ds5 J" U3 ?" H( e* s
- shl eax, 4
% |1 H1 k% w) Q+ @; l+ W+ M$ d; O5 F( D - xor ebx, ebx
2 t# q' G9 K: T0 v - mov bx, offset GDT_def
% f6 g2 m8 A# e+ G% n$ j - add eax, ebx/ ~. i/ C+ |6 J+ g5 }$ B) j6 o
- mov dword ptr GDT_Addr.Base, eax
s- k0 m2 H1 d% W/ _ - lgdt fword ptr GDT_Addr$ A# p4 k' q" K: ~, j) k; [; u. K
- + f3 p1 L, \3 `( R6 @- O- {
- mov bx, 8
4 o+ u0 m, O" f8 h. L" H - mov eax, cr0; m- C6 G7 D6 u& [) Q
- or al, 1; r9 @. W0 k* r2 x$ o
- mov cr0, eax
: B# @/ x6 N3 E/ W$ [4 `3 h% g
6 q/ Q/ p. ?. @9 |+ m& E# U- o2 e- jmp pMod
/ O9 q8 d9 P' w - pMod:2 ~7 G' N- n8 l& |
- % k0 Q; Q- P P+ Y$ D
- mov fs, bx' M" s9 ~* s: d/ p+ F
- mov gs, bx" c% b6 m3 x" a9 B- {1 ~/ _. L
- and al, 0FEh* z! S1 i; G5 t, L
- mov cr0, eax1 u3 j* Y6 G* n8 |; S
- - r4 T& Z( o! j
- jmp rMod
* x. x) g% L) Z( o; _ - rMod:
1 G- k. f+ E* k4 y7 i
# U4 W1 H) H* e- mov ax, 0
, I3 A ~8 d( a) J% _ E0 i/ f - mov fs, ax
2 ~3 A2 R6 h# X9 a2 G2 p - mov gs, ax
7 `& e7 j' q3 Z( p& } -
0 u3 [7 I a' _) }* x# W4 d - ; 在2M的位置测试写一下数据
, C; `5 K2 {( `# x: p. Q - mov esi, 200000h
9 e7 f6 s N, c! I" S3 o/ S - mov dword ptr fs:[esi], 055aa55aah! E, Y# G( \3 t5 Q5 ?, t ]
- ; 用RU去看看200000h的位置是否是此数据....
- y) o$ V# [5 J. b8 g( `3 m
# g7 N: Y# a( I- sti
* v. v+ h+ v! v) W - ret# C z: G' k6 D/ \4 B
- Set4gb ENDP
. V4 ?! i; b5 C) A* J6 O" } -
j- _, k Z7 h2 A( Y D7 c - CSEG ENDS ;代码段定义结束
7 p7 ]( [/ M# d8 w* k6 b" `4 h - end
复制代码 |
|