|
|
刚学习的同学,有些还不会,我这里贴点C和asm的代码。只供参考。
; O: M( }; S2 ^, X& v: Q. m
# s3 j' |7 G+ k) O这是C的- /********************************************************************
# Y* K# u8 d% q3 |8 y' n - * File: DOS4G.H *
" ^+ @0 S, T% R7 Q! e; m% n/ w - * Compile with BC 3.1 ( Editor: Tab size = 4 ) *9 l- k* v8 ?7 U9 @ G& _/ q
- * *- Y- B5 O( u. C! w: y7 w+ r, D, n! X
- * ========================Title=============================== *% T# ^8 {9 a. s4 m5 j0 t. w
- * 这个函数是让系统进入DOS 4G模式 *8 E# N: p. Q: Y: F
- * 程序参考了:陈家琪《DOS实方式下直接访问4GB》 *
# t- k) X- k, z8 c! `( {4 t7 P7 X& \ - * *$ t4 V5 B2 Y( v# x5 p6 J; j7 {, Y; O+ Z
- * 使用: openA20(); set4gb(); *& G6 J" e( d+ Q( p2 b0 V
- * *) F4 N' y- ?% I$ [9 ~
- * ===========================History========================== *
# s8 A. S; l7 @/ D8 m - * author: bini *
& T: m1 w- W. V4 H - * date: 2004-11-30 Frist version. *
% B) ?( y6 o+ h$ c$ D - ********************************************************************/
5 X" R' O: k. L4 N \7 E - $ G* L( c8 m* V" R4 z- T0 y( r# L
- #include <conio.h>' G6 F* y9 X4 k# Y" h/ @7 ~
- #pragma inline. l3 h% i; N/ ]0 K, S* n/ S. e
1 j" _5 q6 Z( E0 B; A7 J8 r# `. y9 W- /***********************************************
5 Q" l3 g" C" {5 Z; y - * 两个GDT,第一个为系统使用,不管,默认为0 *
6 F5 a$ T2 D2 d2 Q; m - * 第二个为一个数据段,没有代码段。 *. e0 c3 k7 }8 S2 M- D
- ***********************************************/
+ _& r7 l; e+ X4 O- h3 q/ |3 V - unsigned long GDT_def[ ]={0,0, /*系统使用*/
4 b5 B6 ~# P; g j( c - 0x0000FFFF, /* hi16bit( 0~15 ) is base low=0, & ]# @4 L, f p7 w
- low16bit( 0~15 ) is limit low=0xFFFF
7 ~' {/ ?5 `, p3 k - */) }4 Y# @4 w6 K7 L6 J, m
- 0x008F9200};/* 最低字节为 base( bit 16~23 )
0 t3 r3 z: T3 N! h* {' e _- s/ B: i - 最高字节为 base( bit 24~31 )' c4 F. E/ a9 E- k8 F
-
C$ c+ _* ]! B: ~7 ^8 b - 属性Attrib = 0x8F92
8 |! b2 v8 i. l$ F - ( f% x/ h9 j. x$ z8 M
- 属性位Hibyte低四位为
W5 O3 h- z3 F* |* R: x b6 N - Limit( 16~19 )=F/ v1 I4 [4 p u+ T" Q2 q
- 属性位Hibyte bit7 为粒度, E4 E; G4 y4 v! l, G1 t' W/ x
- (值1=4KB粒度)
, Q5 N- E8 I N; w& ^! B$ F$ V - 8F & 0x80 = 15 x( l0 A, l& V7 q c
- 9 K0 O$ K0 A( V" a2 C4 v2 a& h5 A
- 属性位Lowbyte低四位为段类型,值=23 V6 B H9 y$ E; B3 [6 W" @9 D
- 表示为可读/写段6 i. Y8 M+ b& n4 E1 ?" z7 r
- 属性位Hibyte高四位=9,bit3=1表示:
3 J- d/ F1 F2 y5 @: H - 描述符对地址转换是有效的。7 t! E! \4 U: V* m: F8 k% P! ~
- bit0=1表示为:
: E, g- b2 D6 C - 系统段描述符。而不是门描述符。1 m. S% p4 Y6 v8 v9 l8 t) O
- % w/ q2 l3 C5 I' d
- */
* c* _0 m2 W( W3 _- l
$ u5 V1 i1 O' w5 Y# W, V- /****************************************
( p6 l" C% n# ~8 t6 f - * GDTR寄存器, 48bit=6bytes * h( x0 O# Z' j* A% a
- * +-------------------------------+ *# q4 A0 ^/ f, F* s2 v- G
- * | 32bit基地址 |16bit界限| *+ f% g( c' a7 e6 F4 V
- * +-------------------------------+ *. Z$ M* g% N, t% W5 j H
- ****************************************/3 a7 T9 P' P' l' r7 X9 J; [
- unsigned char GDT_Addr[6]={0};% e3 W0 I+ ^2 S+ ~- w- ]$ r
- 1 |/ N( a% G3 c+ e7 T6 T4 X
- /****************
; N- N+ ]3 t3 n; U$ s( d - * 打开A20门 *
( U- [# I7 D* Y+ l$ ] X - ****************/$ L2 J% f. T* h
- void openA20(void)( ` F/ t8 K9 T7 ?2 d# t# ^, H, v
- {
; p0 W: ]( h5 [ - asm{7 @" |, m# O8 j* d# q
- pusha
# ^; k& c* m. F0 f* t7 K9 v - in al, 92H
& Q) ^1 H1 F _" O9 w - or al, 0x02
& f- G+ {% @" ^ n% p2 ^- j( `# l& [0 } - out 0x92, al
% H: b- C+ m1 _4 m1 b& H0 m - out 0xed, al3 _/ {- K, d: C( Y5 [! o
- popa
/ K' s0 E0 o: q7 v- @* m; S - }
. {$ z% t4 A$ W. h+ {; s - }% U) ^9 H5 n5 h6 F1 k' c* h
2 S3 A9 r' d# x& e- /***********************************************
0 N: h5 i9 U1 h/ Q - * 函数功能:进入DOS4G *
' d' y5 |; M1 p3 H! ?+ |/ E - * ==================== *
7 S3 ?% H$ H* I; {" k+ h; k - * *
) |- Y* L+ Q5 h - * GDT描述符界限计算方式:描述符个数*8-1 *
4 I2 J' @5 e7 o$ T5 y; d, |! `( M3 o - * 如: *
6 N( t W2 y. ]2 i6 H - * mov word ptr GDT_Addr[0], (2*8-1); *4 w( W0 A" k5 w4 d' d" o( @
- * 表示为 2个GTD *) q: z$ Z( G' w& X; ~+ Q) t
- * *5 f2 m6 Y$ e# {# w" m; A# [
- * 选择子为所在描述符内的字节偏移。 *
" {8 e/ {1 f* c d3 ` - * *
* ~, Z: O+ e. Q3 | - ***********************************************/
8 T3 m6 z7 D" k$ l+ g% K7 H C - void set4gb(void)
! D; B5 A1 j# n - {9 e+ z0 s7 z2 k, p7 z8 x
- asm{
; i# L M3 l2 b6 m/ L0 Q - cli
( N; ]* J1 ~& Q9 F- a - /****************************************! b7 z/ R& Q- |, S# R
- * GDTR寄存器 ** a9 a5 l3 P A2 v7 d; o+ z
- * +-------------------------------+ *
0 H: L7 z2 K( E0 p' ~4 z - * | 32bit基地址 |16bit界限| *$ z- \5 P/ x. P9 _: m, f/ C8 ?
- * +-------------------------------+ *& f2 G1 s5 m) w b E
- *****************************************/
0 F) Q$ v* n2 P1 `. H- @# q9 m - /*********************( e5 S- t$ h; b& k J
- * 得出段界限 *6 f# O" r2 m# M8 d$ ]
- *********************/8 A/ e9 f: C. q4 u+ N
- mov word ptr GDT_Addr[0], (2*8-1);5 @& Z/ \2 b9 O
- /********************************************
" z4 j/ ~- z( x# l2 Z9 G - * 计算GDT表的32位基地址,存入GDTR *$ o7 W }5 W4 p5 h" o+ T2 Y; [
- ********************************************// Q0 ]/ Y. |6 B, W( \" S- l) y
- mov eax, ds4 e0 i2 h; `. T6 Z3 m
- shl eax, 40 L* A% Z* q8 {# z" J8 M3 z8 @
- xor ebx, ebx
+ a* T# j- Z7 w, k1 f6 {9 ]& V - mov bx, offset GDT_def
6 [2 J# Z9 i# M1 \! U- e* ^5 w - add eax, ebx) A8 z- o$ s, x7 u7 w
- mov dword ptr GDT_Addr[2], eax% Q' h* L9 _: l. ^" U
- lgdt fword ptr GDT_Addr. d0 q: m5 f* m2 r
- /********************- J4 w- U! E2 o/ n: W* i& |
- * 选择子偏移 *) U3 }( Z9 f! _8 g" |' N0 W; Z8 @
- ********************/' B9 P" B( S) X
- mov bx, 8! i# _1 d1 `3 ~6 d8 C: H5 C
- mov eax, cr03 Z5 K, c* z& h; g6 ?! d* J8 ?; c
- or al, 1; ]; h8 _ ~# J. S+ d6 Z6 p
- /**********************
$ c! o7 U" |# Z5 b1 L5 N - * 进入保护模式 *
# ?: n6 h" b; g$ ]+ [- l - **********************/0 W; b9 w) e; r3 U: P! o% W' m
- mov cr0, eax
: j! c( e v$ n* E5 l& E l) ?* U - jmp pMod
! d. u, B+ c6 v - }
2 T; J2 T* M% q h1 F
3 \. P! ^& O3 k" z1 S" U2 u0 Q- pMod: asm{
- G5 e1 S5 v. K$ |4 l) | - /************************************************************
" r) h! }( U3 `3 V$ n - * 让fs与gs加载选择子,使其能访问 0xFFFFF * 4K (4GB) 空间 *- f/ v/ M* u. E! t6 u
- ************************************************************/
: {- M- B3 r3 D$ B* Z4 \6 O/ n - mov fs, bx
1 W$ S! k/ @! o' n# p" j* i - mov gs, bx
+ | |3 c: i. ~ - and al, 0x0FE
) b. U; G% A9 u) n, B! A) u - /******************
7 G5 Z- F7 Z5 l- V - * 进入实模式 *: i" [1 h' g4 l
- ******************/" c2 R5 W# X. W
- mov cr0, eax2 p" Y, l% e+ m9 Y+ P3 i& J& V
- jmp rMod; E$ t2 K, b: x0 g! }
- }
; j. d& ~- }. k; t8 k+ T/ I - - U6 I* R: w2 [* d+ V# s
- rMod: asm{
5 F( i( H `# l- y - /* ******************************************************************" ?* q" V& i* }
- * 退出,fs、gs清0,访问系统内存可用: gs[32位,相对于0的偏移地址] *
: r) D1 Y# U; n9 H X7 u - ********************************************************************/( K8 F- P; ^* f
- mov ax, 0
( ?+ W8 V8 A! W" T" A/ N: _. Y2 y) A - mov fs, ax
3 ] A( @. \4 p* D/ T& X6 C4 b: B r - mov gs, ax" ^/ V9 M6 {* ~) U# L* y! c
- sti
; p6 q ?0 [/ p" F. z - }
5 O7 g( Z/ S- C) L" j; G - }
复制代码 这是asm的- ;/********************************************************************1 R4 d% t7 K8 C: R) R+ r
- ;* File: DOS4G.asm *8 V ?4 f7 ]# a. L
- ;* Compile with masm ( Editor: Tab size = 4 ) *" F* @& V/ d/ W; S7 _2 |
- ;* *2 \. b& ~" |+ D# |8 [) h
- ;* ========================Title=============================== * _) T7 }7 q' E" W* a. G: l
- ;* 这个demo是让系统进入DOS 4G模式,进行数据访问 *! B2 h. t! e' W, ]7 W4 u
- ;* *& c! C3 F6 N7 h* B" i y
- ;* ===========================History========================== *7 v0 l: r- ~" y$ h
- ;* author: bini *, B3 M# |* c& F6 o
- ;* date: 2008-10-08 Frist version. *: ?9 x% J0 T$ B( s
- ;********************************************************************/ ; L- v7 M }0 u
- .model small
. z' l$ U1 c% Q) _( ] - .586p# `. m' P# [( u/ q# U6 _
- 9 w* P5 r4 }9 Y/ j7 c% X& r# v* }
- DSEG SEGMENT USE16 ;16位数据段
( Q5 R @0 c2 W; T$ t: w& T - : O: ^; i* K# }- `! t* t
- DESC STRUC
1 u! A1 O7 R6 T z - LimitL DW 0 ;段界限(BIT0-15)$ j% `. B6 N. M
- BaseL DW 0 ;段基地址(BIT0-15)
0 \( U* q) A! V7 N( Z$ Z r+ z - BaseM DB 0 ;段基地址(BIT16-23)
( U* i- \$ J9 O. d. D2 @, s - Attributes DB 0 ;段属性
4 z% j: n# F, x7 y - LimitH DB 0 ;段界限(BIT16-19)(含段属性的高4位)
3 Y+ `6 |+ h$ X$ j$ W# H - BaseH DB 0 ;段基地址(BIT24-31)
* v: Z, S& H6 \6 D5 @" I5 D - DESC ENDS7 m) b1 N" D1 K/ G4 {
0 X3 V; J' N; s$ G; |- PDesc STRUC( S ^& j6 X3 _2 z& O3 P+ W
- Limit DW 0 ;16位界限
o4 f- l0 n0 x9 M! c - Base DD 0 ;32位基地址: d7 W; O# e, }+ J" d! i: v- Q
- PDesc ENDS
# `/ `( }6 v& H# u! W/ t2 e - ; K: @$ g% u* a4 B, v' q
- GDT_def Label Fword2 R! Y h. F$ q7 Y+ \. L$ @* n7 r
- Null_Desc DESC < 0h, 0h, 00h, 00h, 000h, 0>
4 V7 C4 N( @, Q! f" L, a4 n! P - Data_Desc DESC < 0FFFFh, 0h, 00h, 92h, 08Fh, 0>3 ^% C1 Z: p/ s+ Z* p6 v5 V
2 Z% P* ^- \- q/ b: `- GDT_Addr PDesc <$-GDT_def-1, >7 B5 o, U' g0 R3 x3 Y
- DSEG ENDS ;数据段定义结束 I' s( t' k: h/ {) m) E
- $ a% a+ e; x3 _; C3 F* |, ^* ~
- CSEG SEGMENT USE16 ;16位代码段 y# p7 g* a; p
- ASSUME CS:CSEG,DS:DSEG; G( {% u1 `" j0 u" Q
- .Startup3 ?+ R# f: X! m6 \% u1 g( r
- call Set4gb
( R# }. F' T7 w R. k, W - ;) F* b, R: S" H7 h$ J3 o+ ?
- ; fs, gs即能访问4GB空间
* ?+ f% Z; _# o+ `4 _ - ; write your code in here.. _* j2 \( o7 L9 W& e1 t
- ;' Y* T( s" w4 k, W2 L
- .exit
# f, n2 Y/ h+ P1 ?* i/ ~ - & g7 `( ]6 G1 Z7 u3 m
- Set4gb PROC NEAR2 ~! x+ c, |0 d. C T0 f
- in al, 92h
* B. X7 K) E1 y1 @! n1 T; v- U - or al, 002
1 ?' z, q1 M, Q - out 092h, al1 L1 z2 K) N7 }! K+ q" Y
- out 0edh, al; a3 Y0 r* [% @% Y
- 4 P, g4 b! T2 X4 s7 ?
- cli
8 t4 I2 c$ {5 i; b0 G
$ i8 n+ z: r8 v! A0 L- G- a4 m- ; mov word ptr GDT_Addr, (2*8-1);4 X% r+ V' P# R( M T+ n
% @$ M3 y0 C# y' m5 h- mov eax, ds( r: w+ N5 @9 ^4 }. X2 R+ h
- shl eax, 4% e$ o: T% F3 G2 |" {8 @: j
- xor ebx, ebx2 P K! y! n/ e1 x( W2 S
- mov bx, offset GDT_def- U8 ^) p7 @. U. G( n
- add eax, ebx
9 k' d2 [" }1 K; o" `2 f, ^ - mov dword ptr GDT_Addr.Base, eax: a3 T3 U+ }7 V4 T- { ]- B a! d
- lgdt fword ptr GDT_Addr* R' T& l, V& Y; U9 v6 I
- - Y$ v$ R/ q, {* ?( y* j! D4 C4 [
- mov bx, 8* ]$ T/ U4 O, c
- mov eax, cr0
4 \% K3 i& h& \6 Y - or al, 1
$ x- R" Q/ P u9 w/ P - mov cr0, eax: \# F: p' A* P: Z" B
6 S9 V4 ~" \+ P6 E9 c- jmp pMod
2 |* u# j8 t9 O, r, }, ` - pMod:% {0 B+ m$ `/ W" t7 D
- y1 G1 x; o* [5 r) k: Z9 y3 ~
- mov fs, bx3 x& H+ e) T7 t5 H! c: P# c
- mov gs, bx
, A2 f0 ?# N& N6 O$ E - and al, 0FEh
3 `* @% R3 n; y, J% K& d; i# j8 e" ~ - mov cr0, eax% n6 S% w0 b3 H `0 p
-
7 v1 m) Q/ ?; Y. Q S& q - jmp rMod
/ ]) P- K$ \4 v8 K6 X! J6 v - rMod: `2 n0 b) \" D9 j* n
. _7 I6 f. J6 f( m; \$ C, S9 r- mov ax, 0
& P' u9 I* a( H. D - mov fs, ax( k- v8 J, w9 H/ C! d
- mov gs, ax
/ o- [5 {4 o5 E/ N2 `6 b -
: g. q1 w7 i8 q, @+ S, C - ; 在2M的位置测试写一下数据# H' L3 [8 s3 Z2 X9 y/ g
- mov esi, 200000h
% A+ b: U$ F2 d3 P H - mov dword ptr fs:[esi], 055aa55aah
$ K1 A% u- [ r) w% K7 N6 _5 X - ; 用RU去看看200000h的位置是否是此数据....
: d3 a3 F; u, X$ ? - 6 k2 K, E" Y. g
- sti0 u0 U$ H6 M: |5 q9 @& r( h: H
- ret( a/ e( \9 R. C5 u V% | a: Q
- Set4gb ENDP
* e& b0 j) M8 C+ {6 M - 7 o9 ?- B, Q7 a" Y7 P
- CSEG ENDS ;代码段定义结束$ n# i# V( }. j& S
- end
复制代码 |
|