|
|
刚学习的同学,有些还不会,我这里贴点C和asm的代码。只供参考。
5 f+ d% Q* @% v, j. U7 l1 E# [4 S' W. O, j
这是C的- /********************************************************************; ?/ v, }! t& e) G6 b8 r( _
- * File: DOS4G.H *) W8 u% y9 `* c) l3 c: Q+ d
- * Compile with BC 3.1 ( Editor: Tab size = 4 ) *
5 p& X) Z' m+ g8 G+ t: k6 e# f - * *
8 T' x+ ]+ n) t - * ========================Title=============================== * _) U7 N% j' h5 g: l$ w
- * 这个函数是让系统进入DOS 4G模式 *% T$ b3 x$ A% q% l* z
- * 程序参考了:陈家琪《DOS实方式下直接访问4GB》 *+ {9 a% c# ]6 s: B9 J7 f9 U
- * *
+ }* { I) {2 \: t1 ? - * 使用: openA20(); set4gb(); *
- I4 y& ~4 o% W0 R - * *
6 B# Z$ s9 X, ]6 g$ ~8 B' l - * ===========================History========================== *
, n2 o3 R% y5 u0 a - * author: bini *
. H0 g3 q8 l' P5 U# [5 l - * date: 2004-11-30 Frist version. *
5 w8 C1 h& u. ?: l J. H7 z. e - ********************************************************************/
4 o! T9 K! |: K L" i4 p - ( f: n* ?/ s1 i3 [- H* J3 H
- #include <conio.h>! K$ ^+ u; F6 ]/ I2 F! K M) Y
- #pragma inline0 G F7 t, i8 H3 c* ^
- 6 n0 {7 ?4 K5 [, K$ v
- /***********************************************
8 }0 U! c2 V% K2 Z - * 两个GDT,第一个为系统使用,不管,默认为0 *
3 J! ^) V2 f7 ?& x8 \8 \- P - * 第二个为一个数据段,没有代码段。 *
: O ^& z3 i& {7 r6 u @ - ***********************************************/
3 H$ j( \+ Z8 ?8 P - unsigned long GDT_def[ ]={0,0, /*系统使用*/; _" x3 M; V) w* v
- 0x0000FFFF, /* hi16bit( 0~15 ) is base low=0, 8 `, i+ Z( C) ^- s( {1 T& d: q
- low16bit( 0~15 ) is limit low=0xFFFF
% S/ R/ ]( f& B - */
+ x1 h% e9 V6 _' m3 J5 X - 0x008F9200};/* 最低字节为 base( bit 16~23 )
1 L* ]+ H g7 k; d8 \ X - 最高字节为 base( bit 24~31 )
& s1 i( X; w$ \% |' Q - * y4 f+ n+ h9 ^: V
- 属性Attrib = 0x8F92
$ g! y: ?' Y- I -
$ R/ N4 o' N8 X' D5 R% y - 属性位Hibyte低四位为
2 z. o6 v! u3 W2 J( N - Limit( 16~19 )=F
6 u' {+ [2 D7 L* @ - 属性位Hibyte bit7 为粒度
+ m) a/ C$ n8 w( n - (值1=4KB粒度)+ s; o) y0 Y9 }7 E
- 8F & 0x80 = 10 \; L' Y- M. |4 K2 M( U3 r' r
-
2 ]4 [" o# P$ K% V9 D - 属性位Lowbyte低四位为段类型,值=2
' U2 k1 P/ s; O5 x - 表示为可读/写段
$ ?+ S- R3 J" Q+ w, @3 Q/ P& m+ A - 属性位Hibyte高四位=9,bit3=1表示:
& @5 D+ k/ r% T: J" N3 J y - 描述符对地址转换是有效的。3 f1 y! V! E4 T) U' ^6 ~% U& L
- bit0=1表示为:
# v4 P! A4 U2 v - 系统段描述符。而不是门描述符。' A3 U- z9 m' Q7 z( _- Q0 l
-
+ E4 s# F" y' l6 g: H - */
4 j3 C r& Y P" z6 }7 _ - }1 n% o* L2 ~- l; I
- /****************************************
6 j4 D0 w& Z, B# a - * GDTR寄存器, 48bit=6bytes *
% ]8 `0 f5 H+ x# Y" N5 w - * +-------------------------------+ *
+ b7 V& L- C& v! t% K - * | 32bit基地址 |16bit界限| ** k& J& c! W# p) Q
- * +-------------------------------+ *' D2 I% w4 ~% T7 z, q3 W
- ****************************************/' t {8 l1 o1 j" `
- unsigned char GDT_Addr[6]={0};
* Q7 l; o+ ~- i- e6 W
+ t; T0 V0 x- m- q/ O- /****************; m, G& K( l3 k E
- * 打开A20门 *) d8 l2 s$ n4 u1 L
- ****************/
8 W* g3 K5 B* i2 C8 t. T/ W - void openA20(void)
! `1 J7 C ^1 c% Y, x( i& n - {
/ k; w3 a) _: x! T - asm{% }- a. ~/ C( Y" n/ M4 y! I; x
- pusha
2 r+ K3 g& \, y. W' T7 i: p5 a2 E - in al, 92H, s: x, _" ?) A% u5 q9 F! \3 p
- or al, 0x02
- w2 P, s+ X- g - out 0x92, al
, N! `! G7 j4 w1 o, N, i' ~ - out 0xed, al
" o) V9 C9 ]6 P - popa' {4 d5 {. g8 f& n6 Z9 g8 v; ^
- }* M0 c9 e- V r0 s2 j0 p
- }
. z/ [1 Z# u' b+ G3 x
! V7 l0 Z Q% a6 S; P- /***********************************************9 @- d( i+ @0 f1 c9 Y4 U
- * 函数功能:进入DOS4G *
, b4 U3 G* J: G. `( a& c- \ - * ==================== *" p2 x1 H+ S1 l: m5 r
- * *
" g. Q( w( w' F. Y* \ - * GDT描述符界限计算方式:描述符个数*8-1 *( Y6 c4 h, a" @7 a4 k6 Y3 X
- * 如: *
! c. A; ?2 n5 W" E) ^- D2 S1 R; ] - * mov word ptr GDT_Addr[0], (2*8-1); *7 v6 |) o# `! i1 C& ]
- * 表示为 2个GTD *
5 [* Q$ o) H" K8 i9 ]- q$ l - * *5 E- J5 V7 K/ q- ]
- * 选择子为所在描述符内的字节偏移。 *
& g* @2 i: M3 |" K+ a' f( D - * */ V/ L/ m! Q" }6 \& X7 y/ Y9 J
- ***********************************************/
( p/ U& y, Q6 k" k - void set4gb(void)1 E, g$ a! a' h- F
- {9 O' Q' J6 L) D W. y
- asm{9 T8 a% S! P0 ?
- cli
/ i1 b! Q$ e( [ x - /****************************************
( g: W3 G: w% J+ O9 T% p+ i" K1 T - * GDTR寄存器 *6 s( U6 w& d. e; d
- * +-------------------------------+ */ ^1 h) Q+ P' ~$ B$ ^: z* X
- * | 32bit基地址 |16bit界限| *0 j+ |0 h Q |) G( V$ E8 H
- * +-------------------------------+ *
0 L0 e4 P/ l B. C, D6 b* X( D - *****************************************/5 ?$ q% ~# j# `' ~4 g
- /*********************
2 N/ Z0 \. z0 i$ U - * 得出段界限 *- x) E* z. |1 l: Z9 u" j3 k6 @
- *********************/
; E( S( I$ ~( P, o& a/ \. _ - mov word ptr GDT_Addr[0], (2*8-1);/ T3 e w- V: d# P, c
- /********************************************' ~" D& w! ^& ? r1 `6 e
- * 计算GDT表的32位基地址,存入GDTR *
$ R. p2 t4 j ^, c - ********************************************/
* ^4 {/ T+ c4 o9 y - mov eax, ds
% K9 y' Z2 _, z. v& C2 E - shl eax, 4+ a1 Y- b" i6 Q/ c
- xor ebx, ebx
& t2 | U; u+ b* l- l - mov bx, offset GDT_def* j1 R7 ~2 Z' o/ ]" \3 A/ W8 P) [
- add eax, ebx
) a; Y3 C y/ c+ T- I2 H" H - mov dword ptr GDT_Addr[2], eax. \" U: p% ~2 U2 K6 f/ {
- lgdt fword ptr GDT_Addr( b, G3 s6 r; u" X1 J' Z- E7 t
- /********************# }" }3 z# K% y4 d0 h. E. z* ^
- * 选择子偏移 *2 m, b4 `% d3 m; W/ X8 ~
- ********************/* D* M3 s" e: |
- mov bx, 80 x- i1 {$ O' c# t
- mov eax, cr0
. }' h# U' z, m, N+ K* R3 n - or al, 1
+ N7 }& ~4 |3 P: h - /**********************2 T8 j2 [8 U3 H2 X( e, u4 w
- * 进入保护模式 *
$ K9 i! J+ w; q- E! E7 n- J - **********************/
4 L& k! \6 K+ g" k" P - mov cr0, eax* G* L) p& a& [) B3 N2 I
- jmp pMod
- w8 I. B$ P$ ~2 X) ^; Q. \& T - }
4 ` N$ I6 K- X @3 I( U, L
" M# _7 k2 h% g8 k4 ~5 Q- pMod: asm{% Y) K7 V3 Z `. U
- /************************************************************8 h, w, x2 i Q* q0 c+ I
- * 让fs与gs加载选择子,使其能访问 0xFFFFF * 4K (4GB) 空间 *
; K. o3 V7 _2 ]+ w( W. s - ************************************************************/
! U3 Z( }' X3 R/ t, ]% p9 ^ - mov fs, bx
( r! N7 M! Q# ? - mov gs, bx! d j, k* U3 @% _4 r+ C( s
- and al, 0x0FE
) n3 Q8 ]1 E( b# {# t$ Z - /******************# S' m0 V8 t0 |9 L" P6 K7 J( t
- * 进入实模式 *# P( Q' k/ l0 \: H
- ******************/
/ }2 _' w; {* c+ ~: h* w- p - mov cr0, eax
7 q$ \- q: h( r4 f& c+ y! m - jmp rMod
: I! y) }" l2 }+ t$ G4 S! U - }
( D, C& n' G, r3 S
6 A d# ^7 J T- rMod: asm{7 t3 ?; I) N$ |" s1 N: l! q
- /* ******************************************************************' G2 Z$ Q. O( N' ^
- * 退出,fs、gs清0,访问系统内存可用: gs[32位,相对于0的偏移地址] *
) k) O2 m6 p; m - ********************************************************************/! Z! V! O5 V7 c0 M
- mov ax, 0; N4 ^! j: E/ t7 u; u, h
- mov fs, ax" f7 s. {# C/ R1 N, m- E* S3 C
- mov gs, ax' v+ o4 W' x$ s- K* v
- sti4 X2 \; t, M4 ~8 J
- }6 B' \2 S' A( v
- }
复制代码 这是asm的- ;/********************************************************************
( m8 ^8 y3 Y. [3 `0 U6 c - ;* File: DOS4G.asm *. D) W. _) d, c6 _% `: p
- ;* Compile with masm ( Editor: Tab size = 4 ) *
) w6 I% H) b, E - ;* *
2 O) o. x# w7 P0 R7 f - ;* ========================Title=============================== *
y m) @3 _" z - ;* 这个demo是让系统进入DOS 4G模式,进行数据访问 *% S) G5 E! O2 F5 S& p
- ;* *
& j" Q' p5 ^, q- s/ X - ;* ===========================History========================== *7 f; z0 c" U- e8 t, {" x" i
- ;* author: bini *8 i* ?0 J- _ J0 `$ z: m
- ;* date: 2008-10-08 Frist version. *1 F0 Z/ ]' Z4 x8 E& R6 w$ Z
- ;********************************************************************/
$ P* h A( `1 Z/ q6 e. c9 ~9 I2 { - .model small/ [/ [3 X. n6 ?" P; ]- ~
- .586p
b6 f: W& Y1 E7 i -
, o/ a) o& G& M5 L0 }" v& P( O4 v - DSEG SEGMENT USE16 ;16位数据段
; W0 \4 L4 a0 }7 }5 s
: C: c, V# s5 R* Y7 Y1 D- DESC STRUC
* {" Y3 w" P8 s6 z& ], C - LimitL DW 0 ;段界限(BIT0-15)
! B8 Z& W. s. s9 L- G - BaseL DW 0 ;段基地址(BIT0-15)/ C7 Y4 Q2 E3 s- d. [, d
- BaseM DB 0 ;段基地址(BIT16-23)7 z) F' d: z; r! s4 o( J! ~% o
- Attributes DB 0 ;段属性
6 }. y9 ~2 F) [, i) h( u% [ - LimitH DB 0 ;段界限(BIT16-19)(含段属性的高4位)! N- \# n7 _" p
- BaseH DB 0 ;段基地址(BIT24-31)
% ?% L+ h8 y( f4 |1 |+ V. w2 m+ K# v- ^ - DESC ENDS
$ I* u5 C4 |# N$ e: D% w
# g' d3 F! p2 `- ]- PDesc STRUC
# T3 d" `# }; Z - Limit DW 0 ;16位界限
. o4 I& B" L X/ P/ R4 Q' Z9 M% q - Base DD 0 ;32位基地址( p' ^+ L# g$ _2 L R6 K7 e
- PDesc ENDS
}4 f2 U0 d0 y! c( l' u& v9 V
0 ]0 ]+ p8 ^% P; k& h5 ^- GDT_def Label Fword* T: V% i; m; ]$ W! ~
- Null_Desc DESC < 0h, 0h, 00h, 00h, 000h, 0>
/ A$ x3 k, }% R! W1 q9 m - Data_Desc DESC < 0FFFFh, 0h, 00h, 92h, 08Fh, 0>$ _( U, y \8 a! s
! E0 a) W, H3 {, N O) a- GDT_Addr PDesc <$-GDT_def-1, >
* |9 M( x+ @0 Q% g7 ]5 m3 O3 m5 K" T2 L - DSEG ENDS ;数据段定义结束
5 L* s( E v# n& Y5 u - / I) ^! E) F3 G# t. x1 S
- CSEG SEGMENT USE16 ;16位代码段
2 d* C' Y1 |9 W6 v9 ] - ASSUME CS:CSEG,DS:DSEG- M3 a% Y5 B5 D/ H# f
- .Startup
+ H+ D2 E4 ?& v. b# t" e - call Set4gb
# R2 N! G% f# k& r2 p - ;8 d( B7 S% `, R4 i4 z8 I
- ; fs, gs即能访问4GB空间; r0 x- ]2 c5 k) h, M+ r
- ; write your code in here.5 h3 g3 A. Q, Z7 a- [& P
- ;+ d' S# j# T& X2 k0 q$ W
- .exit
" p( K$ F- l4 L# H2 k ^ - ' T6 }1 P' \/ \8 g7 ]- q5 u% U
- Set4gb PROC NEAR* j! @- u; E" r0 i
- in al, 92h8 G5 j+ `& |! i
- or al, 002
4 n7 _! O- x. [+ e) l - out 092h, al# V2 |. }6 V% r! |
- out 0edh, al2 `* b6 [, x' R- X/ V+ ]& T# D
/ l% o5 R: K+ P% s' s+ Q/ ?4 [- cli* C0 v5 h4 Y% Z& i u6 L' p6 K
( r0 c# T5 S9 z) D8 u- ; mov word ptr GDT_Addr, (2*8-1);( b. j. j1 l0 q
2 K8 C. h- c L1 v( _1 }7 k. w- mov eax, ds7 a7 s: E" ?% c* H- ?) A, U% K% u
- shl eax, 4 B, L4 D$ c: D, Q) K2 |3 |
- xor ebx, ebx
e A/ \0 h1 u1 f5 Z5 [: J - mov bx, offset GDT_def$ P% X! P# E4 W c* d
- add eax, ebx
$ z. k' g' o& K! r2 z9 ] - mov dword ptr GDT_Addr.Base, eax
7 u: \" P8 n& m* X# N - lgdt fword ptr GDT_Addr
# L) [6 E9 C; T7 e/ K7 |- I. s- o+ p( {
+ @8 m: d6 A# a- mov bx, 8
4 S8 @, I! M: n. `' |$ Q - mov eax, cr0# ~; x6 t2 o3 |/ j( t9 Y* P! v
- or al, 1
+ S8 [2 e5 U1 g7 O+ |5 | - mov cr0, eax
# |! d4 R- Z+ k6 }8 }; [ - 2 _& f g, D% k1 u+ `+ H; o
- jmp pMod
7 m- X: s5 m4 k1 e7 w - pMod:6 Q9 C7 i, f) Q( C3 w+ x+ ~& t
- ( M1 c- s" I8 O: J4 f
- mov fs, bx: `8 K: L, `3 P
- mov gs, bx
J7 \" ~/ p9 E: B1 c, ]+ H0 u, V - and al, 0FEh
* e& \) P- O4 d9 J - mov cr0, eax) P/ Z7 F$ p5 n- S
-
) X" t& `0 k0 K% E - jmp rMod
1 ^' `- V8 I) a% M2 o+ Q - rMod:/ n$ g, d1 m1 @9 w; u( H) }/ U- ^
, J: [3 _ [) i* p- mov ax, 0
7 i, Q* H& C- j3 G/ x. y$ `8 G - mov fs, ax
X7 @5 N) C% E3 x1 L" T8 L7 W- X0 c - mov gs, ax/ {/ I3 q! l, m3 m" T) Y* q
- $ a# E& T I, ~! L) I
- ; 在2M的位置测试写一下数据
9 @, _# x& C2 q5 Y - mov esi, 200000h
/ T; s$ f/ x$ H - mov dword ptr fs:[esi], 055aa55aah8 ~+ U* @! s$ |1 ^! }( v% }2 z( Q
- ; 用RU去看看200000h的位置是否是此数据....
- L, O: ]# @* t+ E. k3 U - & P$ E$ C# K, Q' `9 O& ?
- sti9 D' m0 g% r# o, u0 U" N
- ret
7 v; {, R; l" b* Q$ G) u5 [ - Set4gb ENDP- e5 Y2 B2 `% u7 G# M& ]" |
- . c* e/ O# ]$ t3 ~+ ]; V
- CSEG ENDS ;代码段定义结束
+ T1 x7 x* z! w - end
复制代码 |
|