|
刚学习的同学,有些还不会,我这里贴点C和asm的代码。只供参考。
6 D# k. Z3 G6 H; ?6 W3 q6 p* q+ D& D( p7 F2 i
这是C的- /********************************************************************
7 D: F. K' @% g+ Z( i/ \7 w' I - * File: DOS4G.H *" o J: d, z5 x" k6 v
- * Compile with BC 3.1 ( Editor: Tab size = 4 ) *
- v" f+ n: {' i3 f( m - * *! }9 b" B+ R4 q: W6 g9 t
- * ========================Title=============================== *( X1 P+ [' x! c; a
- * 这个函数是让系统进入DOS 4G模式 *
) P& r* h( K9 r0 w5 q" Q - * 程序参考了:陈家琪《DOS实方式下直接访问4GB》 *
I3 r- i* p+ ^2 E7 [ - * *1 B( G+ e. \# b2 ?- t6 t, c. i* t
- * 使用: openA20(); set4gb(); *
/ z( F/ p$ v% j( |' x% ] - * *6 i/ n) J( T: ~8 g: F7 U d& v
- * ===========================History========================== *7 a1 r. W+ G3 u! a
- * author: bini *: B4 Q; ^, i7 W( Y* C
- * date: 2004-11-30 Frist version. *
+ R1 ?! K. Z- F8 m: H/ L - ********************************************************************/0 x" X: ^# i) v+ _! H
- G0 {1 J2 W! L4 L5 R L- #include <conio.h>
1 g; j0 N3 b/ e6 I& G - #pragma inline4 T, ~6 W2 b! m+ q3 U' l, c
- 9 }; n1 D; L. G1 Z# u, I9 P4 c
- /***********************************************
$ q" y4 }+ z5 w% ^ - * 两个GDT,第一个为系统使用,不管,默认为0 *
: i- L5 P, U. R: r - * 第二个为一个数据段,没有代码段。 *
3 C2 @4 [) m1 z: w7 k- o1 N% I( _' W: m - ***********************************************/, K/ F5 A0 V# m4 \7 S2 y6 d* x
- unsigned long GDT_def[ ]={0,0, /*系统使用*/
: v! ^7 D( ?. ~: A* v4 _! c - 0x0000FFFF, /* hi16bit( 0~15 ) is base low=0, . a! z2 R7 f9 W6 U+ Q8 K& O
- low16bit( 0~15 ) is limit low=0xFFFF & @6 ~/ D( ^% Q# C3 `# s2 E
- */! j0 z; U8 h1 o( r
- 0x008F9200};/* 最低字节为 base( bit 16~23 )
* U' }: A2 s" p$ M - 最高字节为 base( bit 24~31 )
& F3 h& ^/ G/ g: y2 M( ] - ( c% V$ h# |" q! J1 F
- 属性Attrib = 0x8F92
7 N6 A' u; }$ w - 4 J/ J4 g* {6 s+ `+ I9 M# w) b
- 属性位Hibyte低四位为 1 n* Q9 ?8 y) P7 `; n
- Limit( 16~19 )=F
9 V- q+ Z" p Y/ P! H - 属性位Hibyte bit7 为粒度# M# T8 k4 |" s9 z' \) ?. J7 _) O8 a
- (值1=4KB粒度)5 V1 R* e4 M- d) B5 A4 j5 h
- 8F & 0x80 = 1
& I6 t( V- l9 g5 E$ e$ V -
( i8 _9 e3 \1 Y5 m - 属性位Lowbyte低四位为段类型,值=2
2 ], ~0 K0 i2 d; [6 |4 C - 表示为可读/写段$ [& _ o/ c. s% f" s' \
- 属性位Hibyte高四位=9,bit3=1表示: B ^8 z0 g* ^+ S; |% y8 p
- 描述符对地址转换是有效的。; V8 @, y# A& ]' o% w( r
- bit0=1表示为:/ t, c) A( o" j6 |
- 系统段描述符。而不是门描述符。
( n# P) W# [: y4 _5 b - # M) N- Z' |8 e4 h4 H
- */+ f! [0 C/ R+ B- a; J" Y2 v
; N& C! u4 G& M' ]2 b- /****************************************6 x5 p& _5 @ h/ J6 t. W% X
- * GDTR寄存器, 48bit=6bytes *$ ^! j0 J z# c0 n5 n( z, B9 n
- * +-------------------------------+ *# i. W z r& M3 Q5 P7 Y
- * | 32bit基地址 |16bit界限| *
8 O! M( S+ h$ L8 u. p5 o - * +-------------------------------+ *
- l5 x, q* p. G) h - ****************************************/
" j& s5 n% h0 [5 d - unsigned char GDT_Addr[6]={0};' _9 C! n+ W6 ^. I: Z9 Y
1 i: }- ]+ Z$ { R q1 n- /****************5 f: Z# r- P/ {
- * 打开A20门 *
. I/ s* \- y( O' X$ r+ P - ****************/
1 y. b5 D" U `5 T# @3 m - void openA20(void)9 Q2 z, v% [1 b3 C# ?
- {# J" j* a% w0 v
- asm{7 D# a1 R) Y$ _# K
- pusha
1 u$ `: O6 g) d+ d - in al, 92H) L! k- D& @" V( N* m
- or al, 0x02: X- y p# Q& v! N
- out 0x92, al
* ]& z6 }* j' N7 [, J" D" { - out 0xed, al: q/ c: \+ w( v5 V" E
- popa, S$ d. y8 v% H! M# H% i2 B
- }% ^, D1 y4 _. [
- }
8 d& o; x) M* ]5 L1 e& G& U' C - . c+ b9 ~- U6 h
- /***********************************************
; \9 f! r. B& |) s0 F - * 函数功能:进入DOS4G *& P- s# Z0 e6 }# H0 D* k+ f
- * ==================== ** _4 [, j8 K! J" G
- * *
( n9 N% t4 @8 u C+ z - * GDT描述符界限计算方式:描述符个数*8-1 *% M; ~" N( k/ G
- * 如: *
% U& b7 S, ]6 [4 P, W! O - * mov word ptr GDT_Addr[0], (2*8-1); *
, S3 A7 H& W5 y1 S4 ~6 H9 u/ O! A - * 表示为 2个GTD * S! ~( N) T. l' Q6 ~7 Y7 B6 _
- * *
1 ]; w2 D8 P( o - * 选择子为所在描述符内的字节偏移。 *
2 E$ r- J) x i# Z6 Z* P - * *
% a- Z$ w z: v. W: [ P1 f2 T - ***********************************************/; o. R, @' J" g9 u$ I4 O$ f9 E2 A2 A* z
- void set4gb(void)* n- [7 A( B* x% _
- {9 o5 ^) x$ B; b9 P* E
- asm{
+ O# Y2 V1 d. R8 f! Q - cli9 s- l5 e- t; z9 Z
- /****************************************
3 }: z+ s1 \8 K - * GDTR寄存器 *
. g) ]3 D, W, |8 e1 k - * +-------------------------------+ *
9 H/ f$ Y$ m: `4 F& e( @ - * | 32bit基地址 |16bit界限| *: b& ~- R" F4 V
- * +-------------------------------+ *2 @, I4 K! U+ k
- *****************************************/
! P2 l$ e5 u0 o+ ?4 I' } - /*********************
8 P5 k: I& d/ F/ C7 t% t3 [* H1 w! | - * 得出段界限 *
5 l6 k* D0 {# Z# {; |6 w - *********************/
9 W; I( _; } l0 Z( ?5 | - mov word ptr GDT_Addr[0], (2*8-1);
5 l' q. f& R; T: B+ c - /********************************************% {7 C: w% u; ]7 L" s1 i1 |# z
- * 计算GDT表的32位基地址,存入GDTR *$ j; l: t' k6 Z$ @+ z* b9 ~
- ********************************************/9 w9 o' I( h) d4 c5 M E+ Q7 e
- mov eax, ds
5 T3 A, B, O7 x% O/ ]: a - shl eax, 4
4 w' L) h; N! H# j1 ? - xor ebx, ebx
" s3 h) e3 ~/ k. M. L, @" e# W - mov bx, offset GDT_def* w ]$ x K: R6 T
- add eax, ebx/ t+ s$ A/ h/ U Y& r4 l& f
- mov dword ptr GDT_Addr[2], eax! p( g/ s! Q. t- H$ T0 @
- lgdt fword ptr GDT_Addr
4 b& J. l/ y( e/ ~8 I( r4 c - /********************
1 g: ^* m4 [7 `; N3 S - * 选择子偏移 *+ ~$ @" [* J, W0 w' M- y. @
- ********************/
, t. H+ f( K# P" R; T1 y9 f+ y - mov bx, 8. D% d, K- k7 f6 X8 u4 D" C+ V
- mov eax, cr0
; k; d e, _) p3 F - or al, 1) n5 S( L# O( G% Z: P# C$ U3 N
- /**********************
% l+ c$ v" Y. g - * 进入保护模式 *) ]* @! w5 E/ u* M
- **********************/' G t% s# q0 N1 w, r% I& M
- mov cr0, eax" z9 ]& O1 {# i4 V: G( Y
- jmp pMod
$ D W$ d) M; ` h9 y - }
' `2 H: }6 j& n, t
& \% n' S4 r6 O1 L( M- pMod: asm{
: y* T; }6 ]6 y - /************************************************************
1 {: d/ K. W1 q* r; U# ]0 E+ _( G - * 让fs与gs加载选择子,使其能访问 0xFFFFF * 4K (4GB) 空间 *" Y! M+ g5 R" p
- ************************************************************/2 C9 J7 b3 ]6 v1 _% r
- mov fs, bx7 }5 G. X# `6 i) @0 U, D
- mov gs, bx3 y, W/ P) \& a B
- and al, 0x0FE" F" g- A( u: [
- /******************
3 b1 y5 G/ R( Q - * 进入实模式 *
- X2 G5 [7 d' V8 M9 a! O! C - ******************/" F0 v5 K' C3 _) C6 I
- mov cr0, eax' H% e [' J: I
- jmp rMod
. ~3 A: E- k+ g+ H* V0 R - }
* L+ @" k* i9 T# S. @ J
1 |! A0 x: O, q" B6 H- rMod: asm{
3 `: u) H. t+ S0 g c - /* ******************************************************************7 F. O9 }8 [* s0 j3 S5 K
- * 退出,fs、gs清0,访问系统内存可用: gs[32位,相对于0的偏移地址] *$ H6 M5 ~2 Z- Z4 ?7 [$ n
- ********************************************************************/
" ~; A3 q6 b5 g; h - mov ax, 0
. ?4 Q) y( U7 t4 m$ B0 `# q - mov fs, ax2 B" b# w/ \: s5 _5 W; G
- mov gs, ax. b7 @- r9 q, U0 }2 z
- sti
8 ]: `4 b) |2 h. Z1 p - }8 `6 Q) e- m! b5 T2 b
- }
复制代码 这是asm的- ;/********************************************************************6 e$ D5 |8 |% z" G2 ]- A5 x
- ;* File: DOS4G.asm *
6 f, X9 [1 v/ Y" L0 B' T - ;* Compile with masm ( Editor: Tab size = 4 ) *
; ]. B. x& ]# I' ^ - ;* *& U: _8 \; m3 r1 _8 [
- ;* ========================Title=============================== *6 X2 i) \% C. l0 {
- ;* 这个demo是让系统进入DOS 4G模式,进行数据访问 *
* d5 @% ]0 R c! _ - ;* *+ E7 Z; [% [/ m. s, c5 n. n* s2 M9 t
- ;* ===========================History========================== *
: D9 C* a& T) I1 w' `4 B - ;* author: bini *
/ q2 f5 ~% x2 Z - ;* date: 2008-10-08 Frist version. *
6 z, ~. N( K. B8 ~, g - ;********************************************************************/
: x; G( N% ~4 `+ F3 Y9 x& v - .model small
9 G2 R: D9 c8 I7 [. `. | - .586p
' B9 Z4 ]" n R. V -
& W4 y8 q9 a8 r, a - DSEG SEGMENT USE16 ;16位数据段& R, Q* Z6 I d# R0 g
% c) B- b# K9 O7 k# y- DESC STRUC) n1 \, p; @3 g
- LimitL DW 0 ;段界限(BIT0-15), M( a# \5 t, A# g* c
- BaseL DW 0 ;段基地址(BIT0-15)4 O# G* u& `! o" t; e
- BaseM DB 0 ;段基地址(BIT16-23)" V, I; v3 I% b, A0 b
- Attributes DB 0 ;段属性+ }, C6 l6 x7 C) U' {
- LimitH DB 0 ;段界限(BIT16-19)(含段属性的高4位); b5 \1 K8 _) B' v
- BaseH DB 0 ;段基地址(BIT24-31)9 H U! I" P* A v8 ?3 A
- DESC ENDS- z. X/ h0 O% }
- + | M5 Y2 ]+ n+ u7 E
- PDesc STRUC# G x. d$ `( V% T7 w \
- Limit DW 0 ;16位界限
- h; A" {" P! [$ N. M - Base DD 0 ;32位基地址
- {# x: I( }8 |+ b - PDesc ENDS
+ y4 V' C& L4 y# j$ Z- S$ @! Z
8 B0 c+ ]! o* K2 i7 \7 X' V- GDT_def Label Fword
" {$ ]5 e4 V" Z6 r - Null_Desc DESC < 0h, 0h, 00h, 00h, 000h, 0>5 n+ V F1 n1 ~ p9 ~) ]* B& {
- Data_Desc DESC < 0FFFFh, 0h, 00h, 92h, 08Fh, 0>
1 ]0 }: D8 S3 Q" L8 R# U8 R
) |3 k! c t3 L# q* G- GDT_Addr PDesc <$-GDT_def-1, >
; t# G. ]$ r3 n& D# k: e% d - DSEG ENDS ;数据段定义结束
( E. e4 ?4 e' Q; J$ [) J4 E6 T - & G' ?1 O( Q% V/ Z L5 O
- CSEG SEGMENT USE16 ;16位代码段2 q1 \* Z7 G- d; O9 \; U
- ASSUME CS:CSEG,DS:DSEG
! {" h1 S2 \& j( D - .Startup$ G& q$ M( e6 Z' u0 v
- call Set4gb5 C5 n2 Q) W, S
- ;
5 X/ V' V( A; ~5 y - ; fs, gs即能访问4GB空间
c3 G- A% [2 p5 y8 R, o7 A - ; write your code in here.2 b& @% Y0 u7 [
- ;
9 V _7 O! _, s, c - .exit" L* J h& k& a$ K1 N9 |7 w" ^
-
% B2 ~* m8 M% `4 U - Set4gb PROC NEAR
# h/ v `9 Z+ d5 W v8 O - in al, 92h
! c; d- T; N* W - or al, 002
; g5 L$ H9 O' h1 t: v1 } - out 092h, al
/ R* }5 T" Y( z, p - out 0edh, al$ X. K* P1 o/ v2 }* W# p
- ! s3 e) e1 x0 m* z0 {0 ?
- cli
# ^1 t; w2 X' n. e - ' t. i+ T, {, H6 q9 a- O) F
- ; mov word ptr GDT_Addr, (2*8-1);5 [# N9 l( p I/ O
; u& i& j2 t y1 e8 ]% x- mov eax, ds
9 T/ F' G$ z& M1 n6 `9 k* X9 k - shl eax, 4
* p: x; q5 C$ \2 }$ h p- n: S4 I - xor ebx, ebx% ^( g! m+ G1 g' O o7 u* k
- mov bx, offset GDT_def; p+ H- o# x3 \/ s Y; W
- add eax, ebx
' p" ^8 L( j8 B# U* ] - mov dword ptr GDT_Addr.Base, eax
4 f& D; I% I- R - lgdt fword ptr GDT_Addr K, N: `* i, G1 v
) U$ @0 L e, I* i2 M) F- mov bx, 8
/ G* B& y+ W& u0 _! Q - mov eax, cr0
% c, S/ v: T4 t$ m# E* T - or al, 1
5 J+ U; [! ?7 L8 p( o! K, _) m/ ^# \9 l - mov cr0, eax$ v- G4 ?8 }/ m( T- }1 g A) A
" h: d# F6 q; C [- jmp pMod
5 K! o2 ]; h% f, D$ i - pMod:
x* N: r6 z) q9 | f - + J( T" u s( T; F1 M( Q
- mov fs, bx2 f8 d" o( {8 i8 [- X- Z
- mov gs, bx; c% [+ M" p6 i7 l
- and al, 0FEh
: _% I( I$ H" e2 I8 P8 {* j - mov cr0, eax/ L% I$ t9 W/ s
-
/ g7 N! O# v1 s1 e- Y8 c - jmp rMod
, c3 \2 u( o% F) S - rMod:
1 Q! ~; N4 ]$ B! ]$ b* B2 ], N
5 x# U- ?+ @0 L. Q- mov ax, 0+ g, X9 s2 S. S E
- mov fs, ax2 O+ v7 ?! E4 X9 F/ e2 y+ W: \$ x
- mov gs, ax2 L# a9 l7 I a! @
- 3 ~( }. k: j1 s# A* X, V
- ; 在2M的位置测试写一下数据
: g, W$ z, x" O" e8 R - mov esi, 200000h5 e9 v Z) G: g2 A; u# i U/ A
- mov dword ptr fs:[esi], 055aa55aah6 d, n# O- w' \) y( \0 t* {
- ; 用RU去看看200000h的位置是否是此数据....' t* v( u* L r, M6 C9 G
- , R* A) A9 D' f9 C: h, i) G b
- sti9 V$ W* h/ o3 t; j4 R7 c
- ret
* G$ Z; H, _" ^* E e - Set4gb ENDP3 G6 m9 s. w" ?. s8 I* d
-
* v( t9 m) X5 m% x* m1 i - CSEG ENDS ;代码段定义结束6 |4 C1 ~4 A9 {1 y. ^
- end
复制代码 |
|