|
刚学习的同学,有些还不会,我这里贴点C和asm的代码。只供参考。1 `+ ?' V/ @8 s! D
* H- r Z8 k( I3 R. @) a这是C的- /********************************************************************
5 T) U& j0 ~; x9 h - * File: DOS4G.H *
3 G& d. [# g' m# S' O1 U2 C - * Compile with BC 3.1 ( Editor: Tab size = 4 ) *
. U2 X/ Z$ U7 I! h3 o% S' H - * *- { f( w1 n( a3 S! J# ]. Y+ A! a
- * ========================Title=============================== *
% ~* P& c$ S* O$ c" l - * 这个函数是让系统进入DOS 4G模式 *( v* x4 y) O' C2 k% H: f/ Y
- * 程序参考了:陈家琪《DOS实方式下直接访问4GB》 *9 ?+ @0 m7 b5 ^3 K
- * *
5 V6 @; v% A- D( _' c" v# }9 w4 V5 w3 l - * 使用: openA20(); set4gb(); *
& s8 k' \$ R+ p7 [" R - * *
- t! H! E2 x8 G, {: \6 [+ |, `1 Z - * ===========================History========================== *
6 o. U& |% c" T. g/ M4 T7 V% _4 R - * author: bini *
; W& T9 }4 @& q! v0 l - * date: 2004-11-30 Frist version. *
+ Q' C8 G: c6 t* s9 i. _6 | - ********************************************************************/) C: m( {$ z& m
- 2 g& W2 S& J2 C5 O
- #include <conio.h>2 p& b5 B# A9 w! B- t
- #pragma inline
! S$ ~7 G2 {% [5 A) r7 i0 G - + k. F# u4 c6 ] [7 |& v% m4 Y$ N) k
- /***********************************************! D; P8 T( _) @. y
- * 两个GDT,第一个为系统使用,不管,默认为0 *
" e ]+ f0 R8 D# X& {0 |1 X - * 第二个为一个数据段,没有代码段。 *: S1 I7 b$ E7 ]+ x! e6 l. @ f
- ***********************************************/' _$ i7 O- r, Y! B$ J
- unsigned long GDT_def[ ]={0,0, /*系统使用*/5 k3 P4 L% Z5 X
- 0x0000FFFF, /* hi16bit( 0~15 ) is base low=0, * l! i/ U9 h1 h* Z) S! w
- low16bit( 0~15 ) is limit low=0xFFFF ( ?) ], ^3 p( `! h& f8 p3 w) Y) L' m' P
- */7 f7 K. z7 k9 H/ y2 ~4 R
- 0x008F9200};/* 最低字节为 base( bit 16~23 )
# n' t( h" E% G3 Q8 u - 最高字节为 base( bit 24~31 )7 `( m, p# R- |8 ]2 R& w
- % I* I% r8 l8 ]" U7 m% M
- 属性Attrib = 0x8F92
5 ^* C& g( [9 e% I8 M4 b/ E: r j B" o - - s$ m" @5 r8 ?- d. b
- 属性位Hibyte低四位为 . i% }8 a+ ^$ ]2 Q
- Limit( 16~19 )=F
0 G/ ?5 c, ?! N. o6 y( p - 属性位Hibyte bit7 为粒度
5 ?! \: U) Q8 [0 ^ - (值1=4KB粒度)
N. y6 H/ o1 f: a - 8F & 0x80 = 1# Y, d3 B, @- T: Y9 Y8 T
- 7 ]( D: @/ |1 H: ?
- 属性位Lowbyte低四位为段类型,值=2) s k' d$ c; t0 d+ I m
- 表示为可读/写段. }- C; l" ^# W z0 R8 e1 X% r0 L7 [
- 属性位Hibyte高四位=9,bit3=1表示:/ o, M1 C5 x% ^4 p7 K# ~5 E: h2 x& i) G
- 描述符对地址转换是有效的。
f* D8 `1 i1 }9 B: g - bit0=1表示为:% G' p. n1 \) I# a$ D4 v1 R1 p
- 系统段描述符。而不是门描述符。
, j. ^$ [* H/ m5 h& f0 u, Z -
/ I- X( C8 @2 v - *// e2 _) P) I0 h4 g/ H! B1 g
2 }2 _, `' w2 T- /****************************************3 R6 b' o' F( v2 o* x% v! m
- * GDTR寄存器, 48bit=6bytes *
* L2 U3 _! Z6 V# k1 [8 g3 i - * +-------------------------------+ *; H: y0 H3 B, \! o* D y/ y: `
- * | 32bit基地址 |16bit界限| *( c' d; e# @( X' \0 x
- * +-------------------------------+ *) a) h' v% x; \1 K0 h& A
- ****************************************/
& |2 ?4 A, [+ A' z5 S2 l2 } - unsigned char GDT_Addr[6]={0};" d; p/ P4 v- f+ v6 f! d# q
9 r, M8 K# K4 k- ^' J9 c0 B- /****************3 Z" [5 r& i) j1 D2 W
- * 打开A20门 *4 N6 x1 `0 L5 U4 D. V5 e
- ****************/0 q X ^& @7 T
- void openA20(void)
( v0 q! l5 N A' ?( f - {
1 Z# N' M3 I1 V9 K' n& V - asm{. ~# a+ J/ C: Y
- pusha2 w! t. J, p$ y9 G2 \
- in al, 92H
5 R. `2 d6 i4 k& i0 o' t - or al, 0x026 q3 E% G# t9 ?) Z* @& [; Q$ [
- out 0x92, al! ?! e4 a; F9 g( [3 g% _
- out 0xed, al
, Y9 v) M* V8 a0 E5 b9 | - popa; d. ]: U t* ^3 ^; e+ D
- }
) j( [+ y' Z2 \7 C! o" i - } v2 ^% v8 R( ], ]
- * D2 |7 @! L7 Q1 R
- /***********************************************
4 f6 U: J$ j4 q, q) b* a& r" ~# w - * 函数功能:进入DOS4G *$ l1 x5 A0 W( F& M9 h6 \
- * ==================== *. T3 c, X$ Y# \: J
- * *
' M5 O0 E: x0 H' s - * GDT描述符界限计算方式:描述符个数*8-1 *2 E9 e9 Z) e2 }' M9 l
- * 如: *
4 u& [' U0 E! y# k7 n - * mov word ptr GDT_Addr[0], (2*8-1); *% R; b/ @; d$ Y( k `) l. H* D
- * 表示为 2个GTD *
0 \ M$ B2 Z1 @0 h: s - * *
, j& ?5 K* F7 V) N' O - * 选择子为所在描述符内的字节偏移。 *
/ M( O5 ~& z: a* A$ O - * *" B! Z+ ?9 h$ R% L4 C1 o
- ***********************************************/
0 D1 V$ {3 n1 h( v0 W0 M3 c) ? - void set4gb(void)
7 t! }" s* n7 v - {! g3 t6 |1 Y$ N W% m' ^! ]
- asm{) a: Q/ y" d9 _ N- f% x
- cli
/ j' g+ S: b$ T$ H8 S! c - /****************************************- c# h5 X9 d* C" y6 O# M( U
- * GDTR寄存器 *
( V2 N+ ^6 \- A - * +-------------------------------+ *- j$ H' t r" ^) |' e1 _" j; J9 l7 ]
- * | 32bit基地址 |16bit界限| *6 j: e6 G$ P7 F4 B- d0 k
- * +-------------------------------+ *' L4 @' K* V4 U7 U: u
- *****************************************/
4 P- _- M; i7 t" y - /*********************
+ l* x/ A+ n9 q( c% L - * 得出段界限 *+ j1 I! K, J# D Z7 N# j: R+ O
- *********************/
3 W6 _2 p( h$ |- r - mov word ptr GDT_Addr[0], (2*8-1);
5 n4 |9 D( d6 J( B% U - /********************************************
) Y. j: _% }- | - * 计算GDT表的32位基地址,存入GDTR *, o; l$ p8 X" y* r. E2 y
- ********************************************/
4 o, o. y( l) T6 Z8 Y( M - mov eax, ds
, E6 \0 F" @- r, ~ - shl eax, 45 t2 f+ t5 t, \# |
- xor ebx, ebx1 D0 G" U$ D, g4 l" }
- mov bx, offset GDT_def! M8 j" j( m, C! U; L# U
- add eax, ebx2 c" k( b& |5 C& H# h) p* |
- mov dword ptr GDT_Addr[2], eax
h* o: x7 u" d) s - lgdt fword ptr GDT_Addr9 q& j3 y3 E" S5 ~/ X4 Y4 f2 L
- /********************8 e% J/ U( C; S6 P
- * 选择子偏移 *3 M5 O% U6 N! N* [% w, T: L1 ]. Z
- ********************// l( r1 y! s2 [+ ? @. ~! ]( [
- mov bx, 8( _. ?0 H/ i5 q
- mov eax, cr0 F4 f" Q( A& X" D
- or al, 13 o: V0 O; i; p# M6 j$ o
- /**********************
, @: R$ P" L+ N* e( x3 g+ p+ i - * 进入保护模式 *
3 @: `7 U8 e7 ?$ I - **********************/8 a% \: G, i' u' R
- mov cr0, eax
6 U0 r0 a6 z8 |! a' _( P4 l0 n - jmp pMod3 c M* y# ]- C
- }
& _, C$ p0 I# |! Y5 o H G7 p - ! k& {" s) L7 o6 e& B( x
- pMod: asm{
$ a; i6 W0 }. f" Q1 \ - /************************************************************
! M4 F; ]6 R. t/ y, ^; a8 M - * 让fs与gs加载选择子,使其能访问 0xFFFFF * 4K (4GB) 空间 *- _" j& X7 @8 a0 P5 L. Y
- ************************************************************/
) E3 m) `# t/ y$ h" B$ u" S( t - mov fs, bx
- `9 D6 E# d# @' h8 x W9 L - mov gs, bx4 `7 l6 U; L: ]7 ]& r2 k. k
- and al, 0x0FE% U5 {9 S4 {/ h: F/ c
- /******************* S* z* j& ^: R" Z( R& m$ `6 K5 T
- * 进入实模式 *
! T7 k& h6 L) @ - ******************/
6 U' \3 P$ L" B' I1 h - mov cr0, eax; x* y2 a( [8 e
- jmp rMod
& D& A9 Z/ N0 n) Z% H+ b8 d k4 {# U - }
! z% n( \" U( E1 B C/ U
# B, w9 p x# A) H3 r# L. }# i( f- rMod: asm{' }. D) F [ w6 b) v# o( v
- /* ******************************************************************! L5 ~. P; k F0 Z+ g% G! x
- * 退出,fs、gs清0,访问系统内存可用: gs[32位,相对于0的偏移地址] *
5 n4 e2 Y( v' s+ B - ********************************************************************/3 Y# M: |7 T. i
- mov ax, 0
% f6 V3 f7 _% _' C4 T - mov fs, ax& b4 K+ F( f5 @# |1 x6 \, I& s; A5 ]
- mov gs, ax; ^' c( s' G% _/ q6 a
- sti
" D+ M6 k3 L) ?! M - }
7 x- ^- T0 }2 J/ ~. Z" J b C$ Y - }
复制代码 这是asm的- ;/********************************************************************
% l, f5 ]& f2 _6 E8 I: R4 e - ;* File: DOS4G.asm *. r1 W: y& D1 }% M; v3 k
- ;* Compile with masm ( Editor: Tab size = 4 ) *) e- H% W. ^. J3 P1 |5 h7 [5 p
- ;* *% k9 Z) z. F) x2 ]: R5 a9 h
- ;* ========================Title=============================== *" o* y3 c3 m) F$ l; a0 w( x0 O' ?2 ]
- ;* 这个demo是让系统进入DOS 4G模式,进行数据访问 *
f# V! A6 |3 s3 R( ] - ;* *
. U M5 r+ x. x9 x4 g3 S - ;* ===========================History========================== *! `% H/ ~) C- [3 [6 k7 u
- ;* author: bini *% R- a. v. v8 X' `& @5 p( Z+ Y5 H* o
- ;* date: 2008-10-08 Frist version. *
5 ^9 }( M W1 i% W - ;********************************************************************/ ! G! ~+ ~) }$ B( _9 c
- .model small
0 E' _- S7 j4 w. f& u - .586p
' ?& ~' h* W2 P$ D -
( O4 \% O' F6 G - DSEG SEGMENT USE16 ;16位数据段
i% E9 m, y$ _( I- }
. x5 \. h" h7 W* p( E- DESC STRUC
5 G8 u; k$ G- ~1 C$ t - LimitL DW 0 ;段界限(BIT0-15)
/ \% k/ N, h* a# [. A - BaseL DW 0 ;段基地址(BIT0-15)8 Q( L" K6 X( ^/ i0 i
- BaseM DB 0 ;段基地址(BIT16-23)
2 \2 l, q+ s# `0 J - Attributes DB 0 ;段属性* P+ d3 x, G0 j2 x( I J
- LimitH DB 0 ;段界限(BIT16-19)(含段属性的高4位)" v! F" F, T8 w3 z
- BaseH DB 0 ;段基地址(BIT24-31)) T% }+ O K7 ~- p
- DESC ENDS0 A3 `9 R/ y8 w; s I2 j! Z! H
) ?, a. b, Y0 r& s H- PDesc STRUC
! k! ^ S- X+ \. Q - Limit DW 0 ;16位界限; ]! @# I- r2 g3 P. k4 j6 g
- Base DD 0 ;32位基地址
" z- b; ^" q; _3 F0 s7 U: Z2 e - PDesc ENDS
9 W& A1 c8 z9 L. y7 ?6 X - 4 ^. v# @/ x6 F3 U6 G, x% z
- GDT_def Label Fword# ]( ~; Q9 |0 D( T7 X* M
- Null_Desc DESC < 0h, 0h, 00h, 00h, 000h, 0>
/ M: D' S( l$ t - Data_Desc DESC < 0FFFFh, 0h, 00h, 92h, 08Fh, 0>
' T9 q' R7 M$ _/ L/ I
" \0 r% U7 [$ U4 Z4 V1 r- GDT_Addr PDesc <$-GDT_def-1, >1 g) D: m# j/ X; ^* w5 h2 a
- DSEG ENDS ;数据段定义结束; o/ o/ Y6 A& o! |1 w6 X
2 R- `9 {. e& L9 W8 R: L- CSEG SEGMENT USE16 ;16位代码段$ p! c% ?3 j$ L$ q, q9 U
- ASSUME CS:CSEG,DS:DSEG
7 [) d; `/ ^2 M, e9 ?4 B# r n& E - .Startup
# M$ E; q4 Q5 X" q( i: I2 M2 u* n; U - call Set4gb
, S( F8 G/ h7 m6 H; k) p% _5 w/ s - ;9 q: o7 X2 @6 x
- ; fs, gs即能访问4GB空间
9 E: |0 f! F. P* v6 j$ O% d - ; write your code in here.
" H& }0 ~8 r; i, p - ;6 w0 i) x1 q% e0 i+ W
- .exit
5 V4 C! j d( c" c4 U -
6 V4 A. |' O3 w' N& C& b2 t - Set4gb PROC NEAR
9 v* r4 M! c0 `0 p% o" X2 M- W% T/ `# \% k - in al, 92h5 e$ ^5 H3 c/ J+ z
- or al, 002
5 }) \( D5 f: Q- v! y: H( ~ - out 092h, al
" U1 r2 X2 t( R6 H- j! m {; d - out 0edh, al
; e6 N, g9 C3 Q. \ g# A
/ |7 ^* [5 w+ R: @/ w- cli
! {2 @) q @7 N3 f - 5 S2 c5 n' o! C9 e& Q
- ; mov word ptr GDT_Addr, (2*8-1);
. \, b- v# \! L7 S) l - " t. t6 Y5 r8 b5 u! F% V# F) I
- mov eax, ds
* }, j* E% z( \6 e2 N - shl eax, 4
! z& ~2 ?5 B# w6 M# s - xor ebx, ebx
/ ~% y! t' o: R" s! e2 C( ? - mov bx, offset GDT_def( `9 r t) R4 N( \4 ]
- add eax, ebx: M$ s3 X& I- A( u( B4 |1 M: k6 \1 d
- mov dword ptr GDT_Addr.Base, eax' s. B8 }; i) [2 T
- lgdt fword ptr GDT_Addr
) W3 x- r9 |; P/ e0 f9 s/ S! ^4 { - - o% D2 _% I- W& o9 v" ~
- mov bx, 8
+ J" C g; j8 s8 E' | - mov eax, cr07 ^- \; v9 `# h4 r: D( E0 H
- or al, 1
2 N! T; e W$ y6 [0 |' U/ t - mov cr0, eax+ v& m4 o% V9 `. U
& W! o' N3 x7 ^# @4 W0 c- jmp pMod( V( T6 v# S9 r+ N
- pMod:
p, u: Z) W/ W v4 e+ n: i - # Q ]0 p/ W$ @9 ^7 v" X
- mov fs, bx) |3 h8 X0 C1 {; o% f5 ~
- mov gs, bx' Y8 a2 }0 Q6 g! R
- and al, 0FEh
1 p9 e( C/ V& _, Q2 s' A - mov cr0, eax& V: e0 p, G8 G( C( x: t7 {
-
/ R6 ~& S9 v. Z - jmp rMod
U0 t/ ?6 E0 F* d2 ?! G- f$ W - rMod:
+ c1 O8 X2 Q# n" y; U7 f* a - T. r/ \: o+ ^9 E+ S
- mov ax, 0- s$ {- S( c' J( K
- mov fs, ax
I! a( C, q) } - mov gs, ax
8 R8 U8 a h3 b$ W9 _6 { -
3 S' Y! |* V+ F - ; 在2M的位置测试写一下数据( V8 i. t% O$ p, }5 S/ v/ u
- mov esi, 200000h
- V1 W- r: C. b) G7 c1 o+ H! j - mov dword ptr fs:[esi], 055aa55aah
; U: Z* ?/ T( } - ; 用RU去看看200000h的位置是否是此数据....
: g8 p) S" N2 x' s/ ^! B
1 [% J$ z7 M' v# e& I! h6 X7 F- sti6 i- i) e: D7 F5 H5 W
- ret9 f( o6 w# }! ^3 _6 e
- Set4gb ENDP
& M w; \) f9 k& I. w9 \1 O' N6 y; U -
7 e& O" G0 _* c - CSEG ENDS ;代码段定义结束! H) K% X5 r4 I! y4 v/ P
- end
复制代码 |
|