|
|
刚学习的同学,有些还不会,我这里贴点C和asm的代码。只供参考。5 u+ d$ B( D/ w0 h" V
$ v i1 ?" u: f, r5 y( W
这是C的- /********************************************************************6 ]9 f4 f3 E6 ~( C. t
- * File: DOS4G.H *" S6 e0 s3 c& T
- * Compile with BC 3.1 ( Editor: Tab size = 4 ) *
1 I1 u) S, ~, }& I2 x$ Q' z% K& J8 x - * *
) d! L+ A9 | ~7 h; w - * ========================Title=============================== *
# k, e# h# N% s - * 这个函数是让系统进入DOS 4G模式 */ Q |- `! g4 a. _" L
- * 程序参考了:陈家琪《DOS实方式下直接访问4GB》 *8 i8 O) t# ]. S. n* Z
- * *6 V5 [( _( ]& b1 L% Y8 Q
- * 使用: openA20(); set4gb(); *
! l/ `) P- e4 X% T9 K - * *8 V. I% D' s, J. F: x# c; o: L
- * ===========================History========================== * r3 b1 M( V- p
- * author: bini *
% b9 q [: x; R; q& Y3 @( X) m - * date: 2004-11-30 Frist version. *
Y+ x7 B9 ]/ d - ********************************************************************/
' m" B8 O2 |! a% W
* a& z; Y0 }% q2 H' r3 N- #include <conio.h>3 w* T7 W$ ^5 M! A- Y
- #pragma inline
6 J7 z, b; n$ e! `1 ^
8 \: ~7 o4 z" O' C0 I" j- /***********************************************0 J: R5 ~" l! c
- * 两个GDT,第一个为系统使用,不管,默认为0 *# i- {! Y. `: Q2 P! y9 z9 o
- * 第二个为一个数据段,没有代码段。 *9 A G8 U; _1 {9 M5 `
- ***********************************************/
% d+ N# L5 f- c - unsigned long GDT_def[ ]={0,0, /*系统使用*/1 U( k4 R' _ J5 P. L
- 0x0000FFFF, /* hi16bit( 0~15 ) is base low=0, " L/ h( o" z. @. {& h. o. y% I% r L
- low16bit( 0~15 ) is limit low=0xFFFF % f P- B/ t3 i: A2 q
- */
* z7 G* E7 Q: y1 [4 t! l - 0x008F9200};/* 最低字节为 base( bit 16~23 )
+ C# m4 h% b: w3 v2 ~1 k - 最高字节为 base( bit 24~31 )
. u' x2 `. K' R# S' J; | - ' u. X2 C. N. o7 E+ k& x5 O
- 属性Attrib = 0x8F92) X9 k% L+ q; T8 I( u
-
, Q* X6 o/ ~* C, t' x - 属性位Hibyte低四位为
; `! V" ~) H) m1 i" h6 V - Limit( 16~19 )=F; K0 U0 i) a- M; ^7 K
- 属性位Hibyte bit7 为粒度2 d Q5 l: f* n4 A
- (值1=4KB粒度)# u7 |# r: H/ [
- 8F & 0x80 = 1
9 n/ H9 r- k3 M, y, ] - : n; r; L) c1 e2 F4 J$ ]5 j4 H# i* O
- 属性位Lowbyte低四位为段类型,值=29 o1 ~' O" u% S6 k, R
- 表示为可读/写段
( e6 e) m9 t" n) u; K8 V9 l/ P - 属性位Hibyte高四位=9,bit3=1表示:
" t% l. D. x) P9 |5 F - 描述符对地址转换是有效的。
1 Q0 }: }' S4 {9 ~ - bit0=1表示为:
8 r8 C1 Z, S3 V+ E4 }- k - 系统段描述符。而不是门描述符。3 k9 m& j, P' i' \" u+ h
- 4 `% m% ]6 g! n/ R+ e; X
- */
& W" m; r& z/ F: ^* a% B9 ]
, [: c+ G6 u E% |8 h* k- /****************************************5 l! U+ @, Z2 s2 Z5 u5 Q; Y$ j
- * GDTR寄存器, 48bit=6bytes *2 w0 L8 w7 h( W* g* P) C
- * +-------------------------------+ *
. r! @1 a1 W. q) w - * | 32bit基地址 |16bit界限| *
9 u' d9 g: V, D, ? - * +-------------------------------+ *% `6 j7 a( [0 ]' h
- ****************************************/' m" q# E9 I' m" k% W4 Y
- unsigned char GDT_Addr[6]={0};
5 F9 } O9 A1 o, p& D8 S
) I! U2 N3 U+ q' ?* Y6 S- /****************4 j- K3 F. }) k# j$ a9 U
- * 打开A20门 *
3 k" T" t8 P- c; b - ****************/( i& ` j# i) g n3 p ^: n
- void openA20(void)+ y* x9 D" U" o5 k6 u
- {) \' Y, X- l7 C ~9 ^$ Z! r
- asm{
4 W+ O2 n6 M! ^5 N# S+ D - pusha
& `2 d2 x4 m) M% B. [ - in al, 92H8 y5 x, z5 h; s5 A4 ?
- or al, 0x02. d; p( P6 b& m
- out 0x92, al
0 e/ v' Z0 x/ P* M7 C4 | - out 0xed, al
" z6 p: s/ }- w6 T. @ - popa
; ^ w: X7 Q6 @$ p# J' X2 p - }# Y0 c# _, E9 T! S; J
- }* o: b" n" |3 U
- - G% J& _, C) _
- /***********************************************& U+ A9 J3 u. ~$ |5 X& e& ]' p9 E
- * 函数功能:进入DOS4G *
3 G5 B( e* K" k! S h - * ==================== *) r2 H' D* H+ L$ D6 E/ z5 j
- * *7 l3 v9 T( { k$ d; s5 y' p
- * GDT描述符界限计算方式:描述符个数*8-1 *
5 u6 F% H1 N4 e7 i r* H6 B - * 如: *4 E3 x: b3 C, @+ K; m& U
- * mov word ptr GDT_Addr[0], (2*8-1); *
/ d. E- J1 l6 E* }1 h3 r - * 表示为 2个GTD *
' z0 u5 E, k W: G$ T( @+ c5 m - * *
' q( _( C- b+ {% f: l - * 选择子为所在描述符内的字节偏移。 *
* y# m; a1 a: ?5 [: I0 O - * *
0 q4 w) P* {$ H' d8 K - ***********************************************/4 I. C( p9 l5 A% j% `6 S! c; W
- void set4gb(void): c# e5 W; k/ L. R
- {
0 i1 m/ B8 T9 b) q6 o/ L" i2 o - asm{, q7 c7 C5 }- n+ S
- cli* l- X7 J( q$ l4 ^! {
- /****************************************8 M: q5 z% r+ x `1 Z7 v
- * GDTR寄存器 *
* Y3 O Q& H' Z( c$ _1 T/ ^9 | - * +-------------------------------+ *
1 F- W7 W; p9 x( A- v5 | - * | 32bit基地址 |16bit界限| *$ z* R5 p) b, q# ^( h
- * +-------------------------------+ *' ~2 t* D& b: Q7 s2 [- g$ Z# F
- *****************************************/6 E+ J3 j- q& Z4 r1 i; G: o% {
- /*********************- }: d. p. l# ~
- * 得出段界限 *
! h( a4 i1 x, F9 Q' y9 m/ R - *********************/
\6 Z. x$ I& j8 L9 H: V. c - mov word ptr GDT_Addr[0], (2*8-1);& }* i0 O1 u( B7 y1 v" w
- /********************************************
) w. [* S/ i$ u' [, {! M9 Y+ | - * 计算GDT表的32位基地址,存入GDTR *
& l3 V- g" I! y! q8 t9 A' o. Q - ********************************************/
- z& k1 `9 |1 b( d p - mov eax, ds& w! F# E0 p( i9 o0 n" U
- shl eax, 4
, A' z1 s3 \8 \" N - xor ebx, ebx
( y& ~" u# _8 D- I' ^ - mov bx, offset GDT_def
* m/ t8 A& [0 d - add eax, ebx
+ t0 Q/ j9 l5 m: m- B+ w7 Z - mov dword ptr GDT_Addr[2], eax$ M: {: u; G! J2 J7 }, e% x
- lgdt fword ptr GDT_Addr
: c5 d: a% t4 x0 d- z6 K - /********************% d5 D1 \. L+ g' r
- * 选择子偏移 *
' {- W0 s' e$ t5 ]7 p/ L) l - ********************/
0 p0 S2 ~" p, H! O( l, d/ N5 ^) I/ N. C - mov bx, 8
1 @: s# `; ]. Z) S1 I# g( \ - mov eax, cr08 y3 J9 c" k( j3 V9 N
- or al, 16 W/ d) j6 B3 l2 N" W7 s0 o- E( t! u
- /**********************
5 M9 F! @- O- ?0 _$ I - * 进入保护模式 *
" Z7 Q5 J& x% V* G5 j8 n, N; t - **********************/- N5 C( q4 |" c1 k
- mov cr0, eax6 W, Q" Z2 h" Y3 s* L* E
- jmp pMod
0 c6 Z; |4 f8 [, }8 R - }9 B. k" v7 ^0 s, u& N) b# H
, K* Y7 p# U c- t' H- pMod: asm{) v" u5 y, _, p
- /************************************************************" q! G! {+ h) M/ H
- * 让fs与gs加载选择子,使其能访问 0xFFFFF * 4K (4GB) 空间 *
3 I6 }) b& }9 j. P- h - ************************************************************/" g: ?, P: I' i' W# G* u5 P$ B
- mov fs, bx' e/ H2 G$ o( b% N& f
- mov gs, bx* N. z+ v' J w! D
- and al, 0x0FE
; ^ u3 H* Q* s5 l - /******************
. a3 u) l0 m! t' ]( ?+ L - * 进入实模式 */ G# t$ q( ?- C# ]
- ******************/ u' T' s. t9 v5 i- }
- mov cr0, eax2 h1 i3 a' S8 R
- jmp rMod& B: `6 o/ T. e$ r
- }* R1 D8 A: y+ \- [$ }
- # T$ w9 k# x( ?# J9 }4 L
- rMod: asm{
- H: J L' t4 F( F - /* ******************************************************************
* L" y$ G' W, w* f - * 退出,fs、gs清0,访问系统内存可用: gs[32位,相对于0的偏移地址] *
: F8 v' [5 o7 @ - ********************************************************************/
, i+ R5 ?; [5 |6 M9 ~: y - mov ax, 03 F- z9 j3 w7 }) M5 v- z
- mov fs, ax. w3 x+ w9 P( }7 I& s
- mov gs, ax
: E4 Q. ~. Z: H5 } - sti
2 H) _& b6 S! W/ | - }9 X9 R9 \( f- H- ?$ e% Z* V
- }
复制代码 这是asm的- ;/********************************************************************
$ o2 s* H3 Z7 t8 L2 I; B( h& \) N - ;* File: DOS4G.asm *& f* R+ h5 ? }
- ;* Compile with masm ( Editor: Tab size = 4 ) *
8 M( `6 x# ^' M( a, u, c - ;* *
" }7 [" e# S9 o- V# n - ;* ========================Title=============================== *
6 \9 O4 W5 z( `; M - ;* 这个demo是让系统进入DOS 4G模式,进行数据访问 *6 A$ n) q9 S# z# @6 b2 @4 d
- ;* *. B+ w7 m: z, G0 h* J: U8 G
- ;* ===========================History========================== *
0 i+ x- }0 N# x8 w- l) b; B' M - ;* author: bini *
1 D9 }5 k7 s; y# R6 j! u - ;* date: 2008-10-08 Frist version. *
' u( i9 t6 I4 N0 e S0 H: ^ - ;********************************************************************/ , Q/ T5 T' C$ K6 F, r5 B2 j
- .model small8 l9 O! H' S4 g/ Y6 L9 x
- .586p) ~0 h3 p8 a; J' ^8 j% {+ w
-
) d% a7 d* Y+ R/ d - DSEG SEGMENT USE16 ;16位数据段
7 l2 ]* Q5 K K4 G1 v; | - - q6 I! f. W# A# C& Q+ c
- DESC STRUC& q0 f" Q( O1 }6 u, _" X2 h
- LimitL DW 0 ;段界限(BIT0-15)
4 Z- }7 K7 s) Z+ z, C, ?+ \7 } - BaseL DW 0 ;段基地址(BIT0-15)
; _5 q* d4 x# V3 ]3 M - BaseM DB 0 ;段基地址(BIT16-23)
8 G J; S1 u N! N! E, S - Attributes DB 0 ;段属性; e+ c( Z$ k$ ?0 H2 m; `3 j
- LimitH DB 0 ;段界限(BIT16-19)(含段属性的高4位)3 T: c. K7 k3 c; u/ r
- BaseH DB 0 ;段基地址(BIT24-31)3 j! o7 b3 s7 |# O3 U' o5 }, c' B
- DESC ENDS
% ^9 g( G% j5 L
2 O8 m% {8 A' ]2 G! J V- PDesc STRUC8 d. q) z N0 A$ y5 @9 p
- Limit DW 0 ;16位界限
7 D2 ^1 r- Y+ S, t- C c6 b7 e$ G - Base DD 0 ;32位基地址
7 }+ H7 [. M7 R6 e; e# Y# c - PDesc ENDS
* @/ h" P: L5 w1 _' ]! o; o) i( l - : U+ l* R4 L ~* \
- GDT_def Label Fword
, N8 |0 }4 `0 s - Null_Desc DESC < 0h, 0h, 00h, 00h, 000h, 0>) y, r, m# l8 a6 P
- Data_Desc DESC < 0FFFFh, 0h, 00h, 92h, 08Fh, 0>
( |9 ^2 E. [! _. N/ e+ q& H
. J# a6 F$ C1 L3 w/ u- GDT_Addr PDesc <$-GDT_def-1, >" Q e' _* y" Q0 _4 o
- DSEG ENDS ;数据段定义结束6 V* k$ b8 y* h& U# X! P& h
, e Q0 f2 n6 i4 ^% [- CSEG SEGMENT USE16 ;16位代码段
- n. P8 G7 |4 T/ b - ASSUME CS:CSEG,DS:DSEG/ l- C9 ]# f. f. L( L3 l
- .Startup
6 h1 q( c2 n- q) P+ k! Y* N" `; B J - call Set4gb# L" i( y- I: r: ]3 w4 y' p
- ;& K7 v- I: P5 V5 n( {+ ^0 m5 M
- ; fs, gs即能访问4GB空间' a9 Q- G5 s* b3 }/ y" ^) b+ h
- ; write your code in here.
$ D# t4 d* T- `) O3 Z* f% J - ;/ K4 s- o) W* Z2 ]3 Y
- .exit z5 J3 k6 @1 F5 W' Q$ E4 {2 r
-
+ V" F3 m p" T: r/ k - Set4gb PROC NEAR
0 @$ z& x/ x% l B7 v$ t - in al, 92h
! Y+ O5 k3 J4 L! T: K ? - or al, 002
' s! H, H5 y3 f F$ h9 c - out 092h, al* @! Z# f7 f: g
- out 0edh, al
2 I0 S6 A1 y3 W" f' m - + l% z# i3 M2 U( F
- cli2 L2 }0 L- U0 \; F" u7 U& f
, b* ]; \! u5 J$ T) s# U- ; mov word ptr GDT_Addr, (2*8-1);
: H8 C2 Y: p8 k/ b% Q - ) n& ~, X# ~; D% B2 U# u# ?. z* ?
- mov eax, ds
5 r1 F) v; l( F6 k, U% F - shl eax, 41 H0 q3 v2 b) z' O, L
- xor ebx, ebx, f9 Q1 i; @* E* l' l1 R
- mov bx, offset GDT_def
7 \6 L+ Q9 n0 _+ }6 h5 X: D - add eax, ebx! z( ]' I8 C& F" E* R) f1 F
- mov dword ptr GDT_Addr.Base, eax
7 w0 D/ m# @+ t8 e" L5 F0 c7 J' b - lgdt fword ptr GDT_Addr
' A; i! a/ ]: y, e- ]8 S
& m; I1 N4 ^, z9 L, g( r$ v# `- mov bx, 8
; v/ \' y8 e) c+ o0 [1 t - mov eax, cr0% H* S+ d/ ^0 G. i
- or al, 1
+ v( Q! _. g5 U" P; F2 i - mov cr0, eax% N! _# _# d- ]. G5 |8 A
2 ^3 n" v3 j) G! S4 n- jmp pMod3 u/ N' k7 I7 D! S$ _
- pMod:! b" b' c1 ]+ Y! X3 m% T: o$ B
M- R9 W! s/ k; E- mov fs, bx! {. Q3 f! L; [9 F, J
- mov gs, bx
' b4 o3 y f- M. O* V( E3 m5 s - and al, 0FEh
6 I ^: B, \# i1 \0 U - mov cr0, eax* M1 E" R3 V: [* m% c5 G
-
$ |# ]( k" @1 {, U( J5 y4 E% `- A - jmp rMod
. Z( Y; v1 U8 s- D$ e& W - rMod:7 ~" d! h5 z2 G" ?
7 u% l) y- R& [5 F% _- mov ax, 08 }2 r3 K G+ s5 h3 A! R
- mov fs, ax4 e2 I1 N+ n/ u. ^% ~+ y, p; o
- mov gs, ax8 ~- H* T' b; a% i- b% J. p
- 4 {+ Z. _4 H; _9 L) H+ ?6 h
- ; 在2M的位置测试写一下数据
0 ^2 Q; B) W' k; U [ - mov esi, 200000h
% a5 a& }8 {% F3 V+ W, c- ~ - mov dword ptr fs:[esi], 055aa55aah; S+ S; N9 w- \ R* A
- ; 用RU去看看200000h的位置是否是此数据....1 A' ^ Q' @: M; @; w( c. D2 O
- ( ], |0 ?! L$ S8 R, f" R
- sti& }' P \( R, K% F9 j9 V
- ret
0 C& I) w6 N) Q; h/ T - Set4gb ENDP- h7 V2 r# s5 F% j
- 1 q' b. v2 R1 [+ y, |) D0 y8 F
- CSEG ENDS ;代码段定义结束- n. ]6 U) G- ^$ e" d
- end
复制代码 |
|