|
|
刚学习的同学,有些还不会,我这里贴点C和asm的代码。只供参考。
! \" {8 @) |5 U4 a5 k+ Y! O1 R; M; a# E# U+ [8 X
这是C的- /********************************************************************$ w% S/ Q7 z' s4 _$ y
- * File: DOS4G.H *
0 z: k9 @- V: t) ^; ~6 c* J- n. ~ - * Compile with BC 3.1 ( Editor: Tab size = 4 ) *6 d" H7 d& L9 i% ]5 F1 j% O
- * *! m; A' e9 d2 [2 O( ^% Q
- * ========================Title=============================== *
& f9 `0 S7 q( \, ]+ Z - * 这个函数是让系统进入DOS 4G模式 *
$ \/ u: v5 O! K7 n - * 程序参考了:陈家琪《DOS实方式下直接访问4GB》 *9 |$ g' g r1 d
- * *
# ~% i/ Q6 [7 U; s& r8 B - * 使用: openA20(); set4gb(); *
' ]5 t+ v, j! g( V - * *
) H( o- l6 ^0 d& j5 \' O+ ~ - * ===========================History========================== */ O9 \" i3 I5 x$ O
- * author: bini *, h* i1 |! k4 \& T% B
- * date: 2004-11-30 Frist version. *" R. \9 e6 p X9 g2 l1 m$ q/ q6 r
- ********************************************************************/4 T, V: s {3 ]& {% U' D
- : N4 m. S) Q( T) |
- #include <conio.h>
7 Q" j& P& v/ s, o. x5 {; H, W' E - #pragma inline
0 _8 G2 ?& }5 n0 c/ B
6 ?) i5 m3 n8 W+ e- /***********************************************
( H7 F' j: Z4 q - * 两个GDT,第一个为系统使用,不管,默认为0 *
) _3 r! w# l" D' `6 O - * 第二个为一个数据段,没有代码段。 *
% ]# t5 ^% K/ } K0 _- i0 Z - ***********************************************/- E* v; j# n: k- {5 K
- unsigned long GDT_def[ ]={0,0, /*系统使用*/
" y& B. v! U! H3 j - 0x0000FFFF, /* hi16bit( 0~15 ) is base low=0,
/ E- g7 \" e$ U, E - low16bit( 0~15 ) is limit low=0xFFFF
2 Y' J0 \8 a6 k - */- ?( Z$ g3 C5 a
- 0x008F9200};/* 最低字节为 base( bit 16~23 )7 r! y/ c0 e5 d/ h- {9 \$ ^
- 最高字节为 base( bit 24~31 )8 z+ b( M* U/ i% q
- 3 j; i& b+ a) e1 d5 ]5 }
- 属性Attrib = 0x8F920 ^* _; x6 J% w% v' w) {
- 9 n! S6 O4 \/ v R M& o
- 属性位Hibyte低四位为 2 j6 Z+ b! }, x
- Limit( 16~19 )=F
* F3 {/ L. n F5 y% ]4 E - 属性位Hibyte bit7 为粒度' r) W3 V( N, z, h2 k
- (值1=4KB粒度)
% @2 ]- o' J! t4 N- } - 8F & 0x80 = 16 s2 `* l) P( b; @
-
2 v% L+ E. p' c3 a/ j% R - 属性位Lowbyte低四位为段类型,值=25 R, X7 h! N/ h* e
- 表示为可读/写段7 x8 {1 f) T$ z y
- 属性位Hibyte高四位=9,bit3=1表示:$ v( c( V% G* @/ s' ?
- 描述符对地址转换是有效的。
4 m* W/ D3 S0 ^5 u - bit0=1表示为:) o% ~2 L. X% x0 [2 V
- 系统段描述符。而不是门描述符。$ s8 J7 U! k0 j z4 H8 y2 n, z
-
6 i- @5 r* D& `7 S- u$ z0 b% ^ - */" D2 b8 m1 F% z9 v
% V u0 j3 y# k2 o9 ^: X/ i; y( L2 ^- /****************************************+ x& S5 x: ?/ S2 y% n' u; h5 ?- m
- * GDTR寄存器, 48bit=6bytes *8 Y1 E. T. L6 t. N' [. i
- * +-------------------------------+ *
0 }# f' o: G0 s* g2 v" [) ~ - * | 32bit基地址 |16bit界限| *
2 o- f" |! p0 W3 Q- k0 K0 h - * +-------------------------------+ *
( f% X& O# E2 p1 P2 I# H - ****************************************/
K# f7 k) S _9 p- d# F1 P) D - unsigned char GDT_Addr[6]={0};* J2 k1 o$ s0 F9 z
- & r* \( M& ], O7 K3 h
- /****************
~, l7 ^+ a* \: f. m - * 打开A20门 *
; ^$ c T' R3 o# m% B6 }5 m - ****************/; T* {* D' q( \4 I% r" ?3 j
- void openA20(void)2 t& k, h; g1 _7 r- j
- {/ P* k% R7 A0 r3 [+ `; Z4 g
- asm{* U9 k' ^0 G7 o: a l- Y
- pusha
* w3 Y2 F \3 k5 g5 \ B: \8 m+ L - in al, 92H
8 {1 M+ F, X; r! q4 C - or al, 0x027 X5 ^ x/ ^5 h: q/ |/ @
- out 0x92, al
; p* e$ @) p4 R - out 0xed, al. |( i$ h* C- k
- popa# e5 N; U( I1 c" A
- }# n3 l/ V8 { R# d( D5 X8 J
- }
, d2 y2 n+ E' {/ p: i - 0 g! w7 J: z) l3 i8 I- o& Z- z: z
- /***********************************************' Y* i w* B7 K/ k# z% w
- * 函数功能:进入DOS4G *" |5 {$ O7 Z% Z j" W# p
- * ==================== *
x# {# n/ ]- G5 p - * *
0 M" U ]$ v# u7 X5 n0 {5 k - * GDT描述符界限计算方式:描述符个数*8-1 *5 Y/ o3 ]- B& H: ?. @7 y# r
- * 如: *
" ] Y$ n9 L9 ?! \9 @9 G0 ]7 D - * mov word ptr GDT_Addr[0], (2*8-1); *
. Z( e1 D" a4 p# q ]5 ?' }% u4 D - * 表示为 2个GTD * J, P* @* I% R5 X! U4 j# q
- * *
3 u9 {- p0 y$ s8 |1 z - * 选择子为所在描述符内的字节偏移。 *
. Y$ V5 k, t/ m$ e7 ~& T% `2 B2 O9 f - * *
" P& J6 L0 a8 h' k! ]/ b - ***********************************************/2 \: ~$ w4 F6 w# K' r
- void set4gb(void)
3 W/ f. i- ~% N) R: S5 B - {0 N7 p' ~+ c1 J$ F3 x
- asm{3 w0 }( H0 K5 e- R+ k0 m: q2 q2 n
- cli
2 I* }6 q& r* I+ P5 e+ v7 E - /****************************************, \; l# {9 b' s( M; @; K0 \
- * GDTR寄存器 *% f- n* l1 E1 G+ x
- * +-------------------------------+ *
& |, P. X; y B/ W! e/ O8 L) l - * | 32bit基地址 |16bit界限| *
5 C, E, G+ ^/ `7 q( e1 P" B. S - * +-------------------------------+ *
' G) u0 g( o7 e# ]" d |$ R4 ] - *****************************************/
6 j- A; Q; h! |; l. p- G# ?% ` - /*********************6 | _" ~% H/ z9 D! P3 x' l" l
- * 得出段界限 *
* f9 f" u; I+ _6 G' e$ a: ~8 c- R - *********************/3 }4 o9 k9 @5 M' U% C; Z' o4 `
- mov word ptr GDT_Addr[0], (2*8-1);! ~% `. Y" @) Z4 A, h
- /********************************************+ W4 P. P1 I8 E( x
- * 计算GDT表的32位基地址,存入GDTR *
6 r+ C$ O& D. H% N$ W - ********************************************/0 `2 F& N# b7 o- ^. h. l
- mov eax, ds
7 p7 Y2 c& g0 T# ^' C - shl eax, 4& ~* Y% e9 D5 @' z3 b( i* B' }
- xor ebx, ebx( c% ~+ d6 O, y3 q& b7 d& \
- mov bx, offset GDT_def8 L! L* v5 D( O3 Z2 h3 a6 e3 d
- add eax, ebx
1 D+ a' `2 r, _" a) o - mov dword ptr GDT_Addr[2], eax
3 Z& Y, \; [" F3 P% Y7 v - lgdt fword ptr GDT_Addr
+ y6 W2 d0 S6 W+ k2 W5 T. w - /********************
& ^8 ^8 H( |. L$ m4 R$ ` - * 选择子偏移 *# z4 _! X3 h1 B& l2 G1 x X
- ********************/, m! ]% [% D p
- mov bx, 8, Y& M* I4 i$ k9 a
- mov eax, cr0% D4 d, W/ R+ Q; }& d& t( A+ Z/ U; _2 r
- or al, 1( X# f/ x2 `! O* z
- /**********************$ [' ^# v. C( J3 W8 J
- * 进入保护模式 */ Z# d: c. i4 W" K/ W' s
- **********************/
; q$ t* R9 l7 m8 E1 R1 Z - mov cr0, eax7 e4 ~9 i0 \. H9 z+ W8 \
- jmp pMod
( e- i% Q- ^0 q5 q, o! @. E% k - }
3 F1 N" M" P" ?. }: \2 F5 a6 C4 B - . y* u% e% u; P( @' Q
- pMod: asm{
7 z" K- z3 V+ n) l% s8 P4 G& o9 ` - /************************************************************
- y* |3 N4 a' j M" b - * 让fs与gs加载选择子,使其能访问 0xFFFFF * 4K (4GB) 空间 *
. u5 s/ S w8 O2 s - ************************************************************/6 |. M: P* P0 {" l2 F$ o% c# C! y
- mov fs, bx: n4 o2 f, t$ [- ]* H
- mov gs, bx- {% |0 g5 b& D, X4 [
- and al, 0x0FE( o" K. R: ^# A* t
- /******************) N8 r! u+ u/ g; A
- * 进入实模式 *
+ S) J1 p5 P. j- e. j6 p* ^ - ******************/% @; I: v; z4 N
- mov cr0, eax
7 D$ p+ B8 H2 w; | - jmp rMod
2 L! \, Q z. a% m' {, Q - }
( W! T+ ]6 i! n q3 a4 v- N
]4 L* d; C# ?3 |! t- rMod: asm{
5 s# S; X7 g5 q% a6 t - /* ******************************************************************
0 Y, L: R) `- c - * 退出,fs、gs清0,访问系统内存可用: gs[32位,相对于0的偏移地址] *
/ w6 U4 w$ [& f4 J3 N& z3 m. K& _ - ********************************************************************/
: M6 s7 p9 b, k% o - mov ax, 0
. Z; q7 J% |5 O5 M - mov fs, ax
$ }2 I0 `, U9 {# w7 T W- c/ u1 i - mov gs, ax
/ h9 M: ^! U | - sti
; U! o0 l# c& m0 }, u4 X - }4 B0 r+ \( C: j% I9 z/ N" T' D
- }
复制代码 这是asm的- ;/********************************************************************
) \8 h( Z6 E' ]$ `; R( m+ U/ I - ;* File: DOS4G.asm *
3 D( {# \- A! p- J2 z2 E- @+ ?2 m* F - ;* Compile with masm ( Editor: Tab size = 4 ) *
! Y* z, G. M2 v6 M - ;* *9 a: @- c; d* |# M+ r( J# S6 T
- ;* ========================Title=============================== *
6 K& A/ }9 e* M2 u; T! J - ;* 这个demo是让系统进入DOS 4G模式,进行数据访问 *3 b3 m6 n5 `6 B5 k4 Y# P( Z
- ;* *
% Q p [7 U5 ^9 R7 j" Q7 u - ;* ===========================History========================== *
( f! D L5 y& j - ;* author: bini *
2 z1 E% g5 g" \1 g4 y - ;* date: 2008-10-08 Frist version. *
. f) [% `- y, N( k" }0 n - ;********************************************************************/ 7 r$ w# m1 D$ G% M
- .model small
# m+ H) I5 b9 N; J, W - .586p
+ ?& [# S; h# l, n9 l' A& Y% V5 u9 j - " x$ s& h5 I* |: ?) J9 P
- DSEG SEGMENT USE16 ;16位数据段7 @8 J" r) `. s+ @& l
- ) Q) K6 r5 ]( \/ O
- DESC STRUC7 \- J* t, N4 b& b+ C
- LimitL DW 0 ;段界限(BIT0-15): ]1 d: B. u6 C5 C5 C
- BaseL DW 0 ;段基地址(BIT0-15)
8 Q" P, d! r5 G: S7 G0 ^) e, @; _% z - BaseM DB 0 ;段基地址(BIT16-23): Z, \+ g( b g
- Attributes DB 0 ;段属性
- | p5 A) b! ]+ Q7 w. I# h - LimitH DB 0 ;段界限(BIT16-19)(含段属性的高4位)
6 U9 T. \2 G9 J" S8 r# \$ [ - BaseH DB 0 ;段基地址(BIT24-31)5 Z+ R+ a2 \9 |% R+ u) Q
- DESC ENDS0 q* g& T2 V- f. h
- % G, Z0 g2 l6 E
- PDesc STRUC& q) G7 m# y! |
- Limit DW 0 ;16位界限" x+ m" c3 `+ Q7 \6 F" U& d5 S% F
- Base DD 0 ;32位基地址
' f/ S/ O' E. [) X2 v - PDesc ENDS
; x& `, L. s( f" d- I% [ - ; ~, s* D( A2 I+ w2 H4 y
- GDT_def Label Fword' d/ h% _5 p. d, Y8 ?5 a+ ]9 ~
- Null_Desc DESC < 0h, 0h, 00h, 00h, 000h, 0>% b* }9 ~# s( K. U; O/ h: g/ C
- Data_Desc DESC < 0FFFFh, 0h, 00h, 92h, 08Fh, 0>
! h( g ?; L5 }1 J: f8 j$ B - ! ]/ J) J1 F% O8 u5 ^6 [. A1 j; @
- GDT_Addr PDesc <$-GDT_def-1, >
$ x' D* T/ i1 D5 V - DSEG ENDS ;数据段定义结束
% w# h: D( I. y4 G8 w4 i y
( C' a& I8 T5 y8 x6 R- CSEG SEGMENT USE16 ;16位代码段
% i0 j& d3 }+ ~) E6 S4 ] |0 j' J - ASSUME CS:CSEG,DS:DSEG6 ~. ?1 A, x0 d, C6 D3 b+ x* A
- .Startup+ D: E! K6 H) s$ \3 g' Y) r
- call Set4gb
& K; V' v. T' u4 O t3 I7 Y - ;
% ~5 E+ W: ~; N0 R( s$ P - ; fs, gs即能访问4GB空间# q# g3 L1 t/ ~! A6 `+ `' Z- j$ u
- ; write your code in here.
1 ?) G- o$ w9 H- n; V - ;! e7 Y) p* w9 h, M* R$ |
- .exit) `; Y z& u) S
-
n9 v& y% t- V$ e- `! [ - Set4gb PROC NEAR9 V2 f" c9 J( |2 a# i8 q9 h
- in al, 92h3 h9 [: o4 \( K0 p( q5 Z# D: c
- or al, 0024 H# k9 s: ^3 n2 |% Y
- out 092h, al2 a0 |( c; s. S2 I
- out 0edh, al
`& D9 K, U) l* r( G4 B7 q3 {( G
& d' b& M" h. {. a9 w9 c$ I- cli
0 O: |: M) ?/ |- l) ~6 ?
- j& [, a/ c5 b E4 g$ J- ; mov word ptr GDT_Addr, (2*8-1);) `4 u5 d n- B( b' `2 `
- 7 H% R7 R8 ^) r8 s8 y' [6 g2 q" O
- mov eax, ds# v! ~" Y+ i5 m, f
- shl eax, 4# N5 Z4 _/ L. e9 ?& N/ Z8 e- ]* T
- xor ebx, ebx, \$ d( U7 }4 K- j/ G: b3 M
- mov bx, offset GDT_def
1 ]: f) E8 c5 e4 R5 G4 p - add eax, ebx
7 B7 c! k/ @% I0 h - mov dword ptr GDT_Addr.Base, eax: z& J( Z5 i8 N8 @
- lgdt fword ptr GDT_Addr
( N) G5 S) u' j# Q9 ?
$ [/ r- X6 W& q# S8 {2 u- mov bx, 8; B5 k' K( P a: [+ C# @
- mov eax, cr0
6 I. M* n" k, H' J& ]$ m0 W7 ? - or al, 1
, J3 K* _4 D3 J8 L - mov cr0, eax# o8 c2 a' ~* T/ o) M+ N
- + k3 S* Q% y7 a& n* w
- jmp pMod
; F$ a4 p/ Q" J1 \, _6 a( @ - pMod:7 v) |" W( E. v: r
: c/ N& b7 ~7 y U/ o- J- mov fs, bx6 a( ^/ H% c# L, U
- mov gs, bx$ ?- @( v' m: h
- and al, 0FEh
9 c& X1 A( P2 r1 P/ X1 d: `2 y - mov cr0, eax
% C# ^: x& Y# F2 ]$ P3 O" w9 e - % B9 ^' D, t0 I. Z) M8 [6 I
- jmp rMod
" |- H" V( \( z! D - rMod:# v, T3 M( a! i% w- m4 a
6 i' J% A+ k! }7 r/ I6 o- mov ax, 0) L! Y) X4 E9 X+ s6 Y9 J
- mov fs, ax/ L% x0 H5 |/ c9 i5 E9 f* s
- mov gs, ax8 m p5 j. r* L1 Q; y9 a! d
-
. x( U3 d2 m; M0 S* u - ; 在2M的位置测试写一下数据
6 ]3 o! [7 o9 x+ Y( j/ `! K, s - mov esi, 200000h
1 i6 j! z, s& | - mov dword ptr fs:[esi], 055aa55aah6 e' a2 j% o% ^( U1 g
- ; 用RU去看看200000h的位置是否是此数据....( ?# e8 a% H1 e4 H9 j+ v
- & n' h7 ~+ I8 [& `/ e, t
- sti+ c- P7 \8 v* E1 n, r" r, T. q
- ret* ?/ j3 `" z$ @4 |: ~
- Set4gb ENDP
5 [% v0 |" J, y+ a1 u -
' X* ^" J2 ?2 V+ X+ P& G - CSEG ENDS ;代码段定义结束! K* L% u# V i/ U
- end
复制代码 |
|