|
|
刚学习的同学,有些还不会,我这里贴点C和asm的代码。只供参考。 S7 y7 ]; N% b' _& A
5 H8 Q( C+ [) l. y+ |0 v) p这是C的- /********************************************************************$ ~# ~ w H! ]
- * File: DOS4G.H *! r5 z# |. \1 \5 A
- * Compile with BC 3.1 ( Editor: Tab size = 4 ) *
! o* a2 v! ]. o& I' O: m2 a - * *
( Z# V0 s; ?/ e* Y$ _" b9 n - * ========================Title=============================== *6 s5 S% M0 ~6 `5 B
- * 这个函数是让系统进入DOS 4G模式 *& P2 F/ S% \5 X( _$ A& |
- * 程序参考了:陈家琪《DOS实方式下直接访问4GB》 *
9 [* `) S6 S7 z7 [0 o - * * f' y& f$ v2 i& ^( _
- * 使用: openA20(); set4gb(); *
, k. `0 {+ t( x# Z; { - * *
+ `: l$ q2 ?3 X3 }8 a - * ===========================History========================== *
1 ^+ S1 g7 V! Z u0 m8 P1 k - * author: bini *, K( @' v' b5 s, h5 y
- * date: 2004-11-30 Frist version. *6 l, ^0 x1 e3 n
- ********************************************************************/3 J4 Z* Z/ @; w/ {
0 N$ J6 j/ s& T' s- #include <conio.h>4 A6 I3 t4 l) w8 Q/ H
- #pragma inline
7 B" R; z; W- @1 z - 7 `1 k0 J) z9 d
- /***********************************************
9 ~% F- L' J& v9 Z - * 两个GDT,第一个为系统使用,不管,默认为0 *
$ L, B5 B/ x, e+ P& V6 I g - * 第二个为一个数据段,没有代码段。 *
# [/ q! A C# L a, w - ***********************************************/" z2 g% l' ~5 L5 z: M
- unsigned long GDT_def[ ]={0,0, /*系统使用*/" e9 v+ M! N2 @( H; Z4 z: N; F
- 0x0000FFFF, /* hi16bit( 0~15 ) is base low=0, 5 K+ c. |, y: t$ B) |
- low16bit( 0~15 ) is limit low=0xFFFF ! ^; N& x. V L
- */
) M6 `8 u5 p9 H0 {* M - 0x008F9200};/* 最低字节为 base( bit 16~23 ), b* V; Z2 B' A5 T5 @8 K
- 最高字节为 base( bit 24~31 )- G. J K- j( A! M* H) F
- ( W2 [8 i$ ~. U% [
- 属性Attrib = 0x8F92
! Z4 @3 g! m8 n* I - + m) p# u) n7 {4 Z: A, l) A' \: t
- 属性位Hibyte低四位为 8 V, W8 ~+ P1 U9 q
- Limit( 16~19 )=F1 W0 |9 m! A4 M- s5 U+ ^* i
- 属性位Hibyte bit7 为粒度
: f/ T8 l: U) s& b6 { - (值1=4KB粒度)
1 N5 Z3 v3 a, Y8 e f - 8F & 0x80 = 1# v5 i& q) X1 p5 o8 |8 t4 ?6 U
-
/ n0 w3 }3 Y3 l9 h6 D% X* Q% W - 属性位Lowbyte低四位为段类型,值=2. i1 t/ L' v) w k$ }9 k' E: p
- 表示为可读/写段
0 U; V0 o4 m0 N& ]/ c" ^+ H - 属性位Hibyte高四位=9,bit3=1表示:4 g, N) B. {0 J3 r& X) Q
- 描述符对地址转换是有效的。; b; X6 a6 d4 J @9 Y
- bit0=1表示为:
$ \ J3 u* q' x$ W6 M - 系统段描述符。而不是门描述符。9 |8 K9 J! `% D. b h7 N6 [
- 1 L9 y7 ]1 b: d0 _. U
- */
& u5 P3 M' S' z6 p+ I - & \$ a# s9 M* S: j
- /****************************************
9 V% Z8 G3 D- q3 C5 _ A3 K - * GDTR寄存器, 48bit=6bytes *
1 q" i) f$ I1 P% d8 Y% U& [ - * +-------------------------------+ *
( C) d c; s" F$ h' g* _6 k+ ~" B+ ^ - * | 32bit基地址 |16bit界限| *. h' J$ q U/ b0 }
- * +-------------------------------+ *
" C$ a5 b( U7 R5 v4 f - ****************************************/
4 Q" `( v( b% Q# I - unsigned char GDT_Addr[6]={0};, y! b* k5 s" A4 [9 r1 r9 O
/ `( T; z y, K4 L- /****************; _# D: V* s' y D6 V, i
- * 打开A20门 *
8 g4 Z( T; f8 {6 k6 X: c - ****************/% E: K! U5 Z! A5 `. b2 u+ }" x
- void openA20(void)
/ i4 B# K# p) X. i - {# T' Z9 K) e) c; z
- asm{) D( |3 M; Y' X, z* @' q
- pusha
1 c, B# w0 m+ m# O* O f$ e" j - in al, 92H' z4 J C, y; ?6 q ]* P2 r6 a
- or al, 0x02
. g7 |$ t }# c - out 0x92, al
2 n2 n; s- Y) D8 K# l+ d - out 0xed, al
* P% [% ^" ^! J B9 @ - popa
% w) M/ f- D4 N w1 z - }7 ^2 ` A4 N8 j& R: o" |
- }
5 g2 h i' s1 x$ q- K% l - 2 [; J9 y9 Z4 x: I
- /***********************************************1 G! ?: F# h1 ^- d
- * 函数功能:进入DOS4G *8 S& |6 J0 D) S8 i8 o# C
- * ==================== *; j1 n7 }1 V7 _* q5 ]* e7 h
- * *- K0 n. t1 K h7 D9 w
- * GDT描述符界限计算方式:描述符个数*8-1 *) T9 {/ i9 Q( n' b# U }+ @" a
- * 如: *& Y9 i- P$ C2 H' O
- * mov word ptr GDT_Addr[0], (2*8-1); *' w: W$ m3 z) L# b
- * 表示为 2个GTD *' y: o# I M1 z% u
- * *- V& y. v8 F: \ V' s2 n
- * 选择子为所在描述符内的字节偏移。 *% i* h) M& F( v+ T' _# A6 |
- * *; z8 j0 W- i8 a: C0 h/ G Z T
- ***********************************************/+ j: H1 D5 c W1 C7 o) V. S2 O
- void set4gb(void)9 P; l8 A$ l0 n3 F, P7 |
- {
& i# z1 d, u, _6 j - asm{
$ S/ u% O C9 r$ {6 k - cli
, d( T1 w6 f0 d* @ V$ K# V - /****************************************
: j k% A5 L$ \$ H! @ - * GDTR寄存器 *, n1 v5 L- }8 a+ }+ b1 v0 s
- * +-------------------------------+ *+ Q- ?# c0 S& v/ o
- * | 32bit基地址 |16bit界限| *# \6 ?; S* X& `. D* Z9 x- `; u9 P
- * +-------------------------------+ *
( j7 z+ a* b' }5 ^- u Y - *****************************************/- i7 z" u& z1 w! N J1 V/ ^
- /*********************7 T8 x; o0 P* |) t& W' `% s5 n
- * 得出段界限 *
; |/ O6 y8 n0 i4 t! a# @' ? - *********************/5 C2 N D/ ?; \6 ~8 c: Y7 J
- mov word ptr GDT_Addr[0], (2*8-1);# z' Q* P0 C m1 ^ m4 _) U5 J
- /********************************************& Q0 F; S2 R, U5 {
- * 计算GDT表的32位基地址,存入GDTR *8 k% ~* b: a. J4 Z
- ********************************************/
7 o/ O$ E( ?$ K - mov eax, ds
1 t- I& A# m3 J1 v: n& C - shl eax, 4
: k8 h0 i; ^* p* K - xor ebx, ebx, v8 ^9 s5 R$ \' X* u4 A, H
- mov bx, offset GDT_def
- V3 @. B& x6 M1 n) P - add eax, ebx ^ M1 ]: z0 r% B f. R
- mov dword ptr GDT_Addr[2], eax7 F) L" l: v! p) g' N0 m' T1 h
- lgdt fword ptr GDT_Addr) g- q2 t$ c' ?3 L' {! D) W9 f0 L2 F* K
- /********************: s; d9 Y' H6 l& c0 b n
- * 选择子偏移 */ D: ]5 k" N+ T! Y2 Z& V. ^
- ********************/
+ F$ h8 W8 R& ^5 @* { - mov bx, 8
/ N6 N# l. x: p" N) K9 { - mov eax, cr0" p, N0 T1 H' \
- or al, 14 D+ ?% L" n) g$ W- a8 {
- /**********************4 W! ~- M- z l5 U- L K% C" `% F1 j
- * 进入保护模式 *
) d' |' a5 t0 u- G4 i' { - **********************/
5 j! c. ^3 [1 ^ - mov cr0, eax( S Z3 ]: [- Y( j% R
- jmp pMod
6 o9 G$ Z7 d) I5 E& C4 r - }' k! H" G- N$ C3 R, M
- . ]7 Y, r9 t4 Q, t. i8 T! ^
- pMod: asm{
" H# ~$ X8 p- `; x - /************************************************************+ N1 G& L. b* o" A* S. C- `
- * 让fs与gs加载选择子,使其能访问 0xFFFFF * 4K (4GB) 空间 *
: g' \) e+ c& M y3 z - ************************************************************/
' {9 n3 F! P0 a- z0 x3 x0 u - mov fs, bx" T' W# e2 I1 X. S7 O5 R
- mov gs, bx' H: U M/ l4 `& p f8 @
- and al, 0x0FE
$ W- }4 R6 C: t _ X - /******************% u d3 H0 ~' j% [& l( @' ^5 d
- * 进入实模式 *
: S4 K4 |. b% [- ]9 t* Z - ******************// x j- Y( l1 F4 b3 E4 t
- mov cr0, eax$ F3 T# h7 ]4 m- H5 c' U" |
- jmp rMod7 W- C: g8 ]8 r5 B; R
- }
& J/ m2 r, c2 H8 } J - 9 t( \2 A2 \. e+ a7 @
- rMod: asm{
; f5 S* n/ w# e - /* ******************************************************************
+ S# z6 v( e- a! L - * 退出,fs、gs清0,访问系统内存可用: gs[32位,相对于0的偏移地址] *4 R; U; E$ Y a+ `( ], z) o( `
- ********************************************************************/
r! p2 R: E! q, K" ?& e - mov ax, 0
; O1 q) k- W4 {6 o0 W - mov fs, ax8 i* \2 i3 x$ h6 H
- mov gs, ax6 o( f$ z H/ x, z
- sti h, A' V: y" F4 O9 ?3 m' S
- } U u2 e( _ \
- }
复制代码 这是asm的- ;/********************************************************************
, ~; ^- p0 V, z* } - ;* File: DOS4G.asm *
( J* j5 p" j" @( `2 _ - ;* Compile with masm ( Editor: Tab size = 4 ) *
3 ~% }6 X( i8 N" v- } v - ;* *% ^5 f! f7 O$ h: w, \
- ;* ========================Title=============================== */ Q+ z p6 E* \$ R t: v6 E
- ;* 这个demo是让系统进入DOS 4G模式,进行数据访问 *
; m( U% W5 G, K - ;* */ w; J R, U8 g4 o
- ;* ===========================History========================== *
2 S/ [# S" L: ]% A) q3 u0 ~# ~ - ;* author: bini *6 R# l3 B6 t, k1 E
- ;* date: 2008-10-08 Frist version. *3 v1 Q8 j3 ~6 q: ^& f |, O
- ;********************************************************************/
+ h$ h" c. }0 I - .model small- j/ P ]# o; n0 [
- .586p
' M1 s$ h0 c) Y3 e - ' H% _1 e, | p9 T
- DSEG SEGMENT USE16 ;16位数据段
0 s0 X4 H- C+ L0 B4 i+ g - 9 P2 \4 U+ p1 h* p' m! I
- DESC STRUC
; \! R& g9 D) n( t- t - LimitL DW 0 ;段界限(BIT0-15)
" S2 P+ l1 o- L! t/ ^ - BaseL DW 0 ;段基地址(BIT0-15)
! n) g2 z, E- N - BaseM DB 0 ;段基地址(BIT16-23)) ?- d% k0 [+ S5 f
- Attributes DB 0 ;段属性
# f7 s+ ~- B1 K; H+ T M) E$ ` - LimitH DB 0 ;段界限(BIT16-19)(含段属性的高4位)
- u( n, F" y W - BaseH DB 0 ;段基地址(BIT24-31)0 N$ X, N6 h, {/ ]' Q# G/ p6 M# J
- DESC ENDS
8 I$ Y/ R/ j8 B, j - ) T9 L3 l1 l! v& @
- PDesc STRUC
( [9 R& W' d. W* A% ] - Limit DW 0 ;16位界限" T# w+ n# S3 M, ?4 F$ [# |
- Base DD 0 ;32位基地址7 z% k1 z+ ~, r* _
- PDesc ENDS
3 O" ]. w' p9 y# c4 L
5 p+ b& s# d0 `! R9 K+ f9 `! r- GDT_def Label Fword
* u' l0 K5 b/ v& |6 r$ d: ]1 {, w - Null_Desc DESC < 0h, 0h, 00h, 00h, 000h, 0>
~& |' X- b) L6 k/ L - Data_Desc DESC < 0FFFFh, 0h, 00h, 92h, 08Fh, 0>" V3 s. w ~) A
- ! J( G# w' h1 a
- GDT_Addr PDesc <$-GDT_def-1, >
* q! X! W4 ^9 ?6 a) V: \ - DSEG ENDS ;数据段定义结束
; i& [! C! ?$ x: K - 4 a$ y x: j. t1 c4 s; I* ~% Q8 ?
- CSEG SEGMENT USE16 ;16位代码段
3 p6 s+ ~! |5 P! l0 z3 W* G - ASSUME CS:CSEG,DS:DSEG' [3 N/ b. Z9 H- g7 A' W
- .Startup5 h* }2 y2 t2 }; F+ x
- call Set4gb
, U/ F F, S3 P' ? - ;
( Q& }! G/ Q' R& G: }9 I/ t/ n8 T - ; fs, gs即能访问4GB空间5 P* z" B$ y1 p( z: Y! F3 y( f
- ; write your code in here.+ C0 u/ c( P( B
- ;
; L6 n2 [; g4 Z- N6 k - .exit3 H+ q) S6 ]( T1 d3 |7 |
- ( C+ k) S$ u: m% J3 j* H
- Set4gb PROC NEAR
7 |% D8 b7 ]( _) ?, K- c) D - in al, 92h" K2 U! J5 p% C. M! J" a# {
- or al, 002
: l2 r1 r6 j/ [8 F. F' N' j4 F- g a - out 092h, al
7 Z( ~- [4 M, ~; V, ^; k: @ - out 0edh, al V& j2 o$ U# d5 e: v" P
- . S3 V' {0 E5 W) ?
- cli( R) c: M, y2 E! ]6 v* I( W2 z
- ' g% r) n4 R& q4 @
- ; mov word ptr GDT_Addr, (2*8-1);
8 n# p5 j( i% g" Q( Q - & O3 Q! J. l/ |- m8 _' K
- mov eax, ds
G# z( N, `. N* G6 _8 [8 t - shl eax, 4
: K; {8 a7 x e4 d- ` - xor ebx, ebx' Q( \- u$ U. p$ U6 f7 F3 v1 D
- mov bx, offset GDT_def
1 @6 D* }+ O7 } a3 z/ K5 D6 N - add eax, ebx; q- ?) Y/ D. R& l" x& c6 H
- mov dword ptr GDT_Addr.Base, eax- r5 @. ?2 N7 E, W2 Q% A
- lgdt fword ptr GDT_Addr
' ?& L; k9 _, Y, W - * ?5 o' N; R T8 ?8 ^
- mov bx, 85 ~( B7 H) g. j3 V$ J* x4 O
- mov eax, cr0# H S. h! {8 B* y
- or al, 1, d5 v' Y; J4 L$ V$ m
- mov cr0, eax/ z. e3 D3 w6 {. s- P Q0 ]
, y2 K* Y$ ]# e/ E2 z* N- jmp pMod8 w6 X# A# r) A) [9 M+ q7 p
- pMod:- y P% x7 |! V( [& s$ T
- 5 X+ q6 Y3 ~4 V1 Q4 c6 o0 E
- mov fs, bx% x3 L2 d- K; `* B
- mov gs, bx
' c; r; T \) h; m7 K0 Q - and al, 0FEh
, ~& f/ ^8 h1 ~7 x - mov cr0, eax
- S" U2 U* k9 ?+ g$ I* X -
: t" y& m/ g f" O T. [$ }- f1 d - jmp rMod
" V3 H3 ~' L4 n1 v+ V, H. j9 f - rMod:7 Z; m/ F& x" [; k
" C) B) z: ~* e9 T- mov ax, 0
5 W! z& A3 E4 }4 K' K% V# E9 P - mov fs, ax
% f! j( Z9 n0 j7 Z- [ A - mov gs, ax
8 u' f% s: q4 }+ \$ W - $ }0 E. y1 r+ [" v
- ; 在2M的位置测试写一下数据
# m5 ]0 Q5 J. _/ b* V( C* |3 _ - mov esi, 200000h
1 m, Q8 M9 ?# E$ ?7 f2 x - mov dword ptr fs:[esi], 055aa55aah
, o$ \* s( W0 x8 U - ; 用RU去看看200000h的位置是否是此数据....( y2 J, b! f0 E9 t' E. `
- 7 g9 M D a R+ j3 {2 l% V
- sti
7 }( p# \# @! S# R( B( Z' | - ret
. J% b+ I1 Q5 a. `0 K' u- H - Set4gb ENDP4 ^$ z/ G) z b6 j
-
" d7 m( b( t1 c) g9 o, B - CSEG ENDS ;代码段定义结束
$ q6 _ e. [, u - end
复制代码 |
|