|
|
刚学习的同学,有些还不会,我这里贴点C和asm的代码。只供参考。0 z) Y/ \4 Y0 k' W8 k
1 Z/ u& y6 @; _
这是C的- /********************************************************************8 ~4 G) H7 g$ s7 w
- * File: DOS4G.H *8 {. O+ Z3 N U. t/ u
- * Compile with BC 3.1 ( Editor: Tab size = 4 ) *
e" B b. O9 a! P3 Q - * * A4 p, Q# M ~/ f, o: L
- * ========================Title=============================== *
$ O* D7 t2 ]$ {6 @! U: R! s - * 这个函数是让系统进入DOS 4G模式 *
$ T }( T) \9 R7 z( @* E+ x t - * 程序参考了:陈家琪《DOS实方式下直接访问4GB》 *. R& I- F4 ?; b) r: r3 k: n
- * *
6 l3 E. y$ `; X: f9 g2 Q+ ^1 S, c3 l - * 使用: openA20(); set4gb(); *
* q" z$ m; _9 O, ~% O: R- Q - * *
4 }, g4 p: z$ N - * ===========================History========================== *
, D4 W4 u0 w5 F. }/ U' T - * author: bini *
* Q# j, ~* a3 N7 |$ W - * date: 2004-11-30 Frist version. * ^( t7 D% B5 c( r6 x
- ********************************************************************/0 ]3 k; m' r) }. |/ d/ @# V. Y* ^
- 7 S W2 I: o. g! v
- #include <conio.h>8 @, }0 L3 s- ]( `# p, K o
- #pragma inline
1 j- x: c9 @, t- ]/ r( p/ U p
1 C& Y# Y- J, f4 {- /***********************************************
% T: L2 x* T* s$ q - * 两个GDT,第一个为系统使用,不管,默认为0 *
, \+ S7 s0 t$ R, F - * 第二个为一个数据段,没有代码段。 *; D+ l3 l' g1 K' F( Q" r
- ***********************************************/9 ?7 b( R8 p7 D7 ` W/ ~" g# p
- unsigned long GDT_def[ ]={0,0, /*系统使用*/
: G& T8 a. G) k& z; u - 0x0000FFFF, /* hi16bit( 0~15 ) is base low=0, & @ e. H6 E% z3 ~3 c! N
- low16bit( 0~15 ) is limit low=0xFFFF
7 E3 o3 K; J7 R% m& _( z - */9 [+ O2 ^5 |/ z% t4 T- v( o ]
- 0x008F9200};/* 最低字节为 base( bit 16~23 )
. J- I9 e. h7 L% c3 c4 H - 最高字节为 base( bit 24~31 )" p) @* P+ {2 A+ ?$ w0 X5 `
-
5 t" D3 M9 {: X. f. t! \ - 属性Attrib = 0x8F92, ~+ V% f% d) R& U% v9 J, `* x
- ; p% d. c: }9 H, F
- 属性位Hibyte低四位为 $ _' J1 F: V" |; a+ I/ b0 M
- Limit( 16~19 )=F% ?; i' S9 l4 Z' l( Z8 `" S( m0 ^
- 属性位Hibyte bit7 为粒度! B' h* A( w8 i: O
- (值1=4KB粒度): ?( U# U r1 x& M6 n
- 8F & 0x80 = 1 Y& q$ g% C% t9 q
- - j( r. @' B$ x2 C6 g9 R9 z- Q8 U
- 属性位Lowbyte低四位为段类型,值=2( K! F2 N, i2 R! i; s8 u2 W( x8 d
- 表示为可读/写段6 k7 F! U" c0 k/ z% M1 i0 Y
- 属性位Hibyte高四位=9,bit3=1表示:# {% A5 E4 u9 d7 i' u/ w- \
- 描述符对地址转换是有效的。0 v/ q* @) w5 U
- bit0=1表示为:4 T: {! m4 m3 i' N
- 系统段描述符。而不是门描述符。
) a: W# s R7 @ -
0 ~" X" b0 B* Z$ D# d5 S) X6 s& y - */3 _. T/ t5 X- u, n0 g; S6 V' y% J
- ) C9 f" E+ s" G$ O- G+ ~4 V' u( O
- /****************************************
5 C t8 ~1 T- |6 ^ - * GDTR寄存器, 48bit=6bytes *4 q* D( t4 M- K* ?- s5 S
- * +-------------------------------+ *
9 M' l2 B$ w/ T. N; B - * | 32bit基地址 |16bit界限| *
+ V4 R6 k$ k' y) N$ c - * +-------------------------------+ *
+ r5 u/ v) b! o; @/ `( w - ****************************************/
3 w3 @ z- N- A - unsigned char GDT_Addr[6]={0};- b) M \$ W v9 n# B j* }, _
- ' M+ [9 p: r) F- {
- /****************, m; r% J6 w% B6 ^1 v
- * 打开A20门 *
9 W {0 j& f1 G4 i, B1 r7 ^! I - ****************/0 q8 A; F7 H# N
- void openA20(void)$ p/ m8 L+ ?4 B# m5 j
- {- B2 L) W, T' |+ }" ?/ \9 p
- asm{
8 E8 S& d& b: e' @( v - pusha
M' M- q' L3 \7 i - in al, 92H! L1 M: I7 v# _" H( w0 H9 y
- or al, 0x02
$ |. g5 g4 n! T, j, @& L - out 0x92, al
/ L% D5 Z7 l7 g; }+ k - out 0xed, al9 N) \/ \: O! h4 e* Q6 x6 K
- popa- T7 |% b( T: m- R6 s+ [6 l5 f. k
- }
# s% @2 l6 j+ I4 K; D( f9 U- ?/ V - }$ r. p$ y& [1 s* F
- : ^, `( ^/ E6 ~4 r! a( ]
- /***********************************************4 K' O* f2 `: a( { b9 Y
- * 函数功能:进入DOS4G *9 |) W7 A+ o U! J, B
- * ==================== *
* s1 O4 f8 u! }6 O( S7 u8 }$ ~ - * *
" p8 I3 f* R: y3 f2 O$ w - * GDT描述符界限计算方式:描述符个数*8-1 */ d3 n2 X/ q5 x, T+ R/ [& Z/ u
- * 如: *# m! x# Y4 ~1 ^8 |, o' A0 a
- * mov word ptr GDT_Addr[0], (2*8-1); *
8 V. r5 N$ `/ s6 _8 r4 q - * 表示为 2个GTD *
( O p9 [- p: W - * *
% h& H1 }# l2 f' ^& o - * 选择子为所在描述符内的字节偏移。 *
* g0 F: S* _ ?$ w% v$ i - * *
. O1 G! w0 \. x. V7 q - ***********************************************/
+ N3 w5 ^1 q+ `) a: K) } - void set4gb(void)
- G3 @# K8 @4 x5 R. P - {: r3 y; ~/ ^2 s% k! `; m) E
- asm{
7 G) T; S$ ]6 ] - cli1 l/ F& T) E6 N' b
- /**************************************** K+ Z5 h5 W/ O* e* J
- * GDTR寄存器 *6 a7 Y# J, K# f1 e k
- * +-------------------------------+ *$ T: `" O2 z+ Z, ?9 l
- * | 32bit基地址 |16bit界限| *
- P6 G' `& ^5 r2 b {! W - * +-------------------------------+ *
" e5 K! o9 B% j! o& E/ Y( | - *****************************************/! |) P0 F" Z) B! Z2 D2 h1 K
- /*********************. \2 n- c/ P- X, u, j$ Q* S
- * 得出段界限 *
2 ~4 x& C' H# n - *********************/ g3 e/ [* E. X6 O4 p* Z# ?
- mov word ptr GDT_Addr[0], (2*8-1);& \9 [$ J8 P) z+ [
- /********************************************
8 |9 c! X4 d. @0 A8 V - * 计算GDT表的32位基地址,存入GDTR *
6 X' f# C% m- O# Q c t# D' [ - ********************************************/# Q6 } r; R g; u
- mov eax, ds
4 B" I, k# R8 N+ N. {7 H - shl eax, 4
4 L1 n. A+ X4 ^! y% x - xor ebx, ebx
9 Q0 f. k& L7 a - mov bx, offset GDT_def
! a5 @5 a+ D, M - add eax, ebx% `. @/ R1 v3 A$ }2 G9 K
- mov dword ptr GDT_Addr[2], eax
3 F+ w0 c, y& j2 U - lgdt fword ptr GDT_Addr! N3 b. J$ d3 e- Z7 X
- /********************# z3 |- l3 L) [4 |
- * 选择子偏移 *; ~* `: D+ k5 y/ r' n
- ********************/
9 j+ q- f+ \' ~8 m: ^/ Y- S: x1 ` - mov bx, 8
- E$ ]8 M3 e8 Q - mov eax, cr0
0 R+ u9 b F0 k( Z3 w( z# J/ C - or al, 1
2 \7 F( f' B( F% P T+ k - /**********************
- `2 T+ {+ g, \ M7 O | - * 进入保护模式 *
) h+ ]3 b" U( m - **********************/) U; \: S$ r$ V5 V4 q
- mov cr0, eax% h& {. D8 L4 [% Z4 y/ e
- jmp pMod; A( ?! r7 x* i
- }
) h. E- p8 ~; Q3 a8 l
* Z3 K% u/ s& q. R, ?7 ~1 Y- pMod: asm{
. U0 I9 W: A& m' [+ P - /************************************************************# J4 A/ U4 |; u0 n# |/ `
- * 让fs与gs加载选择子,使其能访问 0xFFFFF * 4K (4GB) 空间 *5 R: {! [8 ]# `. p; a
- ************************************************************/
7 a$ i2 |1 H' G+ q# I& | - mov fs, bx
. o" F( R/ d+ q9 v- f - mov gs, bx
4 R" V. G9 p# U" G - and al, 0x0FE
! p4 X! K& p$ | - /******************- c* D1 x- b, J7 O8 s+ L' K
- * 进入实模式 *
1 m1 B6 |( h2 {7 j& h- D - ******************/
# t3 K3 w, a2 u- r3 f6 s - mov cr0, eax' d* u) @- e) J- h$ @
- jmp rMod
* A* w: t" y' [6 ? - }& y* V) o8 @$ |, @; [
- 8 m3 v' X3 ^! ]3 w
- rMod: asm{3 \- d6 r* ~; q- G- X/ E6 P
- /* ******************************************************************& i: Y" ~& J' o# W s# C
- * 退出,fs、gs清0,访问系统内存可用: gs[32位,相对于0的偏移地址] *
4 v$ }5 `& G$ ?: S - ********************************************************************/
7 h7 P/ Y! R3 r: j/ o5 O - mov ax, 0
% k: d; S* H! K4 v. X+ m) y2 e - mov fs, ax, H$ I' M9 ]# V7 ?
- mov gs, ax8 O2 T7 K: ~0 @5 v5 M( m0 h
- sti
9 z( B, R# y9 G. k1 A% a - }6 y" ?0 j+ ~" D" B7 R; g
- }
复制代码 这是asm的- ;/********************************************************************
' L6 u( Y% d: E& O! v( m6 {& A4 Q - ;* File: DOS4G.asm *
' V; N- h* D2 X* {0 n - ;* Compile with masm ( Editor: Tab size = 4 ) *
; `5 d% f* w* a/ d; @7 F - ;* *
2 ^! p6 ]$ j u2 V7 _ - ;* ========================Title=============================== *5 n4 y2 c6 L! w3 A
- ;* 这个demo是让系统进入DOS 4G模式,进行数据访问 *& M6 s! Q$ N4 h- `% ]* S1 F
- ;* *& }" h m6 V# }/ u/ A& \
- ;* ===========================History========================== *
: K* B7 f& `8 U- D- l - ;* author: bini */ Z2 F' P- r, l& ?1 i$ n% d6 Q
- ;* date: 2008-10-08 Frist version. *
1 }, ^0 a% t) A' s9 v# U6 P2 P0 Q - ;********************************************************************/
" B8 r- m$ H) R- N l4 j2 _ - .model small
( f6 w& j' q6 r+ N1 Q4 g3 `9 g - .586p* _. |9 t: i/ E. E1 q
- - ~: B2 a/ C: F. s1 O& p
- DSEG SEGMENT USE16 ;16位数据段" D$ e' y5 a( n1 i
% X+ S# s: g, c- DESC STRUC
# p4 e) I5 R) F; z8 v5 Q6 q4 R - LimitL DW 0 ;段界限(BIT0-15)
! h) o1 E5 r& Z* q* F4 [+ n - BaseL DW 0 ;段基地址(BIT0-15)% C- N2 q& J4 ^ q* \6 p
- BaseM DB 0 ;段基地址(BIT16-23)
- N m! p& w8 y9 ^8 M - Attributes DB 0 ;段属性2 u& v+ {1 g. o" B% i/ @0 a" U
- LimitH DB 0 ;段界限(BIT16-19)(含段属性的高4位)
u) H+ b9 e8 L - BaseH DB 0 ;段基地址(BIT24-31)
+ p3 z! L" Q- I) X: L - DESC ENDS; N, x$ c" O( y6 [+ h
3 e. n- J2 j% @8 k# n6 N- PDesc STRUC2 Y3 \ P, s" m! a8 X3 n
- Limit DW 0 ;16位界限% N- o& Q, [( U+ y6 O' R
- Base DD 0 ;32位基地址
: }$ `2 v9 q/ e) } - PDesc ENDS
2 V& X6 z0 V, V0 ?* H" h# T
% n' Z! _% c5 Q* r- GDT_def Label Fword
* {6 }1 m4 R9 h4 ]2 u1 o6 p - Null_Desc DESC < 0h, 0h, 00h, 00h, 000h, 0>3 I, z. [1 R( t% J
- Data_Desc DESC < 0FFFFh, 0h, 00h, 92h, 08Fh, 0>/ w' @( t$ F0 f7 m! R( t
- 9 K0 D% H, |6 u' D9 y- e
- GDT_Addr PDesc <$-GDT_def-1, >
/ L& `# N# A! J - DSEG ENDS ;数据段定义结束
1 R% N4 `6 i( o; p$ z - 3 V7 A/ i3 X* g$ B6 Z
- CSEG SEGMENT USE16 ;16位代码段+ @5 D! A% u: y6 S1 y: D
- ASSUME CS:CSEG,DS:DSEG9 M* ?& K: L J; \. z: _, e! \5 v
- .Startup
, h* p7 U3 a4 L* m - call Set4gb5 q3 R ^0 a) C; ^: K, q
- ;3 h7 ^% S+ {0 |& I4 f
- ; fs, gs即能访问4GB空间2 y/ }2 I4 G. ?
- ; write your code in here." X1 m V) V$ C3 p E( w- y
- ;2 \$ Q s) u) F8 D: C) T" N o) h+ \
- .exit
! P4 V% G/ |: f) S3 b. r7 f% i - 6 C8 F5 }; D# p7 t9 a
- Set4gb PROC NEAR
8 O6 n2 |( C/ {6 Z# y9 ?4 c$ O - in al, 92h
, w9 ^$ C6 s: ?5 a5 V - or al, 002
9 U/ G# C* o4 e* h' N - out 092h, al
' I& J( G/ }, ]1 j9 D5 P - out 0edh, al
/ B# F0 p: O4 r1 Q) w0 \
3 Z4 V/ {# O0 i! C8 F& x- cli
) n8 s$ C1 x- e$ N, Y
1 F: @! q/ C* _/ U- ; mov word ptr GDT_Addr, (2*8-1);
; O* B+ A! g6 T( p& K - 8 E( J3 j. e* l f- T
- mov eax, ds9 s3 T( _9 N( @, N+ `$ L
- shl eax, 4
% I* U6 c( A; R) `' {2 u# A( \0 x - xor ebx, ebx* w5 \1 n8 d e! J
- mov bx, offset GDT_def: n5 O1 e; r) g5 O$ S& T# I
- add eax, ebx6 j H7 H- T G D' }. v) ~
- mov dword ptr GDT_Addr.Base, eax
- h. N2 I& C2 [+ Q: V+ H8 A p - lgdt fword ptr GDT_Addr
- c% J4 }! R4 W7 O- B - ( t/ C; g* j0 R( N# B
- mov bx, 8+ `- z8 [/ Z: U: b4 Q
- mov eax, cr0
6 X/ Q7 Y+ j3 K- i+ ~9 `9 w* D. E - or al, 1- k. i. e3 d q1 W$ E. {; [5 Q
- mov cr0, eax
! E7 N6 @( T' v - 8 [+ G$ X2 l7 c$ P7 K
- jmp pMod* ^9 n. ]9 K4 T/ }
- pMod:
R4 [5 D# d! `: ]
" S+ O2 Z% [$ b0 h* c) ^: T- mov fs, bx, P4 m2 w, D2 o5 F
- mov gs, bx$ N; N' o& R* s
- and al, 0FEh
* `! g/ y5 G8 I - mov cr0, eax
0 s i: k3 P) q4 R d( T# d -
8 J- A9 }! W9 ^8 I" g1 `0 U2 } - jmp rMod0 U$ z; [8 ?0 |. R" T4 ]5 G
- rMod:$ p3 j9 H! s# e# [8 n
- / ^, U& t& I# {" q" T0 f# p
- mov ax, 0
$ X9 ?, r) ^9 n2 v - mov fs, ax
1 r* x1 }$ k1 S0 P6 A$ O t. [ - mov gs, ax
1 E- Z$ t& b5 W7 r% V0 H/ {" N' B -
6 C) T8 R' A6 a" x- T" j+ _ - ; 在2M的位置测试写一下数据8 l2 A# s& {$ W/ }
- mov esi, 200000h
6 A' D8 j9 H! X8 i - mov dword ptr fs:[esi], 055aa55aah! T9 _4 b- M" g) F: o, A
- ; 用RU去看看200000h的位置是否是此数据....+ i$ {* h7 J* s F
, J' ^! H8 Q( T+ l$ |' @- sti3 \8 `& B6 N, ~( l; h
- ret
! G$ D1 J1 o2 a3 |& F - Set4gb ENDP/ S: B1 z( P1 N$ S) r, z& V" m
-
! N! Q, o5 b( Y% P: {' l6 u - CSEG ENDS ;代码段定义结束7 _1 W8 }- m5 u2 }
- end
复制代码 |
|