|
|
刚学习的同学,有些还不会,我这里贴点C和asm的代码。只供参考。( r* F8 c. j5 i6 C8 @7 a! K
( q' }" D9 A6 B1 L8 o( e. _1 ?
这是C的- /********************************************************************
8 N ]# X+ ^* R: a# G4 D+ T - * File: DOS4G.H *0 }& L5 _: }: d" B0 i2 [' g& ?1 m( d
- * Compile with BC 3.1 ( Editor: Tab size = 4 ) *. X% n2 F% v) b2 l3 R% Q9 ~
- * *7 y5 s6 n# T- P
- * ========================Title=============================== *
3 K5 J$ M. T! x - * 这个函数是让系统进入DOS 4G模式 *8 d' p2 W: H( t3 [$ l& O, {4 k
- * 程序参考了:陈家琪《DOS实方式下直接访问4GB》 *) |, k! x, X6 A2 E+ l$ d
- * *
1 a$ L5 M! H6 ? h1 K- I; M: a - * 使用: openA20(); set4gb(); *, o: n9 j* l8 k7 |' k6 S
- * *
1 N- _: u6 p5 V1 U- u1 P( K4 P+ T, b - * ===========================History========================== *
4 S# o0 V2 P/ d) i5 o+ U; J - * author: bini *( Z% G" Q% M1 G& _# o( Q6 S" _9 p
- * date: 2004-11-30 Frist version. *
f+ Q+ w4 X% } - ********************************************************************/5 k m. F5 S* P) U
- $ q1 L2 g; S5 ?- U2 D1 `
- #include <conio.h>
8 v3 B$ G; V8 x2 W - #pragma inline
& q& Z2 R2 L! \6 x) i9 W6 t - ( K0 t$ i4 I! @
- /***********************************************1 k3 k2 t, U! i ]$ P! O
- * 两个GDT,第一个为系统使用,不管,默认为0 *8 g% n/ ^) q4 J) D
- * 第二个为一个数据段,没有代码段。 *
8 P0 {$ V6 p. g2 Y5 @8 r. _ - ***********************************************/
7 o9 v- k- D" D/ j; ? o - unsigned long GDT_def[ ]={0,0, /*系统使用*/8 m& {4 Y9 u' B* {7 _) m
- 0x0000FFFF, /* hi16bit( 0~15 ) is base low=0,
4 W2 X; @5 k* L' M3 Y! i - low16bit( 0~15 ) is limit low=0xFFFF 5 d0 A3 J9 @2 G4 W& b" u! a2 N
- */ }+ b, P, L8 {/ M- u ^
- 0x008F9200};/* 最低字节为 base( bit 16~23 )
& G4 A9 T% c* D# I# f - 最高字节为 base( bit 24~31 )4 A- L" |) I$ e8 L* s. w
-
0 T' W+ `1 r8 L( A" m5 F4 i K# C" O4 v - 属性Attrib = 0x8F92( R% y% J7 S* d
-
! Z0 ~& C$ F* \9 U0 h: ? - 属性位Hibyte低四位为
9 }9 c( X, I* G/ }2 E: y - Limit( 16~19 )=F
' E2 c! j6 L6 O. z/ z6 V - 属性位Hibyte bit7 为粒度
$ r+ r5 { u6 _+ e* ~$ m! y - (值1=4KB粒度) n) {' @4 d7 r6 g& h, ?8 J# l
- 8F & 0x80 = 1- O5 z2 F3 J1 Y3 {" J* w
-
7 k4 r. l+ t9 m* r4 t1 o - 属性位Lowbyte低四位为段类型,值=25 ]1 d, e2 z# Y! X. ?
- 表示为可读/写段" O. K6 F! D0 q# ^" O D2 u: |8 S
- 属性位Hibyte高四位=9,bit3=1表示:8 U, b& k1 s, F( u
- 描述符对地址转换是有效的。
" d) n: B/ Y- \ - bit0=1表示为:% t9 S; Z! {/ h* j' p+ L. B( t
- 系统段描述符。而不是门描述符。# [6 i! a5 e- b7 G- ?: j
- * F2 i) v# x; y9 d, H
- */
( C- H* r+ E' d! K, I
/ O' p7 m7 P) J* o6 f- W% a- /****************************************; k. C; S6 G: l% ` W( A0 x, r
- * GDTR寄存器, 48bit=6bytes *, d7 \6 U4 V: _- c
- * +-------------------------------+ *3 D5 k# E& i) D/ n& ?
- * | 32bit基地址 |16bit界限| *
w# m( p/ C& B6 \ - * +-------------------------------+ *, O% _, l$ H. w" D6 h5 Z4 J
- ****************************************/3 a! v" V0 i7 G+ Q# V2 ?) X& B! W
- unsigned char GDT_Addr[6]={0};
2 Q& i# @. q9 m - : C; r f8 d+ B& h6 ~
- /****************- ]0 n9 ?- y, m4 ~" c2 C9 _
- * 打开A20门 *
B8 D+ _. x2 y7 L; W# D' X - ****************/! J; D# ]% k j5 g% Q" M
- void openA20(void)3 j% E* h1 W C
- {
/ a% ]& _) [4 z) R6 _: B - asm{
9 g+ i7 i+ U1 ~5 ]9 f, d7 l7 ? - pusha- |! c6 j% c2 `2 M* K
- in al, 92H
' G& j$ H& f* y; p - or al, 0x02
: U7 A+ I. B! S2 e H - out 0x92, al
( i$ p" N6 A% j- P* z9 D8 u - out 0xed, al; y8 G7 q& ^+ m- [! C: K
- popa
8 n% ~# c# y8 C$ m- U, L - }. M! @7 `% [1 T. h' _; D
- }
{- b& r/ N. ^
* z5 `$ g. e( d0 a, K3 @- /***********************************************+ V x" G* f, A c- x
- * 函数功能:进入DOS4G *
0 h# a4 I6 i, w+ P+ s. Y( E - * ==================== *
, H3 \8 q' h+ G6 i M% j2 q1 q2 q - * *7 J9 [: o% \7 j
- * GDT描述符界限计算方式:描述符个数*8-1 *
7 q! Q' C) n# ~3 r; p5 \ - * 如: *
- r0 z T6 s% u1 U - * mov word ptr GDT_Addr[0], (2*8-1); ** j' T" L8 g. o( o3 j4 A
- * 表示为 2个GTD *9 B% R! J3 }. ]9 {6 Q, R. Q
- * *
5 t) m; I- a% d+ W! y3 m - * 选择子为所在描述符内的字节偏移。 */ A/ R5 u' Y5 s1 Z1 P, g' J
- * *1 r. s# T0 Z2 `- o! p, i$ p5 x9 W' t
- ***********************************************/# \: D/ y# X( ?$ M( Z
- void set4gb(void)' @; V% Y) K3 s# o& A1 c, U5 l8 e
- {
8 c- n# c7 h0 w- v; c$ W- v - asm{
+ }7 [3 f% ~( s9 y! H9 Q6 t: |. ? - cli
/ `' u e) [# O; n6 S+ w - /****************************************& {" [8 v& H- @8 \2 W0 G" i
- * GDTR寄存器 *
9 h4 c$ c) }9 v - * +-------------------------------+ *7 A9 j) s% d0 q8 t- j
- * | 32bit基地址 |16bit界限| *2 K% i- M2 o# j4 v3 u& |( _% m
- * +-------------------------------+ *- F }- `4 t& v# n) q1 N3 h
- *****************************************/% i# w1 ~# v9 _, L
- /*********************) P( ]/ [7 H r6 H& j
- * 得出段界限 *
2 c. K+ z, }4 I, g$ R6 U - *********************/
8 [. l! J2 v! ]6 q - mov word ptr GDT_Addr[0], (2*8-1);& x; k8 S: _: ?; l$ `7 \! i1 V
- /********************************************
( b8 J5 r$ z" G- p - * 计算GDT表的32位基地址,存入GDTR *
9 [( f; E/ Y' V9 w" I h9 r - ********************************************/, X8 J6 b+ I- N: P9 m8 Q R
- mov eax, ds7 n- I! n }1 @
- shl eax, 4
Z) [6 E0 Z3 B' C - xor ebx, ebx7 D3 t% H* R E" Q
- mov bx, offset GDT_def; f5 H% H! D' M
- add eax, ebx% K" \- i4 [* J0 Q* ]& w0 s# l
- mov dword ptr GDT_Addr[2], eax
6 g+ W3 A, u# f8 c; R1 w! X - lgdt fword ptr GDT_Addr
4 _7 j) Z0 ~! k+ L0 j3 ^7 N2 Q - /********************
, o7 w( m! X6 Y4 k: |! ~) ]8 [ - * 选择子偏移 *0 F& a8 }; C$ ~6 U/ ~+ X
- ********************/( D/ m) D8 H6 C- l( T9 N
- mov bx, 8
( j* J9 _- n% l# x - mov eax, cr0
8 c2 S5 w1 h( {! n0 n - or al, 1; a% Z& s: _) {% \
- /**********************
- p/ Y& g+ {4 F6 r2 X - * 进入保护模式 *
, Q3 k' b+ K! v) t$ n - **********************/5 K' d2 M2 u& y; a
- mov cr0, eax3 d; N; G# ?/ k9 e2 F
- jmp pMod
( K. E9 e% c, O - }
5 P, a7 x7 X- a5 W# Z - ' r5 x( D5 t. n% @
- pMod: asm{
& ~! v+ h4 y( d0 K4 q2 p3 } - /************************************************************
" o! x. f2 F6 R8 o - * 让fs与gs加载选择子,使其能访问 0xFFFFF * 4K (4GB) 空间 *7 S1 ~1 U7 O8 S
- ************************************************************/
- w: A& _4 R8 n. J - mov fs, bx
; \. Q1 K2 f5 Z - mov gs, bx' a) g( y- R6 n3 P& m3 V
- and al, 0x0FE
$ `' n0 e% I% r% x$ P. u - /******************
2 t& N" l; k& h- `; T7 v - * 进入实模式 *( B% \3 E. ~! P1 Z2 T
- ******************/
( Q* x6 |1 z$ F! z - mov cr0, eax
3 M/ z( }+ o$ J* o" _ - jmp rMod
: S8 M! v8 s7 [( s& x - }
$ H+ D9 X% `1 B. L' F: F0 q$ N: ^; u
. h/ H, n. z, z& Z& G- rMod: asm{+ G. C7 e7 Y2 ~+ P$ \4 v
- /* ******************************************************************
$ n( c" ?- z8 d. {4 J8 X! v- b) h - * 退出,fs、gs清0,访问系统内存可用: gs[32位,相对于0的偏移地址] *
8 y* D5 E N6 m6 t - ********************************************************************/
* j) |/ k: @! Y Z' t H _- P6 @1 Y1 ` - mov ax, 0 n. R0 g* v) M" ]( |
- mov fs, ax
1 a2 n; o( T+ ? - mov gs, ax& n% o( @" U/ C
- sti
( Y U. M( ]; ?3 d1 ~3 D) @# y& f - }* m& |0 ^+ I- V9 k0 @1 I5 `0 W
- }
复制代码 这是asm的- ;/********************************************************************
8 t9 u; C# ~, p/ D/ K1 c - ;* File: DOS4G.asm *
; ~ {1 e8 f3 T: a @ - ;* Compile with masm ( Editor: Tab size = 4 ) *$ s' Z$ u0 Z9 \# `' n+ p: {
- ;* *8 h7 H G7 P' {5 W% w
- ;* ========================Title=============================== *
6 {! x, S2 W" D* x6 I: \2 V: Q% o - ;* 这个demo是让系统进入DOS 4G模式,进行数据访问 *+ T. E l4 K6 n$ F( t" b
- ;* *0 `4 E7 K9 _1 q5 T6 M: r
- ;* ===========================History========================== *; ^6 e3 \) [! d& J- t
- ;* author: bini *
" z0 }/ B& M w) ]" t5 V Q - ;* date: 2008-10-08 Frist version. *4 k! \& _ t* ^3 d: t
- ;********************************************************************/ 0 V- G4 p; A$ r" |% R" \/ `/ t/ j
- .model small
8 a& E3 q% p$ D# f, H& ]$ j7 R - .586p" B/ Q& B+ W0 y
-
+ X( @" \& ^% m: g+ Z4 X& R - DSEG SEGMENT USE16 ;16位数据段* i/ H8 J8 `3 @" R5 u# ]$ P6 P4 I
: N# @+ M* W9 }4 M% v4 k$ @9 F- DESC STRUC5 c$ Q" E. ~+ V7 C
- LimitL DW 0 ;段界限(BIT0-15)
0 k; Y4 Y5 G4 }: U! A% F - BaseL DW 0 ;段基地址(BIT0-15)
6 r- Q# J1 \5 m) D - BaseM DB 0 ;段基地址(BIT16-23), V0 u% B5 `! f& d
- Attributes DB 0 ;段属性
. I2 O" f# b% x } - LimitH DB 0 ;段界限(BIT16-19)(含段属性的高4位)
$ |( M4 ], F9 w3 Y - BaseH DB 0 ;段基地址(BIT24-31), c C2 c7 ?2 P; {' Y( n0 e
- DESC ENDS
+ X- O! J0 x* w5 ~/ ]2 v1 a- n - % O. ]0 N- K! @- O+ n
- PDesc STRUC
# x7 @) o$ s( X1 } - Limit DW 0 ;16位界限
9 ~& k7 X4 q% x - Base DD 0 ;32位基地址
; t# b" y+ _" w7 ^1 A- }2 T - PDesc ENDS7 G2 y+ p E1 D3 v/ |1 I
- ( U+ i+ h; e$ z' M, Z0 r
- GDT_def Label Fword
4 [* H2 h( E$ ] - Null_Desc DESC < 0h, 0h, 00h, 00h, 000h, 0>
7 q3 ~' K( ~, Q; `; u" K - Data_Desc DESC < 0FFFFh, 0h, 00h, 92h, 08Fh, 0>1 `' m" U3 C0 @) f" Y
e6 |5 b$ Z) z* O- GDT_Addr PDesc <$-GDT_def-1, >
3 `% r1 ?3 P5 H - DSEG ENDS ;数据段定义结束2 v; I B4 p3 D
- % D( M6 N0 s5 H q( P1 o6 J
- CSEG SEGMENT USE16 ;16位代码段
9 A% F ]3 ]" Q! R! m - ASSUME CS:CSEG,DS:DSEG$ X' x, H6 `' v4 U8 r! A4 V. S
- .Startup |1 F; \ ~# ~1 \3 u
- call Set4gb0 f) X7 h/ X8 u- y3 v
- ;
+ {" x3 N5 ~3 ?8 u: j - ; fs, gs即能访问4GB空间. k8 }& t; Y. T3 c: V
- ; write your code in here.
! r8 J. t4 @5 l - ;1 B& Y/ f/ n7 J& s7 u
- .exit
: z. a# X- x& t -
4 z' R* y# O. k5 I: g8 e* Z+ R - Set4gb PROC NEAR
/ [0 Q1 ^ e# L' f* y' N - in al, 92h
/ j# q' ~ v- ?% C9 d- {8 y - or al, 002& q# D8 G* M0 s' X/ _
- out 092h, al) V4 F$ ^( S' N' R# l. Q
- out 0edh, al2 i+ T1 l4 X+ k& P5 h
- # f3 _; t' Q& }
- cli
- Z0 y3 i$ b! ^. u6 r2 g - ! R: g) b9 G- G. Z7 J7 ^
- ; mov word ptr GDT_Addr, (2*8-1);
) U% y8 k5 r, V W% @
+ f$ T( P% P7 I6 m- mov eax, ds' L1 |3 V2 E$ M6 z+ l5 \
- shl eax, 4
% k! [( t3 o0 t7 Y1 [' f. x6 R - xor ebx, ebx
% H i" @! Q& P7 p - mov bx, offset GDT_def8 r7 V" m& t" J' v; g& y$ g
- add eax, ebx p; L+ a* S* j
- mov dword ptr GDT_Addr.Base, eax- z# E8 y4 }+ j5 n! _* w) |) `
- lgdt fword ptr GDT_Addr$ [: F+ b4 g9 |5 P( w" p
_2 f! `; d: y- mov bx, 8
# w: u+ i) p" y* Z - mov eax, cr0+ J5 K1 Z# s+ J; C+ \% d
- or al, 1
% c% I1 Z1 y7 o+ ~ - mov cr0, eax3 x8 I4 i1 W- R' b
- ( h: u. b) d' a) z
- jmp pMod
% } b P9 s4 ]6 Z - pMod:; e6 J+ K8 ]* j8 [
' ]' Z1 O4 P7 L- mov fs, bx. B* \! a; b$ J$ e( s
- mov gs, bx
6 @7 g4 z; |5 r$ I3 A" ^- y. Y - and al, 0FEh
( Y; B% U# `' ] j7 C) K% H - mov cr0, eax
0 r+ L% j0 d7 c6 t$ J) L% @ - 7 O# D6 q* ~9 n; U7 B: s
- jmp rMod
& _! j1 O' v5 N8 y# I$ u7 N; l - rMod:* ?3 B+ |; G6 p# o( H7 N& E) t9 i
# J/ m5 w# c" b7 k" ?0 i: ^- mov ax, 0: b' q+ S. I8 e# a
- mov fs, ax
/ y0 E2 b: Z4 [" M - mov gs, ax
- Q" H, p$ ~4 U# C5 N2 ^ - ; ]; Y; b' Y a4 S5 a8 V
- ; 在2M的位置测试写一下数据6 ^% q) G( ]0 R' D/ ]8 L0 `. i: c
- mov esi, 200000h
9 g/ L; a4 n! U* V6 D6 p! O - mov dword ptr fs:[esi], 055aa55aah
% d0 N. p" }$ ~4 k/ K3 e - ; 用RU去看看200000h的位置是否是此数据....0 Y; _- C: s y6 {" \* D2 G
- 1 `! \, Z5 x1 O+ ~! w& J. Q+ b( t$ W
- sti& t8 _; Z- k" u0 Q! I) t
- ret+ S) H$ @) d' O5 b2 y6 P; l) n
- Set4gb ENDP6 v- ~: J; ^6 {, i$ e# m/ P' a
- + i" w4 C& w/ W; X& w3 K8 Y# _
- CSEG ENDS ;代码段定义结束* i! X: @$ @6 X( e& \$ ?
- end
复制代码 |
|