|
刚学习的同学,有些还不会,我这里贴点C和asm的代码。只供参考。, N8 b, x6 J$ I* G" I6 A9 c7 e6 T& _
9 Z/ D) C9 p9 j
这是C的- /********************************************************************
2 j4 b- v8 ^6 t3 Z& C - * File: DOS4G.H ** t& h& K1 \3 d6 \, V8 B c) ~
- * Compile with BC 3.1 ( Editor: Tab size = 4 ) *- i8 w1 h$ c% r1 }; ?
- * *
' l3 @- ]! i, r - * ========================Title=============================== *
$ o$ j: O4 N; U) E - * 这个函数是让系统进入DOS 4G模式 *+ q; c5 r8 m" ^. {" ^6 S9 a% h# ?* P
- * 程序参考了:陈家琪《DOS实方式下直接访问4GB》 *
9 N6 \+ g4 U. n T% |1 s2 a6 v3 |9 T - * *
% j7 a9 C) B( S L- e& p - * 使用: openA20(); set4gb(); *
" E2 F6 A+ [; D& _, f& K - * *% N- x' N6 g8 W# a
- * ===========================History========================== *
3 z3 N! {7 A. ]) U# N - * author: bini *
4 Y8 x ]9 C2 k4 h/ O - * date: 2004-11-30 Frist version. *8 i0 r. x* H/ S* h4 v o4 |
- ********************************************************************/
6 e" |& c" N- a" E/ D- ^6 R. F' c - ! S- o/ n9 }0 {7 T5 w7 U
- #include <conio.h>) Z( t/ P) [9 h: m8 n3 @
- #pragma inline: m% Z# _& k6 M
( ?' c; B3 X* ?0 r' v- /***********************************************
" H% W* N1 Y! G2 Y" n& f* h - * 两个GDT,第一个为系统使用,不管,默认为0 *
~' r/ g5 j' h - * 第二个为一个数据段,没有代码段。 *% [% @% c( _) _/ N3 ~
- ***********************************************/! n* a3 X9 @3 R b
- unsigned long GDT_def[ ]={0,0, /*系统使用*/
# w3 F6 t* m6 O: X% [ - 0x0000FFFF, /* hi16bit( 0~15 ) is base low=0,
% ~; _5 P3 D% W; j - low16bit( 0~15 ) is limit low=0xFFFF 4 x- V7 _/ K4 s# Q m# a I
- */
1 ?3 p# n- g3 s7 l4 J4 [& o* _+ A- d - 0x008F9200};/* 最低字节为 base( bit 16~23 )
& g% j* A3 p1 Z+ u - 最高字节为 base( bit 24~31 )
* l7 L- J3 h) ?( E -
7 W6 r* u9 R7 X - 属性Attrib = 0x8F92
6 i7 Z* K' @/ G" h& A - . r* v" M- N0 U4 U
- 属性位Hibyte低四位为
2 i3 t; }2 X2 [9 U( r3 o - Limit( 16~19 )=F
% h+ |8 D: _3 | z' | - 属性位Hibyte bit7 为粒度
; P! D7 L# e2 i( D$ W - (值1=4KB粒度)+ ]( u! h: }; W3 x
- 8F & 0x80 = 1$ ?2 s1 U# C' c: Z) v3 R
-
2 {5 e5 V- j& |+ e - 属性位Lowbyte低四位为段类型,值=2
5 P5 y, H; \( r/ C5 i. [+ N% b - 表示为可读/写段+ i9 D8 v. h" A* ~/ X u
- 属性位Hibyte高四位=9,bit3=1表示:+ J" m; F# M5 H6 I3 Z/ m) L: [
- 描述符对地址转换是有效的。1 O2 u& I3 c6 A& ~. ]) V% G8 d
- bit0=1表示为:
" ~& k D& k/ v" h3 z - 系统段描述符。而不是门描述符。
/ r |7 o( i+ E" K - - S! ]# ]# Y+ O8 X! t; ^( c0 z# e
- */
# X7 O' y) K) d" y5 ?- D - 4 O3 g$ b: N3 r) I
- /****************************************
' y/ ]) ?" d& l( f8 L0 G1 j0 Q( z - * GDTR寄存器, 48bit=6bytes *3 s% D/ O; [. p" T, x$ d6 W6 n
- * +-------------------------------+ *
1 O3 \6 C/ c) ?* E' ?5 `; D1 ]0 d" ] - * | 32bit基地址 |16bit界限| *
! S2 z: l; W O( q: x) f - * +-------------------------------+ *
3 v- u' ?$ W5 }0 p& \4 ?3 u+ M - ****************************************/
$ K! X2 D" J7 x2 G3 u - unsigned char GDT_Addr[6]={0};2 b) q9 Q8 b; ]$ S, L4 C* }* q8 W9 U3 w
# O; W0 o1 T8 G: x9 h- /****************
# J* ]) L! h7 G: P - * 打开A20门 *
, F" A( }' c; r) @6 r Y - ****************/
2 P/ f7 s0 k- |* O8 G3 r - void openA20(void)
, b. w% A4 f: v2 h, r8 G4 Q - {
5 H6 Y$ U& |8 g - asm{' X- H2 B) \' L9 ^1 B( o) [0 T: p
- pusha7 D8 ^' d- l) c. j/ H
- in al, 92H% Z- o u0 T" `
- or al, 0x02
2 T4 c0 V* c* B( B2 n5 | - out 0x92, al( m7 Z. g9 l3 J
- out 0xed, al( @$ ]+ R2 R; b7 C+ j3 B8 h9 S
- popa
7 O/ y8 J3 O+ c& e" j; {1 O' K - }
1 H% @0 a- A5 H5 _7 w+ u9 G - }9 K1 J3 [" z. h% ]( v
7 k; f, }: q; B4 N+ b0 J- /***********************************************
! [0 R* n' n1 `4 Z/ `0 R7 O7 u* `9 w4 c - * 函数功能:进入DOS4G *
) t7 e. O/ w2 J2 @+ F( ^ - * ==================== *3 `7 H2 {0 H3 r8 G* W" U8 V. s8 ^
- * *
+ g$ T' D- I( O1 }. k - * GDT描述符界限计算方式:描述符个数*8-1 *
6 d$ G2 Q) D, d# y4 c) D2 p - * 如: *
9 l" |) d( j: o8 k/ c - * mov word ptr GDT_Addr[0], (2*8-1); *! ^- W% o: s9 j3 ^5 v
- * 表示为 2个GTD *
: N9 s& g, h8 p4 p6 O - * *
, H7 U/ L. `' N - * 选择子为所在描述符内的字节偏移。 *" n& ^) c6 U4 I) @5 M8 B4 V
- * *% S0 {3 R: }/ D3 s& ]4 n& F
- ***********************************************/
% g2 Y& L3 n0 ~( N4 t1 q% f, D - void set4gb(void)" T% |- j1 X% v/ i+ R$ f
- {( |$ r2 d, _7 u3 P/ U
- asm{
3 ^7 t! v a% n - cli
" t1 F9 {5 V2 z) [( ~: h8 m* t% I" a# ` - /****************************************, W/ \. p% x J; c' [" h
- * GDTR寄存器 *# v1 j" L4 q! c! ?; b5 Z7 V8 E- P
- * +-------------------------------+ *
; l( e$ n( o P - * | 32bit基地址 |16bit界限| *! J) W' u! C7 ?8 a+ }
- * +-------------------------------+ */ v' N! B) j: [5 u$ [
- *****************************************/% ]! W3 d% x5 M
- /*********************
0 d! S" A* h4 m, l# Z) Z - * 得出段界限 *
6 ^' b4 ?5 Y. A# u - *********************/
/ Z7 u3 E0 q5 B0 ^; [: [% {! y - mov word ptr GDT_Addr[0], (2*8-1);9 R/ _2 j3 J6 X3 M O4 _0 b
- /********************************************) u4 I% d3 {; r( K( x
- * 计算GDT表的32位基地址,存入GDTR *" t, C1 V2 x/ v- w: q. B
- ********************************************/: p9 E# O8 b! D1 O K
- mov eax, ds t9 ^1 G9 D8 o5 _; `
- shl eax, 4" m9 ?: y8 d- n
- xor ebx, ebx0 s5 t0 [; G1 @' [. p
- mov bx, offset GDT_def! H7 p$ m9 H8 a9 W
- add eax, ebx5 `/ f4 {8 z; x) g. S& }# R; n
- mov dword ptr GDT_Addr[2], eax& e: P/ V9 h& r. T5 \* f
- lgdt fword ptr GDT_Addr' R$ N, S! W- _& O2 O# N6 T% X
- /********************
! q0 W' |+ r% w - * 选择子偏移 *' H5 e) Z) d. F+ i% \
- ********************/
# o) Y8 S9 t: Z4 U% I - mov bx, 8
7 F8 p! n" p/ H, `8 O) q - mov eax, cr0# D0 d# \# _* x9 O5 D9 O, P" `
- or al, 1
" R) R0 `7 @6 c* H7 u - /**********************
7 t3 ~9 x# k0 v# ]; k2 F) L: t - * 进入保护模式 *
, e! U! \" S- G: a* g - **********************/
: Z3 y L; f1 k( F7 v, }; h - mov cr0, eax c/ L+ N9 V1 l( `6 j1 h" m0 j. }
- jmp pMod0 f8 r1 \3 V! S9 ^
- }
b+ X; D: ]* J/ E5 j1 c - & y" @+ M" }" m% X8 m9 s
- pMod: asm{1 Q* h9 q \! s: p2 `# V6 Y& f: G
- /************************************************************) |. i$ Y! ^3 s/ K( Y
- * 让fs与gs加载选择子,使其能访问 0xFFFFF * 4K (4GB) 空间 *
6 s( w5 ^+ N9 l% s; G' A" [ - ************************************************************/: S6 W! \- C% a0 `
- mov fs, bx
, V3 K' L' B& i2 L- `* b - mov gs, bx. l6 i, A% _+ V( j+ w/ l. Z5 _
- and al, 0x0FE
% u' \( e8 u9 }: L' @. G - /******************# o* G, \+ Q" @+ Z
- * 进入实模式 *4 T; W! p$ i& Q: q6 T
- ******************/
% F2 C% [; l: K! u( X - mov cr0, eax1 U8 A4 h7 ?9 b; N
- jmp rMod
% |6 {$ D; ~$ g9 A7 R* }) W4 y% L - }1 _8 H; s& b& J: }# B7 V9 I
* U" e" m8 s8 b- ^- rMod: asm{
2 j# ^+ y) y0 `7 V - /* ******************************************************************
! Q: \, {6 K) y9 \9 ~" L - * 退出,fs、gs清0,访问系统内存可用: gs[32位,相对于0的偏移地址] *
( e* A7 [! T* v5 r8 b* |- }* t - ********************************************************************/
# a9 |( Z0 w( o3 {3 f5 e - mov ax, 0
4 C1 L' p+ ?/ i( h - mov fs, ax
) L, L" B* ]9 @/ E8 Y/ m: u - mov gs, ax
6 U, S, F. [2 I3 |8 Z0 X3 T6 | - sti
& l" E0 a$ f4 q9 @1 @ - }
5 m3 \) z1 B3 J9 [% o4 c0 G" a - }
复制代码 这是asm的- ;/********************************************************************
/ X' J* S3 j& b - ;* File: DOS4G.asm *
3 R A1 i5 r0 t: E! p. { - ;* Compile with masm ( Editor: Tab size = 4 ) */ K% D4 h3 Z9 j( s& t3 |
- ;* *
( G! `1 p* ]2 L8 q; T0 s8 S - ;* ========================Title=============================== *
" ?' N4 F- ~- Q t1 y/ S8 Q( T - ;* 这个demo是让系统进入DOS 4G模式,进行数据访问 * T$ ~6 Z- R* W+ ~' N& P+ k. l4 O
- ;* *1 c8 H' u4 s' W- O, P* w: S
- ;* ===========================History========================== *
; B f8 o! X: S- t" \+ d: n - ;* author: bini *, d, |( A" a; J6 d0 r7 o
- ;* date: 2008-10-08 Frist version. *
U. M6 Z5 R, X2 \7 _ - ;********************************************************************/ 2 x+ ]5 B9 R6 g$ |$ `4 w
- .model small
1 x$ y: u0 m; A# p6 K2 S; j, x - .586p+ [6 w: ?* f9 ?# L
-
. e; @+ E/ a# @+ Z* A* E8 X - DSEG SEGMENT USE16 ;16位数据段
3 d- e+ D" x' f: ^1 {
1 d2 o. A/ y' C% X: F7 H2 `7 o* n- DESC STRUC
2 C, Y; i5 @1 G) J - LimitL DW 0 ;段界限(BIT0-15)/ C @, u& X, Z8 o$ Z( y
- BaseL DW 0 ;段基地址(BIT0-15)+ N* i. l& w- x2 A6 ~
- BaseM DB 0 ;段基地址(BIT16-23)
9 @6 L; h( Z- d/ O, M/ p - Attributes DB 0 ;段属性
7 ]; h5 [, H1 A: E$ q - LimitH DB 0 ;段界限(BIT16-19)(含段属性的高4位)2 M# r$ L8 ]7 r1 V% U
- BaseH DB 0 ;段基地址(BIT24-31)3 O2 D2 ^( z: v1 x9 S' |3 @
- DESC ENDS9 R0 `0 E% n8 F/ j, ~% v0 D6 m
- & \! Q B( d( r+ V- V- l
- PDesc STRUC" i5 t+ H1 U4 @4 ~9 l
- Limit DW 0 ;16位界限
" R6 }$ H5 `9 t g - Base DD 0 ;32位基地址1 E7 N5 E! p5 g! s' R
- PDesc ENDS
! D# T2 o3 O! Y& F; s# S" G, i' \ - ' h3 l8 ?! \. _4 f5 G
- GDT_def Label Fword4 }' p! U' h* e1 p: p4 _2 M. T+ o
- Null_Desc DESC < 0h, 0h, 00h, 00h, 000h, 0>
) w [7 |1 g0 D, {; Y - Data_Desc DESC < 0FFFFh, 0h, 00h, 92h, 08Fh, 0>
/ t5 c3 }* R: f7 Q# o6 A9 @. ]
4 I1 }. m* P2 [" J g# L, q9 f- GDT_Addr PDesc <$-GDT_def-1, >
9 `$ E- Q& S( [5 n4 m7 L( l - DSEG ENDS ;数据段定义结束
6 h* Q- p9 E3 I - ' e8 H! C) C; a2 ?% T3 y) N
- CSEG SEGMENT USE16 ;16位代码段- R, \/ h. f% {. F
- ASSUME CS:CSEG,DS:DSEG ]( R, Y5 r! }; q) m
- .Startup5 O9 J) f/ Y8 ~8 u7 Y, @: G
- call Set4gb4 X. b5 c/ o. z. v7 Z5 v& T
- ;3 {" b+ P8 w8 }" a/ H z7 c9 L
- ; fs, gs即能访问4GB空间
5 E, G' l% d# z7 |" z - ; write your code in here.
5 A/ N0 \2 a& p Y- B4 K - ;2 G9 r7 p( V- M8 S1 B+ h% o
- .exit
! E: j. E; ] G5 @* |9 p - # |" Q* [3 v' w6 U& `4 v. p" n2 P
- Set4gb PROC NEAR" z* w5 \; E8 v3 \/ j0 f7 w% q
- in al, 92h
/ D! y0 ~( U- l+ L; l- j - or al, 002
% `$ _8 s" N: f" x- e, t' t! i - out 092h, al
& w, v8 L% V3 }( y/ e: Y - out 0edh, al8 O0 p) y7 ?2 z# S3 A0 D, Q
' C. _: x3 `2 P- cli
: x0 M- u; D, ~* L2 g5 u - % R3 K$ }' Z* `) d' x6 T
- ; mov word ptr GDT_Addr, (2*8-1);7 j2 C, ?; V# A0 L" q! |2 x
1 \, d# D) _8 h4 b# s- mov eax, ds
; F; V2 j- }, K4 ^- z - shl eax, 4
+ y$ o' g" `5 K - xor ebx, ebx) J9 Z! S5 ]7 K. D
- mov bx, offset GDT_def* w% c! g* V; H; Z2 a. `+ p# U
- add eax, ebx8 f' H* U e) S
- mov dword ptr GDT_Addr.Base, eax7 S, v* q" M/ t+ j- |- X
- lgdt fword ptr GDT_Addr
0 k& l. d ]/ S2 T+ ? - * ^$ N ~/ @$ _( q
- mov bx, 85 ]% }$ A- E2 V, b% y# o* t
- mov eax, cr05 q. j" p+ B6 t8 q
- or al, 1' k' e w! r5 { a" k
- mov cr0, eax9 a! l5 k W2 ?8 x( ~
( z }5 e9 H T' J4 c3 z |4 D- jmp pMod+ S9 @( E3 ^. C! R
- pMod:* t7 i7 Y" k, s. i6 c
$ l3 k/ b3 V4 e% W* z1 R' j3 j5 N( ^- mov fs, bx
8 R( h$ F7 A" }3 h- p$ M - mov gs, bx
. r7 {0 s. ~ Q - and al, 0FEh4 W4 P3 g* C- k5 _
- mov cr0, eax
- f- b) ]3 `, l/ _) T* A - " y7 A9 E1 d; [; X- g% ~
- jmp rMod
r3 V2 y2 H. [ - rMod:# ]9 J% v. s* L( P& j+ i
- * e. u3 s0 M9 @0 b) H$ J9 ]$ Y
- mov ax, 0
9 q2 l+ J9 W$ L, C - mov fs, ax
$ N- |* |2 ~ q0 F - mov gs, ax7 o$ w- ]) S/ e0 _& m1 A$ T
- 4 W" ]- w3 x! x
- ; 在2M的位置测试写一下数据
% T* H$ N* w9 P' D. u0 a - mov esi, 200000h# Q1 p5 }; M! n) v8 b
- mov dword ptr fs:[esi], 055aa55aah
* V$ Y0 P% e, { - ; 用RU去看看200000h的位置是否是此数据....
% a7 z' G3 h# F - - Q4 k X% ^3 Q' b, T: w6 _
- sti
1 v. R3 ]; V8 o5 S - ret4 p+ q, p: u; F- B+ p: A
- Set4gb ENDP- N6 v$ g! n4 n0 }- ]0 C) e$ ?+ F7 p
- 8 Y' P. \$ \6 M5 a0 _
- CSEG ENDS ;代码段定义结束
u: e! r9 h1 i# B- w! S - end
复制代码 |
|