|
|
刚学习的同学,有些还不会,我这里贴点C和asm的代码。只供参考。% G% b0 `# g. j
3 [" N) V8 R9 i' |, _
这是C的- /********************************************************************2 ~9 l. }9 W: m# o4 Z4 E
- * File: DOS4G.H *) W+ F% x' ^4 j2 H
- * Compile with BC 3.1 ( Editor: Tab size = 4 ) *! D" `% W1 u9 x# ~
- * *
2 H& R& S( v) M7 j' v- a! `# N; @ - * ========================Title=============================== *8 a9 \* g+ X) ?/ g2 i: b
- * 这个函数是让系统进入DOS 4G模式 *
" a% h& j! M7 i; W; n - * 程序参考了:陈家琪《DOS实方式下直接访问4GB》 *0 r. k; u7 j; H
- * *, s7 s# H$ X: D
- * 使用: openA20(); set4gb(); *% k; c3 ?6 U# ^& ]0 x7 t3 A9 w! @$ \
- * *
9 l' L3 z. p$ G+ f! m! O* ^0 k - * ===========================History========================== *
J+ R6 I+ c& ?8 V - * author: bini *
0 o8 ~4 E4 H# r& j: ]6 W' Q& v [# v* A - * date: 2004-11-30 Frist version. *
* p# a0 B3 c' t+ a$ y - ********************************************************************/
) V: t: N7 y. b5 M7 l! B: j0 L - ( d9 d; n/ I2 O1 ?
- #include <conio.h>* x0 T9 H# w9 F: y+ G: u [7 G" k: @
- #pragma inline
+ A; B Y2 t( F3 x! A* m
; G; h! ~% U" S' c9 M. i- /***********************************************+ |1 O0 U; K/ ~' ~/ C' v) f7 B1 S
- * 两个GDT,第一个为系统使用,不管,默认为0 *2 G+ x' X8 O0 J& K ]3 K. D2 P c
- * 第二个为一个数据段,没有代码段。 *
- [6 G" ~9 H+ d. l+ S - ***********************************************/9 F. r8 J) L" _
- unsigned long GDT_def[ ]={0,0, /*系统使用*/; f3 a- g( P+ Q" x2 S2 k
- 0x0000FFFF, /* hi16bit( 0~15 ) is base low=0,
( r' J2 y# G4 t- t - low16bit( 0~15 ) is limit low=0xFFFF 0 y2 ^: a% [1 u! I
- */
+ @% f3 c5 H7 \8 ]& r/ S5 G: K - 0x008F9200};/* 最低字节为 base( bit 16~23 )
w' r* k% K& r* X - 最高字节为 base( bit 24~31 )
q) m6 P: `7 i: ^0 x - 1 b9 Y" ?# z, l% B8 k
- 属性Attrib = 0x8F92( D- @! v- N8 A( \* ?1 y4 N/ @3 k
-
4 q5 Q5 U6 G# P- n - 属性位Hibyte低四位为 ) {6 M* O& p, r: Y% `7 i
- Limit( 16~19 )=F
( R5 z2 t+ s7 i; b1 g - 属性位Hibyte bit7 为粒度
- e$ p1 S$ d7 [$ e9 p; w) l - (值1=4KB粒度)& l+ `3 ~. `7 _0 W6 d
- 8F & 0x80 = 1
, r2 e& Y0 \3 O# Q" ? -
4 B! D, F- R4 d$ Q& g - 属性位Lowbyte低四位为段类型,值=2) c0 Y" U. d; s* B, W+ c
- 表示为可读/写段7 ~2 j4 o7 ?6 b
- 属性位Hibyte高四位=9,bit3=1表示:6 b% x9 A# V% j4 ^
- 描述符对地址转换是有效的。
$ X* q! h1 o% ~ - bit0=1表示为:& P5 ]6 \9 K2 z0 W) k
- 系统段描述符。而不是门描述符。( B6 U5 J$ ~' D/ j
- % K0 G$ Q1 z% ^2 G, q
- */( Y% n. o$ Q+ P' R$ {$ W. ~+ [9 r
- 2 a" ^$ }9 K# d
- /****************************************
: c d& T: P, q+ N! d9 I( L - * GDTR寄存器, 48bit=6bytes *9 _7 P, `1 K" s5 Z) l$ L# q
- * +-------------------------------+ *' I/ {) g; z0 W. ~8 S* u- M
- * | 32bit基地址 |16bit界限| *) W7 }$ Q, O: k& R+ A
- * +-------------------------------+ *+ g: ]9 e/ j+ t8 i* b5 Y
- ****************************************/7 d6 I. d3 g$ P. W/ \
- unsigned char GDT_Addr[6]={0};
3 Z G: e K8 O/ a6 x
; p6 k$ ~$ O2 ~- /****************$ L2 a$ z, n/ H; ]
- * 打开A20门 *
. M+ ^# |+ g1 ~* y3 ^: O - ****************/
* L/ F% {1 u% {1 j- {8 y9 d( e - void openA20(void)
* b; I; Q- v! \4 h/ K7 S' X - {; A! F; r- H+ B& x
- asm{$ |# o$ C6 n2 ~
- pusha
/ w; H$ L# S9 e) L# z' V _ - in al, 92H6 O0 [; J4 O0 N; W
- or al, 0x02
" W4 ]* U% f! b2 R - out 0x92, al
* H) \# F/ a; I, [) E! o; H7 M - out 0xed, al
Y1 r8 A4 j _5 D. X - popa/ ~- k2 g' K1 a
- }
3 z6 k8 R' y: O- n" Y; B - }3 f$ ]) }7 p- e- Q
- 7 m K6 ?% e! _& j: \' d) v
- /***********************************************7 L k7 n! i% J4 I8 w. r% |0 |
- * 函数功能:进入DOS4G *
; k$ I, j" k+ _% b - * ==================== *: r0 p2 @' |0 e0 V" e* I- A' I
- * *
$ \8 U, i9 h; Z0 \/ q+ W0 } L4 { - * GDT描述符界限计算方式:描述符个数*8-1 *
( d. l* y7 O5 r1 g" o' X2 ` D - * 如: *$ R% P5 g! h5 {
- * mov word ptr GDT_Addr[0], (2*8-1); *, ^4 u' s! w; F" a
- * 表示为 2个GTD *0 I C. z( G( M' R6 o
- * *
! h( w# N" M6 p - * 选择子为所在描述符内的字节偏移。 *
8 }3 S$ }( J, G3 R - * *" n- g4 {* I8 [
- ***********************************************/. k* h$ F4 n$ N; P; N1 w. `
- void set4gb(void)
& D8 s8 H- s |+ q Z9 e - {- W2 r/ H6 ^0 M7 T
- asm{
9 E$ P6 F( ?1 ~ - cli' C: c4 A% E# o/ |
- /****************************************! n6 ^6 a% u7 _
- * GDTR寄存器 *
. d( r+ r8 T f3 v& u5 ~ - * +-------------------------------+ *
% r, ~4 M6 t V1 _7 b; A) y6 w/ | - * | 32bit基地址 |16bit界限| *' @' w4 d$ V8 p! {- ]6 E
- * +-------------------------------+ *, R5 U2 ]1 n8 j4 E
- *****************************************/
4 z7 ]! p T9 q3 Y" t - /*********************
/ {& F, a. O) ~% a2 n# }- e1 l! p - * 得出段界限 *+ X$ ]1 N4 l" M
- *********************/3 Y9 }$ q" P/ ?! f$ e9 [ g4 h/ Q
- mov word ptr GDT_Addr[0], (2*8-1);& Y+ E& a# Y1 L r
- /********************************************
* I6 U4 e6 i. z$ I4 w3 T - * 计算GDT表的32位基地址,存入GDTR *
1 Q9 n' Z& }4 B" }$ d$ z - ********************************************/
! e) Z- T/ s* ^4 @1 | - mov eax, ds
4 w3 u* E8 _. x. C! w6 n$ y - shl eax, 46 M/ G! @1 @7 _
- xor ebx, ebx/ }6 }: f, B! v5 ?& g
- mov bx, offset GDT_def
+ b2 l3 V- v+ l% `$ u - add eax, ebx' B5 M1 A* E: x2 x6 n
- mov dword ptr GDT_Addr[2], eax, v) U7 \& d/ l9 J
- lgdt fword ptr GDT_Addr
+ `, C+ M& V0 H8 E - /********************) q& D: O3 M9 m8 \8 w. O- l
- * 选择子偏移 *
7 p2 R! E1 A* y. Y4 a$ r. g8 B - ********************/3 w# ^* q2 g8 j, \' V8 ~' h. L
- mov bx, 8
D0 R6 W9 X' w# |* ~8 R1 S a - mov eax, cr04 R4 R+ i5 c1 J: c5 S' f0 u
- or al, 1
, J% D/ ~+ z" J L, p, E - /**********************6 o. e0 O( F1 s" M* Y ^+ C1 W4 j+ L
- * 进入保护模式 *# ]( ~4 r' T9 v6 h+ B* U
- **********************/
% C, j, s% u* X2 s1 V" I) B - mov cr0, eax; p, n F( w/ j
- jmp pMod
! m; y R6 P; H, X% e/ Y - }4 l& ^0 h" _+ N
5 \8 Q! ^& w+ f% U- pMod: asm{
& P3 W* [% H( }& r `( r - /************************************************************
+ U8 t( H. {( ~$ e( w6 A/ G* t - * 让fs与gs加载选择子,使其能访问 0xFFFFF * 4K (4GB) 空间 *
' H! `. K+ O; G+ L8 N+ c+ |3 D - ************************************************************/
. ?9 `( f# g* W3 ^3 q! Z* s2 D - mov fs, bx: L/ t" r5 J, t8 F4 q; m
- mov gs, bx( `( K; X) a( E- ~) C9 L4 Z
- and al, 0x0FE. t5 _8 a% p, i, s* M7 U
- /******************5 H, |2 R! ^( w
- * 进入实模式 *8 d4 i# _( V9 h
- ******************/
3 P! n$ @; _/ i6 E - mov cr0, eax
! p1 \3 R& V% y9 K2 D0 f" M - jmp rMod
, A& c4 P P. E( j - }
7 G3 n0 M# b6 O3 X - 7 n& A& H; q( q' p/ n
- rMod: asm{ R% [9 |7 O) h& j& i; H/ y
- /* ******************************************************************1 s- C" I% a' v* P8 z) i
- * 退出,fs、gs清0,访问系统内存可用: gs[32位,相对于0的偏移地址] *
+ O p3 Q% f/ ?' ?8 Y( _8 g. o - ********************************************************************/+ K& O: H; [7 M$ B7 ~
- mov ax, 0* ^3 C3 E: W+ z% w+ P1 \3 d3 v# `
- mov fs, ax4 }5 E9 w& k0 F# h
- mov gs, ax% K- p/ s. S& l5 T
- sti
; t1 |; b# K* Y1 Y! T - }: M7 }. G; ?5 B8 V& o! U
- }
复制代码 这是asm的- ;/********************************************************************
. G: v0 u/ R& ` - ;* File: DOS4G.asm *( G/ g# i* I. |
- ;* Compile with masm ( Editor: Tab size = 4 ) *
1 D& M3 M9 h0 }* E/ u/ {5 E- l - ;* *8 `) f9 D& V. P# {* f& n% }# f& h
- ;* ========================Title=============================== *
$ ?- g9 R2 S5 `" O- i: } - ;* 这个demo是让系统进入DOS 4G模式,进行数据访问 *# s! i/ P2 _6 Q+ ^% P6 r& c! H! u
- ;* *
6 P" q8 G' Q6 H; w - ;* ===========================History========================== *
' m D- ~1 ?3 ~" x- a- } - ;* author: bini *1 ~3 t! K1 V$ M$ B
- ;* date: 2008-10-08 Frist version. *
% o9 W& m9 Q, E$ R+ d - ;********************************************************************/
/ j8 @# X- b0 c8 w - .model small, Q' Z+ W) `; T& K9 P
- .586p
) A9 c9 H' x6 k# ^ - # T a7 [ Y. g4 t4 G M, t
- DSEG SEGMENT USE16 ;16位数据段
8 w* j7 B# f/ h - . _" g( g8 N8 \6 x! w' v+ _, h
- DESC STRUC
# R6 z: k: i( `: e - LimitL DW 0 ;段界限(BIT0-15)
A2 w6 [4 i1 |2 L$ o - BaseL DW 0 ;段基地址(BIT0-15)9 @ Q1 @& W+ V/ x. J1 s
- BaseM DB 0 ;段基地址(BIT16-23)1 h* @' N. B4 j$ K" r! T
- Attributes DB 0 ;段属性
2 ?9 g- N7 A7 A% T9 o - LimitH DB 0 ;段界限(BIT16-19)(含段属性的高4位)
5 b/ x, a0 u9 c( f - BaseH DB 0 ;段基地址(BIT24-31)
2 U8 {+ m. X5 Q9 |+ d9 U - DESC ENDS
2 n! H; K, A8 E: w$ k: M, F) h
0 n9 t& O* T4 p9 `1 a4 t- PDesc STRUC4 P0 J. u2 o- p
- Limit DW 0 ;16位界限$ @5 ~/ A$ D/ j3 c$ K
- Base DD 0 ;32位基地址
$ `4 z6 D5 R0 ]- }( d7 W' P* z z - PDesc ENDS
6 o9 ?/ R" v( j5 S - # Q: y; I% n9 O3 m. m
- GDT_def Label Fword
4 m. H2 q3 \. q8 d C: ?. P! k( @ - Null_Desc DESC < 0h, 0h, 00h, 00h, 000h, 0>
- @- k) i9 |+ a& S2 O - Data_Desc DESC < 0FFFFh, 0h, 00h, 92h, 08Fh, 0>7 c# ~( R [: z8 w" l% D
' C7 N; Y; f* b" O u- GDT_Addr PDesc <$-GDT_def-1, >7 f* m1 a6 _9 P ?
- DSEG ENDS ;数据段定义结束
" H$ r [$ @5 N' i* G
) t0 c! [) ? B' N3 ^- CSEG SEGMENT USE16 ;16位代码段
( Q4 d; O3 y1 P+ x% I( r; v - ASSUME CS:CSEG,DS:DSEG, B0 Y6 C% R2 g1 K
- .Startup$ M o. E9 U+ E6 A
- call Set4gb
* w8 w/ V2 r( e& K - ;
4 Y. n M3 f5 V# _: e" a - ; fs, gs即能访问4GB空间( I0 ?! d$ T( I1 i' Z" q u+ n+ t0 ]
- ; write your code in here.
" F# f- j: _( A5 T7 C4 } - ;& i! p. J4 w; A$ k* M5 c3 B3 e
- .exit5 B. r# k! `, X
-
9 }( Y. e: p( H - Set4gb PROC NEAR
$ B/ _; ]8 T; y - in al, 92h- D% _/ r4 @1 Q" c1 L
- or al, 002
0 J1 U9 w" |' Q( `: O. a: l' d - out 092h, al' V. H$ R4 d2 _- Z; Q) a7 x
- out 0edh, al
" R& U0 J6 w- w& l! N; _ - ' H. z3 `3 e: Z, I. _0 I
- cli
3 m7 s; @1 @, l( [ d
3 B; ~2 k5 c* s' r- ; mov word ptr GDT_Addr, (2*8-1);5 \0 @4 V5 Q5 H9 i4 C. h
- % i- E3 R7 b6 g9 n
- mov eax, ds1 W; L# T8 O# X$ O- s
- shl eax, 4; u3 c/ a! X6 l8 d4 A' b% q4 ]
- xor ebx, ebx
( y* ~& D$ m) k4 Z- ?% a( ` - mov bx, offset GDT_def, B! P' x, d2 O
- add eax, ebx, A) f4 G+ P) Y1 o
- mov dword ptr GDT_Addr.Base, eax
1 |/ Q" ^$ A: N7 ^ - lgdt fword ptr GDT_Addr4 {0 J4 N: V6 @0 b" x/ a8 O8 j
. S6 @* R0 _. Z% i- mov bx, 80 U2 `0 D0 T6 T4 o% \+ }
- mov eax, cr0
. L7 _, L9 d$ D - or al, 1
' B' ?' Q: ~5 R0 j - mov cr0, eax
4 } ^/ l% b/ A% T/ s6 {
& L: L, ^' g/ P" T- w* b" v6 R- @2 J$ w- jmp pMod. k+ ~7 f' T' L1 P1 F
- pMod:
9 d/ I. u7 G* I. W# ^
% s) ~5 K0 F4 n* e3 |/ n- mov fs, bx
; o) C- }. j* Q: J6 o7 g, @ - mov gs, bx% \9 } l' R6 [. z
- and al, 0FEh0 k" c: o* |5 J
- mov cr0, eax+ D! j O( \; K
-
7 N) w2 I% Y! O( z) { - jmp rMod/ U2 y: }6 B# M( o2 \! ^
- rMod:
! q6 X* L* V4 j: _9 j
7 g" y+ Y, O) D- mov ax, 0
3 G+ w2 _/ F# P - mov fs, ax g7 F- r; q. r. q
- mov gs, ax2 f3 h7 h1 n9 O$ L7 e
- 7 _5 D* s, P! {7 P
- ; 在2M的位置测试写一下数据
) M6 a) J) F2 t o - mov esi, 200000h
$ z2 s) @! `9 ~2 a- d - mov dword ptr fs:[esi], 055aa55aah
! _$ ]) v- a( Z6 Q - ; 用RU去看看200000h的位置是否是此数据.... K+ T' W% R0 J2 V5 K* W4 b
- : }2 _4 ~& s! @
- sti
9 _! w: z5 I# a* R' V - ret7 }8 k$ t8 a( v" Z
- Set4gb ENDP
' U5 r7 o) }- \: N5 t' z, W$ A - ) p& O* j9 P* D; t" i
- CSEG ENDS ;代码段定义结束& v' ]9 n/ j4 c0 Q' ]- T) y/ T
- end
复制代码 |
|