|
|
刚学习的同学,有些还不会,我这里贴点C和asm的代码。只供参考。 E" n$ j; c. \6 V% d- W
9 j7 D/ u J1 u+ i
这是C的- /********************************************************************
# N- Z$ v4 m4 o% d: x - * File: DOS4G.H *" `7 H7 X5 h% Z2 S! r$ v
- * Compile with BC 3.1 ( Editor: Tab size = 4 ) *" n- X7 u& t: m3 P2 ?: r# n6 b
- * *
3 E" L0 s9 b! S/ v - * ========================Title=============================== *& b; f/ d" ?- |5 U, Z
- * 这个函数是让系统进入DOS 4G模式 *; j U2 ~( b: E- M7 B/ N- i
- * 程序参考了:陈家琪《DOS实方式下直接访问4GB》 *
+ F* `* f! M8 F2 \$ B S1 z7 v, ~ - * *
0 i0 D5 \) |3 C - * 使用: openA20(); set4gb(); *' Z4 d$ m9 \: z- T8 [1 O4 t7 Q0 P
- * *6 A6 z0 i1 v8 r$ m# x
- * ===========================History========================== *. [1 @' u" Q" w* n% [* c: F
- * author: bini *5 C( S! |. r2 z0 V' L
- * date: 2004-11-30 Frist version. *
6 B$ N3 w$ c. ^) x. c" _ - ********************************************************************/4 t- s, y0 \. g5 m- n$ R
- * @% L4 w" ]2 q
- #include <conio.h>
2 u. @& t$ ^& M, Z: X9 X$ _- \6 L - #pragma inline
& o9 i5 P; g7 U - $ Y) @2 a2 y ^% X' M- |, u
- /***********************************************
o' m, ]* [2 H' e' ^3 H - * 两个GDT,第一个为系统使用,不管,默认为0 *
/ L1 n P! B# M! [1 V+ B0 K - * 第二个为一个数据段,没有代码段。 *
- U' x% N/ N) U3 t) U - ***********************************************/
: S' z! X0 o. `9 [( u - unsigned long GDT_def[ ]={0,0, /*系统使用*/- w* {; C5 i: }. z8 k& `" }% Y+ Y
- 0x0000FFFF, /* hi16bit( 0~15 ) is base low=0,
; c4 H: {- H6 |' {: U" U - low16bit( 0~15 ) is limit low=0xFFFF
0 s" ?/ ?$ @1 P3 o N; @. ^/ p K; c - */
9 K+ F+ [/ R0 j$ ?. D - 0x008F9200};/* 最低字节为 base( bit 16~23 )
" {* ?6 F( W/ W; k - 最高字节为 base( bit 24~31 )& Z$ }, _5 a$ X" ]8 s! ]/ [) G
- - S& N+ D# E% o; W( n
- 属性Attrib = 0x8F92
" Z! b% s& ?& |- k" |3 F, \# a+ l - * h- l2 Z) K6 z U
- 属性位Hibyte低四位为 2 O1 A' m1 @9 H+ G: f
- Limit( 16~19 )=F
* W/ d8 W/ X0 ?! d9 n7 T - 属性位Hibyte bit7 为粒度
# R9 Z- [4 i5 y+ p3 k2 y - (值1=4KB粒度)* [# h9 I! K& X4 S8 w; m t. o
- 8F & 0x80 = 1" t s1 b9 F) [; w
- 9 y0 V2 q# z" Q( H' @9 x
- 属性位Lowbyte低四位为段类型,值=26 ~. Y' d7 [5 `1 T; n
- 表示为可读/写段5 d8 t; @5 z* N) w7 u0 B0 S2 c$ n
- 属性位Hibyte高四位=9,bit3=1表示:
$ d" m5 y2 y/ O! Z - 描述符对地址转换是有效的。1 }; y+ R5 J! c* k1 K. n. G! w5 b8 c
- bit0=1表示为:
3 O3 d D3 N+ `* X) V5 @/ G2 | - 系统段描述符。而不是门描述符。4 u4 g6 a/ L0 N4 X' R: o1 Q1 A# m) T
-
q9 v. m) ~) C8 | - */+ g9 F; ]* g6 g0 X; J z, U
' D6 j* Y4 Y' _7 C, r- /**************************************** _ x7 w5 a3 R$ {8 X" p5 E
- * GDTR寄存器, 48bit=6bytes *
# }8 u" H; A$ P7 k' k7 c- d - * +-------------------------------+ *
8 m; c# k# [/ Q" c6 `& X0 d - * | 32bit基地址 |16bit界限| *: K6 u6 R% N6 ^' j% o
- * +-------------------------------+ *
& S ]1 R* B3 A6 y - ****************************************/7 a; A+ u6 G6 o( S! a: b7 W
- unsigned char GDT_Addr[6]={0};# \2 U( L4 ?! \2 l
5 p* M. R6 M, u- /****************% u8 ?* E, A: @6 z @
- * 打开A20门 *& I( @2 m @! t" }
- ****************/: ?. K. n' t8 q, L2 L
- void openA20(void)
; ` k# L( |9 t# |& c% T1 U - {$ Z5 s$ T7 L; j6 x) X& U
- asm{3 u3 \, j# K/ u$ ?0 f# E) ]( h* U t
- pusha k7 f4 p$ j. X: t% c" k; F3 G
- in al, 92H% L- ^. n! w: Z7 m0 Y% Z8 r
- or al, 0x02
, \/ {0 }- q) E+ i2 Y% i# Y$ X - out 0x92, al& Q( l. m& Y) Z& _
- out 0xed, al& G7 p) G0 {% s
- popa! L1 E" z% a. O2 w% L
- }9 p2 n( l4 ]2 p' }
- }
5 e- e2 M" k4 l8 L
: Y) w X S. d1 C$ F* P- /***********************************************
* @( F% \! p% X7 \$ ? - * 函数功能:进入DOS4G * g8 l- U, r* e* Q
- * ==================== *6 H3 z) }/ {+ m/ C* _
- * *( F& X9 `( Y( g! c3 Q2 W* D2 {
- * GDT描述符界限计算方式:描述符个数*8-1 *" w/ w6 C$ [/ I! j
- * 如: *# S7 J2 n! N c' i) ]2 W
- * mov word ptr GDT_Addr[0], (2*8-1); *
: ?! @' r! Z- z - * 表示为 2个GTD *
+ q O, u( R8 V' z# i }7 L - * *
& {# S2 K4 `' e) _- s+ O% s3 g" v - * 选择子为所在描述符内的字节偏移。 *
. t, z4 b0 B' C: s" U! T, m, o - * *
7 T" S7 f! l- q! F. Y' h - ***********************************************/
1 [# h" a/ r. Q/ W0 |- Y - void set4gb(void)! r0 ?3 ?! y- W6 y
- {
5 E' P) b. j6 F. j5 L( B% W - asm{9 q: V( a# |2 X0 O* k. `. K
- cli
' J4 J8 Y5 a: ~7 v. P - /****************************************
U/ ]3 X& f, m, H) `$ t - * GDTR寄存器 *
0 E: u4 P' e/ o) x: U9 C! T, i - * +-------------------------------+ *
0 V8 K8 h5 ~* D9 F - * | 32bit基地址 |16bit界限| *
k& m3 Y! R d - * +-------------------------------+ *
5 [ @+ b/ n( [2 Y - *****************************************/) Z* E" ~ y/ d% I/ ~ l/ ?8 @3 u( B
- /*********************6 `' S2 M/ }- y0 l* T
- * 得出段界限 *& [1 k$ z( I% H9 N+ { }" d
- *********************/. _9 ^' I7 S6 g6 F6 q" r6 M
- mov word ptr GDT_Addr[0], (2*8-1);# P% M" v' q0 H1 x* t, j9 N% G' H
- /********************************************, E% A3 w% o! z% W! c$ S& w
- * 计算GDT表的32位基地址,存入GDTR *
( S) @: \/ J" w' B" z/ o! B - ********************************************/8 U* K3 e# E& P. u W, j) v) _
- mov eax, ds
1 _: T* j3 u, f# T4 i+ p& m+ @ - shl eax, 4
0 b6 }& I5 h8 Z9 q" O2 y - xor ebx, ebx6 t& a v! g2 a
- mov bx, offset GDT_def
: I7 r! }6 Z, n% |' J9 W4 X. U0 I0 V2 @ - add eax, ebx
! O, s4 o9 @% a$ v# W4 Q& r - mov dword ptr GDT_Addr[2], eax8 @/ a2 N! R+ V& z1 o
- lgdt fword ptr GDT_Addr
+ m1 j2 D) s9 V3 t7 r- u" v h - /********************6 L% Y, f7 n9 i8 l2 k
- * 选择子偏移 *$ b" ^. p; w9 B5 f$ k+ Q
- ********************/
4 z, g8 b, N& j9 X - mov bx, 84 m0 ]+ ~* k1 [7 \
- mov eax, cr0+ [; Y/ J, ^ v% t
- or al, 1
$ O. P% a9 _+ z8 k: p; g - /**********************: P! b, n$ B6 m) g
- * 进入保护模式 *2 B' Z( Z4 w& K1 b$ E+ N! A
- **********************/
" \1 |9 T5 ], m, ? - mov cr0, eax5 t3 l, ~7 O/ S7 I! v
- jmp pMod( e G6 G2 @, l* S: G; x8 w
- }
# T& r% m% M5 ^0 ^# h. Z - ! ^ ?% \' \& y2 ]
- pMod: asm{3 q8 ] B9 m! l& n5 [2 P
- /************************************************************
+ `4 v# s) q6 q& p6 q5 X; ^ - * 让fs与gs加载选择子,使其能访问 0xFFFFF * 4K (4GB) 空间 *% U' r/ K9 X! I2 M0 M1 L
- ************************************************************/
* W- |5 e r3 r# p; p+ v - mov fs, bx* v7 N3 w; y+ y
- mov gs, bx
7 t" \) L2 [' v: N# H" p( B' B - and al, 0x0FE
. O1 ]/ m3 E8 v! g- R& F6 h - /******************
; T6 r$ m4 {* O& O2 O% B - * 进入实模式 *
) R6 D7 y6 a. s+ u0 B - ******************/
$ O9 W: }+ _5 m7 E4 u - mov cr0, eax' U, i/ @' W5 s- U( A' Y, R
- jmp rMod& u2 Z/ \; S* Y" f! G/ l; h
- }
) l+ n" l0 m9 h$ \
" ~2 K% \7 ], ~6 l, G3 F0 u4 V- rMod: asm{
8 E/ H1 g. I5 u) |7 H2 w/ O! N# e - /* ******************************************************************' D8 |! @0 A% g* v
- * 退出,fs、gs清0,访问系统内存可用: gs[32位,相对于0的偏移地址] *
# h8 c; O6 C( I# \. E0 E5 D - ********************************************************************/7 |+ ?* R2 `0 N7 W, }7 V9 E# {9 r
- mov ax, 09 `. p2 F8 X( Q* K+ M: e9 y
- mov fs, ax9 y7 x, ]2 K X& t% o% h+ W
- mov gs, ax
/ V l" A; w0 @9 w' I6 y - sti
' |+ k5 C! C% V5 o# o2 B - }
" K* Z! B: j. L - }
复制代码 这是asm的- ;/********************************************************************7 S& q0 B. J' M4 f5 N0 c
- ;* File: DOS4G.asm *- u$ C' G$ D" }
- ;* Compile with masm ( Editor: Tab size = 4 ) *
Y5 H: ~# M: W/ _& C/ N - ;* *2 `4 p9 _, D" N" S/ n
- ;* ========================Title=============================== *8 K- }, E& Z. A$ z7 {
- ;* 这个demo是让系统进入DOS 4G模式,进行数据访问 *
" @7 _- Q9 t* _ - ;* *
3 k4 F0 O4 X( }# K% E1 R - ;* ===========================History========================== *
+ D, J* w/ x; l& f- g2 T; r$ U2 ` - ;* author: bini *
, N' o/ Y5 @1 j5 C: s" j - ;* date: 2008-10-08 Frist version. *
# R4 Y( D& s- D. [) R6 ` - ;********************************************************************/
8 K5 P; P1 o6 _" b( W - .model small( Q; n) V. y0 I, b
- .586p
; v. ^" ?5 L: h- J2 T -
3 h1 D0 x, c$ t: |/ W9 f/ g - DSEG SEGMENT USE16 ;16位数据段
( g5 d) a2 X# c
) V6 P6 C; R; n6 N2 e# J$ d! v- DESC STRUC! ^" \9 C' K# ~
- LimitL DW 0 ;段界限(BIT0-15)+ y% o* g) J2 E0 \. l6 X! Q: e
- BaseL DW 0 ;段基地址(BIT0-15)
7 m6 ^/ P7 B& E; E6 ] - BaseM DB 0 ;段基地址(BIT16-23)+ `8 c' Y2 E8 J
- Attributes DB 0 ;段属性
+ ^' @$ ~* y- S) I - LimitH DB 0 ;段界限(BIT16-19)(含段属性的高4位)
+ b' d K' f- L- Z+ Y) w+ {) Y - BaseH DB 0 ;段基地址(BIT24-31)
/ i! n; m! R9 f& k) B - DESC ENDS' k% m) k v5 @1 f; o2 g
- ! K. _3 p1 n4 J
- PDesc STRUC
3 Y# ^& f& @$ \2 c3 R - Limit DW 0 ;16位界限
( P1 }7 N# u: j2 X' M+ A - Base DD 0 ;32位基地址6 z9 B8 N5 n% _; ?5 b- s
- PDesc ENDS8 \3 E/ M/ l! i/ }/ P$ o/ z) E
0 v; } F% r0 B4 |: I- S$ `- GDT_def Label Fword
a2 K" w0 [) ]9 _5 M. a - Null_Desc DESC < 0h, 0h, 00h, 00h, 000h, 0>, }1 [# s) T+ W3 y% ^. j# P4 r
- Data_Desc DESC < 0FFFFh, 0h, 00h, 92h, 08Fh, 0>
?5 V$ @/ e* F& O3 \4 Y) P - _$ L( J2 Z6 P9 L* G0 k. K
- GDT_Addr PDesc <$-GDT_def-1, >; W8 N5 ?1 D/ b) W% g
- DSEG ENDS ;数据段定义结束: N, `" `6 I* U9 ]
: C, n* X {( g! c& F' n v' z7 T/ _/ K" w- CSEG SEGMENT USE16 ;16位代码段/ ]/ L* Q6 ?' K2 z m+ D
- ASSUME CS:CSEG,DS:DSEG
1 j, ~9 a2 F/ V+ h3 Z# N/ C! D - .Startup
& _5 A5 {( ?5 O) b! ~" C - call Set4gb/ j" h% W8 e @# O& A
- ;; U0 H" @# x5 b( ?2 d
- ; fs, gs即能访问4GB空间
4 y( J- B+ v/ T - ; write your code in here.
4 W& y( {% {% W& @" \/ p/ l - ;2 b" Z2 Z: R( a( @
- .exit/ G" @; O Z8 j- R/ X
-
* b( i2 v9 q% n6 [# [1 p9 G - Set4gb PROC NEAR/ S, K2 s( W2 f0 v
- in al, 92h: h2 @6 u- n4 c m) k
- or al, 002
, r9 {1 T. @* S7 Y6 w - out 092h, al
9 n w( R0 t2 G9 |* X - out 0edh, al
. L- |9 v( q- y/ \7 V - . \1 S [2 f. S, Z9 {
- cli k+ J2 X* O; P1 h1 N# r
. S# k7 y+ O6 i5 j+ ^3 ~- y: N6 }- ; mov word ptr GDT_Addr, (2*8-1);7 G' \8 G- e% H6 f i
7 g! \$ O) B( ?6 Y: |# l7 }- mov eax, ds
# j3 s; u" ^- W2 [. K) H - shl eax, 4
1 z ~ ~) m) x' [5 L - xor ebx, ebx
: a$ I9 U" q8 k+ V+ M+ m - mov bx, offset GDT_def
$ A7 J% C! N% f, E% e# Y - add eax, ebx
$ C" u. V/ j8 v - mov dword ptr GDT_Addr.Base, eax
- B6 |$ ]& q& J5 A - lgdt fword ptr GDT_Addr
( ^6 V4 `+ |2 m( G# _ - 1 X8 n/ g+ r" P/ g! n+ `
- mov bx, 8( w% g. v: m4 s6 `! [1 w. i O- ~
- mov eax, cr0
- P6 P: p$ w' J" H# o5 [ - or al, 1
! c, T8 L/ d% V6 }- n) p/ j6 V* ^ - mov cr0, eax
( `2 g. Y+ j& |/ O* a
8 B1 k* h n7 w5 D" V `- jmp pMod# @- X" C3 l- P3 B( v. ?6 P
- pMod:
+ R; L2 k/ D' V - 9 p9 @/ I z7 [" J/ u `
- mov fs, bx- ]/ o( d# X6 O0 b
- mov gs, bx
1 u! y x% U6 T4 C# I$ I1 |5 b - and al, 0FEh4 ]. e& ~6 }0 w
- mov cr0, eax' W; R) T7 s& r; B! K1 f
- % F, l: t7 w1 U) Y& _- \" r
- jmp rMod3 L4 ?( x9 ^2 S/ w: e/ j3 {
- rMod:7 u! k5 v6 F+ U8 j7 j* i2 s' e
8 Z g7 Z; z, j7 _9 k0 U H0 r- mov ax, 0
5 A$ H" g$ Z% _' q- k - mov fs, ax
3 M9 u+ E# M: F7 g& y; W0 S9 { - mov gs, ax! ~! n9 y9 ^3 N/ Y2 S) z( o& z
- . W ?. p: K0 ^+ B; T
- ; 在2M的位置测试写一下数据
# {" r9 t. n$ n& [8 ~& P4 V - mov esi, 200000h' G6 R4 l( Z5 t# t
- mov dword ptr fs:[esi], 055aa55aah
: ^1 K" n L2 v' [0 H( R8 n - ; 用RU去看看200000h的位置是否是此数据....; g3 |) z1 c' ~/ T
- 9 C: u% L) e( t d+ w
- sti
) Y- Z2 V3 ?/ E5 q9 G( {( z! X - ret2 {+ k8 D1 F. |' e8 p
- Set4gb ENDP5 l7 p! K! b2 m* S
- 6 W; S) X2 b7 i: A
- CSEG ENDS ;代码段定义结束. h$ e( |9 W; A+ x5 G' c
- end
复制代码 |
|