|
|
刚学习的同学,有些还不会,我这里贴点C和asm的代码。只供参考。. g( \9 V" o3 J
+ J) p, I' M9 E, n$ S1 {; v1 p" Y( O' Q
这是C的- /********************************************************************
5 q9 h! D6 P( H! W/ i% t - * File: DOS4G.H */ f$ V$ B2 M! E6 u. m' f# G
- * Compile with BC 3.1 ( Editor: Tab size = 4 ) *
, Q, r& ~/ b8 x - * *
1 f, ?0 o* c3 ^+ s; h7 A% L - * ========================Title=============================== *( u; E! F6 M2 j/ H8 a. | ~/ `
- * 这个函数是让系统进入DOS 4G模式 *- E0 E8 r2 v. [
- * 程序参考了:陈家琪《DOS实方式下直接访问4GB》 *! M& Q% d! @0 H' Z+ C5 r
- * *
# `$ j# \7 M- W8 O9 n9 l$ W - * 使用: openA20(); set4gb(); *3 @" l' M1 g: {$ G. o8 i8 x
- * *
! {5 D3 p% s5 u! e0 g - * ===========================History========================== *! |. n1 b4 I1 {0 D
- * author: bini *4 p/ u$ z# a F* d; J
- * date: 2004-11-30 Frist version. *
6 Z! ^; b# P" L$ U2 a z - ********************************************************************/
& F, K+ u$ l! _- m" G
" K5 G7 y, c# {- #include <conio.h>
3 Q7 r! Z* X8 d1 q& [$ I6 k - #pragma inline9 ]% o- p; V" C* X* d: w
- 5 j. D+ ` E. Q6 z. a( K& Y& m) s
- /***********************************************- q; E( N; g2 @) k- o8 u
- * 两个GDT,第一个为系统使用,不管,默认为0 *; J$ N0 p* c! Z4 A- H; u6 v3 o! `, F
- * 第二个为一个数据段,没有代码段。 *
8 ^& s, ?/ I$ U' ?' d - ***********************************************/
8 K# z0 o! g. k1 F - unsigned long GDT_def[ ]={0,0, /*系统使用*/
" Y5 j& W& J2 d) L& ~ - 0x0000FFFF, /* hi16bit( 0~15 ) is base low=0, 6 @ K# c% y+ U; U! K
- low16bit( 0~15 ) is limit low=0xFFFF ) H, ^. C( ?5 s) m: J5 \+ v
- */2 C5 y3 O7 y' w3 F# I" V
- 0x008F9200};/* 最低字节为 base( bit 16~23 )
s+ Q8 B0 w: k; T! z) c - 最高字节为 base( bit 24~31 )
g7 E' f" l& k: s5 u - / f% x" h2 H" A4 A# N
- 属性Attrib = 0x8F92- D6 A) I( v6 D. Y6 c+ G
-
8 H0 q1 c8 j. r0 q. d - 属性位Hibyte低四位为
7 w" H8 p* A1 ~4 N2 K1 g/ y - Limit( 16~19 )=F M& J/ p) e; u7 ^7 b
- 属性位Hibyte bit7 为粒度
0 m c( H/ K0 r1 i) u9 L - (值1=4KB粒度)) f4 Y& |" ^) A2 T
- 8F & 0x80 = 1& H5 @. q* B5 P" P N
- 2 l! Y4 j( V/ g
- 属性位Lowbyte低四位为段类型,值=22 \7 d& J0 t9 O% J$ p
- 表示为可读/写段8 F" ]6 ?4 s5 F% J
- 属性位Hibyte高四位=9,bit3=1表示:# ]7 t9 R% `( C
- 描述符对地址转换是有效的。% g) ^; Y( e H @/ ^9 u
- bit0=1表示为:
2 {3 k" I1 j6 d$ {( v% r2 X - 系统段描述符。而不是门描述符。
* N# i* U7 F8 }; s - ; j' f4 J! P8 m- } j' q
- */
" V0 h, h/ y5 J- y* }8 |5 X - # u7 H! ^ @2 D3 b
- /****************************************
; D0 N& d0 w, O$ `! P - * GDTR寄存器, 48bit=6bytes *8 R- o- z% k, i& a
- * +-------------------------------+ *4 }2 m- z- ]) U) r. A8 H2 p7 q/ E
- * | 32bit基地址 |16bit界限| *
7 I9 |) p" W& F - * +-------------------------------+ * H" B3 p# s- P# d
- ****************************************/( [8 x3 P. D' Z+ Z$ A9 ]: k* c
- unsigned char GDT_Addr[6]={0};
# \7 Z# A1 G: t1 T2 ^. t0 u - ' c1 ]& P+ g$ x& U$ H; y3 d
- /****************! u( x7 Q, ]% h- U* D
- * 打开A20门 *
1 z" B- r* [: R/ J; [4 T - ****************/9 L9 N3 t% y W: h6 C
- void openA20(void)
/ j' ]( S. g3 Y* ^5 x* D% W" p - {
5 B" K% G6 h: i/ j - asm{* |. p l) X* H# b5 q& o
- pusha4 R/ n/ c! C$ h. F2 B
- in al, 92H1 l/ b" o' B6 u; w
- or al, 0x02- A7 z2 F! ^2 l* h
- out 0x92, al* O+ ~8 d& t0 ~! n& a3 x6 ~
- out 0xed, al
3 ~% ?5 ^+ I- o9 y! e2 X - popa
& f& E8 ]1 R( L - } k% h4 t+ t# y& j% W: v0 T6 W
- }
; Q2 E, w0 D- `, z# _9 w, K& ]* D - 1 b6 p' T$ \, B- J9 ?
- /***********************************************
9 Z- q0 u0 Z5 F* Q; X - * 函数功能:进入DOS4G *! G8 L4 J' U! w) P
- * ==================== *
7 c. u; _' y; N0 E$ M4 q- R8 I$ t - * * A/ V' e' u6 O; e
- * GDT描述符界限计算方式:描述符个数*8-1 *
2 T. I+ C1 M4 o. } {8 ?* \ - * 如: */ T) B. C6 |: M3 H" K5 x
- * mov word ptr GDT_Addr[0], (2*8-1); *# ]5 @) T( K7 C2 u- P
- * 表示为 2个GTD ** k; m) o( c$ v4 m. s
- * *
, u0 ]) T5 O" T4 d2 \ - * 选择子为所在描述符内的字节偏移。 *5 T) Y6 n$ T' G8 F
- * *& r. f2 c0 H4 V& R
- ***********************************************/4 r4 v0 C" ]' B3 N: I' |
- void set4gb(void)
/ }3 M2 X! N9 j, o: J- Q' P - {
* j$ C/ a. M- J" y7 C - asm{
" s( [2 |9 M1 i1 y4 U - cli
- Z. M& h# [/ s - /****************************************
% u3 B- e+ I- T2 m6 N0 {9 ^ - * GDTR寄存器 *
# E& G [2 |8 d4 Q. h2 u3 p - * +-------------------------------+ *7 h& r# G4 ~" n- A4 `
- * | 32bit基地址 |16bit界限| *; S9 t" ?) b& q1 l$ ?* z
- * +-------------------------------+ ** @! N# \ V8 t" S- h7 b
- *****************************************/
/ ?# u/ i7 e% }6 X: K# R0 k: C% q - /*********************; \4 T1 T6 f0 R s9 n
- * 得出段界限 *
- r/ d4 H$ r; p h. ]8 ] - *********************/
, y; K& V2 ~: h% d - mov word ptr GDT_Addr[0], (2*8-1);* _# J+ E( q, p+ D
- /********************************************; }2 P+ L! I/ Z/ d4 e
- * 计算GDT表的32位基地址,存入GDTR *. k5 v ~5 |. P( ]% n! |
- ********************************************/8 }. o8 c2 j4 [7 |' J8 W8 l, D
- mov eax, ds
w5 J6 e9 z# s( H J - shl eax, 4
; p2 ]7 F% v& L. v9 g5 b - xor ebx, ebx
2 R4 J2 S. K1 n/ R m0 N - mov bx, offset GDT_def0 a* q# o) Q4 G9 O9 w
- add eax, ebx# X. g4 @$ M: Y, n* y
- mov dword ptr GDT_Addr[2], eax3 M# e3 w# ~9 L) V- ]
- lgdt fword ptr GDT_Addr& q1 T9 x" c7 F/ L( l( U
- /********************
; G% Y3 M8 e; s" I1 i# o/ _ - * 选择子偏移 *4 m, `* o9 m, `# @* K2 a/ i% Q
- ********************/
" m& X' B0 B$ ?6 z7 T0 Y - mov bx, 85 k( d# |9 \+ K: j% x
- mov eax, cr01 p! A+ M# U: u! p7 P
- or al, 1
/ F. ^& A- {5 E+ s% Y1 j - /**********************, V, |# Z0 @( |! O9 I- e
- * 进入保护模式 */ x8 D4 @- x8 W4 \, ~2 P
- **********************/( [2 }1 q( g D( D1 |- q
- mov cr0, eax' |- z; E( N+ N) A! s# L
- jmp pMod
% J* F7 Z- i' G) E - }: W, \5 K0 q) Q
, s% P- u4 y1 }0 m0 z$ E+ O- pMod: asm{
# G% y+ ~, x; B3 Z - /************************************************************
" M* Y3 m. z+ O# m - * 让fs与gs加载选择子,使其能访问 0xFFFFF * 4K (4GB) 空间 *
( a! Z4 ~# ]. T: \ - ************************************************************/
# l3 p7 |6 Y0 I7 ]3 B1 k - mov fs, bx$ _; J# F5 n! K; I2 u
- mov gs, bx: F" r* E# Y9 S& a
- and al, 0x0FE3 G! m+ S; h" B. W, U+ V
- /******************. \9 L6 \& S7 k! {/ Y+ {- p% _
- * 进入实模式 ** H0 F; Y; D4 |, F, q
- ******************/! V; }8 j# w' @
- mov cr0, eax) w1 v) X3 \& T, L1 r$ Y ]
- jmp rMod
% x* D/ D4 V, N - }( Z, g' _% J/ |0 j9 H* r Q
( p6 j. X H6 _! d- rMod: asm{# N" V( a6 x6 U- i1 H
- /* ******************************************************************, }* U. K$ \* v2 e, o* x
- * 退出,fs、gs清0,访问系统内存可用: gs[32位,相对于0的偏移地址] *
( T* |$ ?* }( ]% X- p* S1 N# B0 ` - ********************************************************************/
, R) } [0 Z; b - mov ax, 0 _, X7 M2 e) Y% K8 o. E: V
- mov fs, ax
) C' G$ C$ B9 R- v e4 t9 O/ u - mov gs, ax
+ [; a1 ?# ]- A7 X - sti. z# W1 N7 e+ p0 N+ k
- }' V, u# i6 A. v9 _$ e' u
- }
复制代码 这是asm的- ;/******************************************************************** d7 V; }& @6 t" g! |
- ;* File: DOS4G.asm *
6 d8 T+ q- P; v1 \ - ;* Compile with masm ( Editor: Tab size = 4 ) *; {6 {# f4 @+ C" H
- ;* *
) ^/ O8 s* S2 L. k2 I - ;* ========================Title=============================== *! g- F" Q1 P7 t7 A/ @1 k [0 A
- ;* 这个demo是让系统进入DOS 4G模式,进行数据访问 *
/ p- e6 _0 W3 D3 f& }2 u - ;* *
3 j% r6 U o( k9 K' }$ N+ _; Z - ;* ===========================History========================== *
4 u$ F; s% P" ~$ s - ;* author: bini *
2 g x+ x$ j( B2 c4 Q9 Y6 } - ;* date: 2008-10-08 Frist version. *
4 A+ A/ ~* U6 H* U, g# s6 O1 Y( M - ;********************************************************************/ ! j( r; R# j8 I, h, k
- .model small; r0 \3 W: d9 |1 @
- .586p
$ Z0 T( w3 p7 J4 A$ `. e - ' H9 ?' T& X, j9 c7 L0 I: \
- DSEG SEGMENT USE16 ;16位数据段
8 D+ Y" X- V" e H" {6 z% n9 ]( y
S5 l; b, L+ N' U d. r- DESC STRUC$ k6 I6 _2 ~3 ~) e! t* K1 s/ J/ N" @
- LimitL DW 0 ;段界限(BIT0-15) |1 _( \0 v" \4 R' B" n
- BaseL DW 0 ;段基地址(BIT0-15)
+ o9 s4 [( @6 }* C2 a) \) C - BaseM DB 0 ;段基地址(BIT16-23)
% U3 v# F. D- l( H - Attributes DB 0 ;段属性
/ g0 x, Q. p3 k& _7 m6 [- k7 Q - LimitH DB 0 ;段界限(BIT16-19)(含段属性的高4位) i+ C) k8 [' `7 b' s- Y- U; \
- BaseH DB 0 ;段基地址(BIT24-31)
: R! g1 V3 i/ g- { - DESC ENDS+ ?: n' ]" y0 V% m& J- D
9 c0 _5 Y" V0 u/ L# S- PDesc STRUC+ Y8 b1 j" a8 z
- Limit DW 0 ;16位界限
r& T- c- g" d, V - Base DD 0 ;32位基地址' w/ ?, o' C6 c% m- j" L
- PDesc ENDS
2 b+ }0 b8 ^: y* \0 a: l) s2 y8 ^6 ~ - - a' _. {3 A# e( D
- GDT_def Label Fword9 O9 g( m* @8 Z' B( V* O' {' i
- Null_Desc DESC < 0h, 0h, 00h, 00h, 000h, 0># u# _- k7 E% d% W. I
- Data_Desc DESC < 0FFFFh, 0h, 00h, 92h, 08Fh, 0>% Z" f2 d1 ~& T' r& t
- , k9 W- t" `/ y$ g O% v
- GDT_Addr PDesc <$-GDT_def-1, >
( x) y: {1 \ D' r - DSEG ENDS ;数据段定义结束
3 t; `8 E0 e; I8 h1 F+ U- K - 9 W& S- q4 ]7 R4 |4 u: @
- CSEG SEGMENT USE16 ;16位代码段: }3 F% h! w2 Q( u2 Z+ ^9 g
- ASSUME CS:CSEG,DS:DSEG/ K! r5 w9 S0 k$ S
- .Startup
; d+ ^7 t( B3 d5 G a0 ]+ c - call Set4gb$ k6 ?% h' r5 x2 i$ t$ `7 M- O
- ;: K( k- C) K% `- j" n1 g% U
- ; fs, gs即能访问4GB空间
& Y+ S; t+ c+ o9 v3 @) y6 Y - ; write your code in here.
( `0 d9 J1 @" E( x# u - ;% {, U1 [" W* r, b9 y) U4 M
- .exit. D2 A w4 R2 a; d: r& X$ C
-
1 i# y8 @ ]) l) j - Set4gb PROC NEAR9 w# x4 J2 T- C+ F- o
- in al, 92h& u1 F( @4 B$ X
- or al, 002
( i8 m5 S, Z- R' u: ~; f3 d8 B - out 092h, al
$ C" @' Q; S" K) }) D" v - out 0edh, al, z' M# W+ |5 w8 J( _" v7 U- G8 I
0 }. I7 {% i7 L/ p: Q( B ]$ ^( \. s, J- cli5 j4 w! l. F! H
- 6 _0 ?! b$ X& c
- ; mov word ptr GDT_Addr, (2*8-1);7 I" y1 x" |( n* u
- 1 r$ \5 O1 ]: _' b8 F: E4 W2 l
- mov eax, ds5 r/ B9 @ K# b; _. O
- shl eax, 4
* V6 i, V( K: x - xor ebx, ebx2 ^) |% ~; ~: T$ G+ i
- mov bx, offset GDT_def, R; h$ R1 A F1 I
- add eax, ebx
" F* f% F m9 Q" f5 y3 V! C - mov dword ptr GDT_Addr.Base, eax. e+ y+ g) l% U1 h2 l
- lgdt fword ptr GDT_Addr
& i1 N; L2 o" l" o - ) `0 @) Q* K5 e5 C+ z9 B
- mov bx, 8
) P" C5 I! ]& ~( v6 z - mov eax, cr00 @2 r P' z! Y6 X
- or al, 1/ S# z0 k$ n+ t( O8 }
- mov cr0, eax3 F5 O5 ^/ F* J7 t" L
/ O7 L8 o$ _. I8 V9 u0 ~1 ~2 H- jmp pMod, Y3 P. u$ C- H$ W4 ?1 {1 u# A; w
- pMod:" P- S/ @* r0 V) E& F" f+ J
- 5 o+ o$ @1 d7 W3 C4 C; `$ [
- mov fs, bx# [0 T" Q0 o& J9 w( l
- mov gs, bx# v' f3 P! \- F" h- I; Z
- and al, 0FEh o% J& ]+ U- ^# ~2 ~. h
- mov cr0, eax, a! i& n& H4 Y) Z e8 Q- d1 {9 {
-
9 H5 p! y. k8 O J - jmp rMod
, M# V$ M. |; r6 e" h! Y - rMod:
6 y9 X6 K: R- r- B: r( a( D - : k# H( Y5 J' M/ Q
- mov ax, 0
/ ` J/ v5 t8 N" r - mov fs, ax7 w! t5 q) q5 g" x/ v+ P! g, w
- mov gs, ax3 M& ?, ?8 x K
- 1 |2 ]( Z* W7 q ^$ w8 _' k
- ; 在2M的位置测试写一下数据3 M5 u& F q7 N, g
- mov esi, 200000h- F( j+ _: q( h9 b
- mov dword ptr fs:[esi], 055aa55aah; j# a7 d& r$ x# p' S4 }$ W4 f
- ; 用RU去看看200000h的位置是否是此数据....
& G* H; e1 l8 U0 }- S2 G, z6 d: {- H
* o. g2 f0 {+ p* D$ E- sti
8 B! e) j$ ^) \: q, o% P - ret
& C/ m1 H- }3 a" j$ @ - Set4gb ENDP
9 Z9 s: z9 t9 X; Z: N0 X4 t - ! B. j# [$ ?: H# {" R4 `
- CSEG ENDS ;代码段定义结束- g8 y c6 _9 m% y3 r: o- z" B
- end
复制代码 |
|