|
刚学习的同学,有些还不会,我这里贴点C和asm的代码。只供参考。0 t `3 n; U" k: H0 x4 n* U. y
+ D! e, F' b" ?* a* f6 B$ _这是C的- /********************************************************************) O" t/ e' @& E6 M
- * File: DOS4G.H *
% C! S8 F6 c( b4 Z& p4 G - * Compile with BC 3.1 ( Editor: Tab size = 4 ) *
7 k: X5 I' Y4 c - * *
6 |3 t1 [) k; ~* U, S( S; x2 u - * ========================Title=============================== *3 A# Q& s6 F; H/ Q/ L/ G7 ~
- * 这个函数是让系统进入DOS 4G模式 *
7 n' d" j. c/ D0 M - * 程序参考了:陈家琪《DOS实方式下直接访问4GB》 *3 A7 o* f6 [, r: R& m7 x0 I( ^2 d% P. }0 S
- * *
4 N# m r6 ^1 g' s - * 使用: openA20(); set4gb(); *
+ N# B- Y* V$ X" C" k! \ - * *6 P9 J4 ~6 h! Q8 k/ o4 N0 ]/ B% z
- * ===========================History========================== *7 B9 ^; t8 @1 H- w( \) c* h% j
- * author: bini *2 y: ^' f$ V$ h$ D! r# H$ p
- * date: 2004-11-30 Frist version. *
3 v3 P% \) |+ F( ^. q - ********************************************************************/
5 ]+ x3 D y) G1 ] - 7 ]! G' Z' Q% G) S, @7 k/ B
- #include <conio.h>6 y) m" z6 t; x3 b
- #pragma inline
5 P3 E5 l1 S3 b+ M/ ^1 i. f7 y$ h - - P( W. Y3 D4 Y% W: f+ }
- /***********************************************
: O+ K/ w* e; E: [1 H5 X# `+ }0 r+ K - * 两个GDT,第一个为系统使用,不管,默认为0 *
, v$ ]. \. u3 b+ y: `, Z3 h3 g, Q - * 第二个为一个数据段,没有代码段。 *
8 B+ L9 p* F/ W' H - ***********************************************/
/ d( e" n- N: a6 @; h - unsigned long GDT_def[ ]={0,0, /*系统使用*/1 x# ~' Q' u6 `
- 0x0000FFFF, /* hi16bit( 0~15 ) is base low=0, . D' @ S, H3 V/ X3 x" v' V
- low16bit( 0~15 ) is limit low=0xFFFF 2 O3 u$ l( w# e$ Q# ]1 h
- */
) P$ |- k3 K+ T2 h5 @- g& b7 q - 0x008F9200};/* 最低字节为 base( bit 16~23 )
- d6 @. l D! K3 E - 最高字节为 base( bit 24~31 )
( ?3 @' m2 w# ]& I( g -
5 G8 b0 V: E. a4 q6 I" z& B1 f/ x - 属性Attrib = 0x8F926 |- C; @7 ^0 h4 w2 m2 M
- 8 a0 n! M/ O+ K+ l/ P# H$ s
- 属性位Hibyte低四位为 - y' T W, \3 }: v6 s1 q
- Limit( 16~19 )=F: x" F9 Q) W. |* \, r
- 属性位Hibyte bit7 为粒度/ m# [1 Z$ `) N* v
- (值1=4KB粒度)- @* i# l( B+ ^# O1 w
- 8F & 0x80 = 1
% i3 Z% z8 l- v$ S -
0 t8 a* Q! U- t0 o0 {) L - 属性位Lowbyte低四位为段类型,值=22 a" Y' p+ Z$ |/ h: N* d. b
- 表示为可读/写段
4 F+ w3 I- l0 m; Z - 属性位Hibyte高四位=9,bit3=1表示:
5 E$ L' }" F* z [& C/ C4 ~0 ` - 描述符对地址转换是有效的。
' E4 Z1 c7 x) a1 U: ?- { - bit0=1表示为:
* e0 [# A! W' ~; ~0 C - 系统段描述符。而不是门描述符。
) w: m( p3 V6 i2 z - ( E* ~% g8 |, U, o. i, o& K
- */
9 j% z' V2 w- c3 M. B3 q8 b - * u, [1 W1 c. ^3 s$ S/ V, W: g( g5 y
- /****************************************. i3 [8 K4 {# {9 b: `& n' ]8 f
- * GDTR寄存器, 48bit=6bytes *
) Z W1 k! d5 i* L2 D. K - * +-------------------------------+ *
1 [: Z9 A* i: ? o4 y - * | 32bit基地址 |16bit界限| *% B+ }* [3 R3 i. b
- * +-------------------------------+ *
3 R7 e1 D3 h+ } - ****************************************/
4 `) W3 w. ~, H - unsigned char GDT_Addr[6]={0};% G+ N8 V1 p% R
- ( S9 {( I+ K3 ^; z9 M
- /****************% | b9 ?# F2 o6 C, Y# E6 C
- * 打开A20门 *
9 g0 s3 t/ x& j# j4 X/ ? - ****************/) W9 C) x; r3 T! L8 w0 Z9 ]
- void openA20(void)
, Q+ s5 L+ k7 Y( d% z - {
' p. L- ?. P7 B! \ - asm{6 P6 h: F/ x; U4 w" ~
- pusha
* w$ M3 Z; {5 N! P3 _! M3 U) Z1 P/ ` - in al, 92H
& f& c+ W9 p% |4 `9 i - or al, 0x02+ R2 [ @3 e, {2 U: j- v% M
- out 0x92, al \, q+ F! ^: B% i
- out 0xed, al
* G9 u8 f% y* d3 G9 X - popa9 R9 a( `' c7 b) B
- }8 V! V1 j. w% y) }* _
- }
6 t5 d7 G( ~4 M) T, F - 0 g# c& I& L' S
- /***********************************************
5 B/ x' ]6 W7 A7 {& u5 | - * 函数功能:进入DOS4G *
9 d b& C* b9 @; k5 G - * ==================== *9 I$ Y8 [2 C/ I! s
- * * h C B4 g! y3 w
- * GDT描述符界限计算方式:描述符个数*8-1 *
1 p X: H2 W5 B/ i - * 如: *
6 i' g* r* V2 b, f - * mov word ptr GDT_Addr[0], (2*8-1); *, i f& F/ I0 b* w
- * 表示为 2个GTD *( I0 Y/ v. v8 K) u( ]: L
- * *5 i% X: V: H) g% b
- * 选择子为所在描述符内的字节偏移。 *, e0 q, B: v u. u1 y3 e
- * *
: x% D6 o8 y3 g$ U% \ - ***********************************************/0 ?" Z& q) Q3 M, N, ^* y: c( C
- void set4gb(void)* Y9 j9 J7 K" [2 U& P6 O) Q
- { K3 z9 E8 d* x. [4 h
- asm{: |0 T/ ?7 d" B3 d7 W
- cli& f8 \ R1 y# R& j* ]6 {# z
- /****************************************" w- @0 J' m+ D# M* S" i
- * GDTR寄存器 *
% i+ g& M/ Y. C6 a - * +-------------------------------+ *) X1 a8 d& m$ u
- * | 32bit基地址 |16bit界限| *
; `; q# O& d6 y: W4 I - * +-------------------------------+ *
0 X! U" {0 G2 x2 i; x9 n - *****************************************/
, i6 j( Y* A" [1 F4 z3 E" p - /*********************
+ z( e9 M8 O7 b - * 得出段界限 *
; T" S* `; O% V2 C# l1 h - *********************/
. k6 b+ ?1 t2 L4 c/ K/ h - mov word ptr GDT_Addr[0], (2*8-1);
; o$ [0 R+ Y V - /********************************************, t) A" l+ `% t2 R; i
- * 计算GDT表的32位基地址,存入GDTR *1 Z+ g0 k K7 B2 @
- ********************************************/) e7 P, ]! q! a$ i9 e
- mov eax, ds% c) r3 u6 O3 Y x( h8 Y& l$ g1 ^
- shl eax, 4* x# ~9 ]* R" Y: ]; `5 `
- xor ebx, ebx
# H8 f) V# Y# Q2 Z3 m8 V$ S0 c - mov bx, offset GDT_def
- k4 W/ n, ]% w' J - add eax, ebx- f: {2 c2 Z9 B
- mov dword ptr GDT_Addr[2], eax
* o7 d0 K" H8 E& b4 O - lgdt fword ptr GDT_Addr1 Q p6 Q# s1 C3 d
- /********************
! z' n$ H8 S0 x# X" p - * 选择子偏移 *
- K5 I& [3 P) @! x' G( H! t# ? - ********************/8 B6 _5 a9 j/ ?
- mov bx, 8& D! y7 {9 @ h, H* w; \2 {2 D
- mov eax, cr0' z+ n9 J2 o7 s
- or al, 1& \ s$ }" V# l2 [5 d' ^
- /**********************
/ w& p8 d* b' S8 j0 _0 m5 D, V - * 进入保护模式 *
( L7 L5 O% d8 r' K) k3 U - **********************/* F# M6 T) a' l( l0 @, D+ T2 K
- mov cr0, eax' k8 i# [* L+ x; q* x8 g6 e6 m' S
- jmp pMod+ B/ s* Q' A3 `. a
- }
3 \$ k8 F2 v, F# D& E: C( F
; o( @6 H) X* p; I2 N7 J. [- pMod: asm{" L! T. B2 m- w7 k
- /************************************************************
/ t( X2 w7 V' M( X - * 让fs与gs加载选择子,使其能访问 0xFFFFF * 4K (4GB) 空间 *
5 H( v+ d& g# i/ p' M: w - ************************************************************/( r1 W$ g3 h6 G- a6 I1 M3 T$ k8 Z2 b
- mov fs, bx
- d a5 c2 N& ]+ g - mov gs, bx
$ V& u7 T& c, S+ ]$ _! A - and al, 0x0FE; E; j5 [; q) w/ P. o3 Q0 Y
- /******************
! [1 b+ ^; r9 s9 ] - * 进入实模式 *" @/ j$ N: v0 B; M9 _9 p
- ******************/
2 m9 ~; B4 y5 Q, v - mov cr0, eax; n- w1 I# z* @- I9 w# |
- jmp rMod3 p7 ~ `: s' ? Y/ N3 p, g* F4 J9 m5 C
- }
: l" \/ A# `5 ?( i - 1 ?% d, a" C) T6 ]9 Q# ~2 z
- rMod: asm{
# ?3 s' N0 b; q* u- k0 Z u - /* ******************************************************************
: q9 s. [* D1 \, d _( o/ Z - * 退出,fs、gs清0,访问系统内存可用: gs[32位,相对于0的偏移地址] *( |7 `$ G3 p, W' Q6 J
- ********************************************************************/# B3 w c7 N6 v- z' m3 r6 J2 v
- mov ax, 0; S! \; x5 e3 Z* Z) L% |
- mov fs, ax& f* D3 H! F" j, ~4 h: X% ?& D' L# D
- mov gs, ax! y7 ^, y$ E5 q% }' v
- sti: g G }% \6 r* [6 o
- }
# ^; @* W( W8 l' ~2 x - }
复制代码 这是asm的- ;/********************************************************************
) C: q2 t0 m. i - ;* File: DOS4G.asm */ T" P* c! {! A
- ;* Compile with masm ( Editor: Tab size = 4 ) *
2 p/ o( O+ ^5 T. f: y0 w - ;* *5 q2 d9 T5 W8 b5 `8 u' S& r# v
- ;* ========================Title=============================== */ a; O. e! S* T" A: q
- ;* 这个demo是让系统进入DOS 4G模式,进行数据访问 *5 Y0 X6 o$ b& ^2 Z2 l/ S1 i
- ;* *
% f* ^) i% j3 S% ~( P" |" T9 G - ;* ===========================History========================== *
' _) W1 G& N/ M$ I - ;* author: bini *
: V/ e1 F) h- G5 `0 @& U# r - ;* date: 2008-10-08 Frist version. *
: e8 s) e( P& o) U( l" R5 U& m - ;********************************************************************/ - j. b; w: b. @7 j6 E' i
- .model small
( m1 t5 d4 ]8 R2 {0 g- L* V - .586p
m8 S$ p% a: W/ L I- n* } -
1 c* O" ^* Q; W' P* I+ |5 @6 l - DSEG SEGMENT USE16 ;16位数据段
/ w) u% m9 ^. Z
' l# n+ |9 S1 L. |- DESC STRUC
% R/ J9 P7 [6 P9 B3 k - LimitL DW 0 ;段界限(BIT0-15)/ i" q( U) {7 r8 r7 H
- BaseL DW 0 ;段基地址(BIT0-15)
) E: o0 z0 v: O9 _( P# O) g7 i" J - BaseM DB 0 ;段基地址(BIT16-23)
! T# F1 n4 t: v$ d2 @. J - Attributes DB 0 ;段属性! V- I3 r3 Z4 C+ T
- LimitH DB 0 ;段界限(BIT16-19)(含段属性的高4位)* g, G$ A) \8 h; |0 Q1 b# D
- BaseH DB 0 ;段基地址(BIT24-31)% J8 X F) {% K0 C5 p6 i, ^
- DESC ENDS1 Y& S$ R5 y0 ^# [% A1 g
0 ]7 y- z; `6 r# X% c- PDesc STRUC, ?, U; Q4 ^3 S" ?4 |# m, K+ z& |
- Limit DW 0 ;16位界限( h, Q- X0 j, p* X( S! r' F8 z B
- Base DD 0 ;32位基地址
- x+ A1 O- } ?0 y - PDesc ENDS% S2 J- i* a- ~- S9 |/ v4 l# ~; L
7 _+ d6 q) e- v- GDT_def Label Fword
+ T! ]& a/ }$ F! q) p - Null_Desc DESC < 0h, 0h, 00h, 00h, 000h, 0>: w. c! D- X2 T) V0 s1 @; X/ u
- Data_Desc DESC < 0FFFFh, 0h, 00h, 92h, 08Fh, 0>
3 h7 {0 l" E6 U: ]' X, O _ x - 9 d! _, a7 s4 O* |) P
- GDT_Addr PDesc <$-GDT_def-1, >0 V. n* B- H4 {3 E! u$ ^" j# t
- DSEG ENDS ;数据段定义结束
, r! n. s1 p' @! S% l& N
S$ I7 g" b, {- CSEG SEGMENT USE16 ;16位代码段( i2 a8 T' d: y5 s5 P# K
- ASSUME CS:CSEG,DS:DSEG8 L* K3 ~7 w, B1 Y6 z6 a
- .Startup0 G/ _: C0 {2 Q! T* w
- call Set4gb
- U* X7 [9 n2 L1 c N - ;
- y) @' F6 q1 I2 _% o( C" L - ; fs, gs即能访问4GB空间
# R8 F2 F7 f- h/ U C5 ? v2 w - ; write your code in here.! T# e* H% V/ ^" ^$ M! G
- ;
2 _: ]9 m3 ?' F. h' e - .exit
4 G+ v, h- |1 I# Z0 H: P - ) R: F) y% T. i/ b
- Set4gb PROC NEAR
& A; W4 E9 n A$ U& M - in al, 92h
; q. r @7 c- E8 r1 @# P, f. H - or al, 0027 V' g) T* i( Z) m3 e
- out 092h, al5 i* T0 N6 h! R0 e
- out 0edh, al
* r4 P( u6 A4 f% s% G6 a' w. L
1 i8 e) _" a! c# m- s( g- cli
m2 H/ G. }. k
" d0 E) l' H7 Y+ s" J- ; mov word ptr GDT_Addr, (2*8-1);
( ?* t8 R5 [6 m- P
3 W- Q0 d) I+ V- mov eax, ds
9 l- m2 u6 F0 e! M8 R& X. ] - shl eax, 4
! W0 D0 Q* d' C - xor ebx, ebx- H% f2 H$ x j, X- {
- mov bx, offset GDT_def2 a7 M8 P/ M, i: x! `/ @
- add eax, ebx. M* E+ S O* P5 Y9 ]
- mov dword ptr GDT_Addr.Base, eax8 f! G$ i& N/ F
- lgdt fword ptr GDT_Addr
7 n7 W$ w! N3 T) `/ Y% ]- g$ B) v
& q! y! \) X y( g$ Q; g- mov bx, 8+ {) |6 b) W2 A7 s+ q i
- mov eax, cr0 i" g2 D1 i# C1 ?
- or al, 17 M! A1 p0 K) g, v& D
- mov cr0, eax
) L/ o; |2 ?8 p6 y6 Q* O - ^& {5 o0 j9 B2 B2 U
- jmp pMod
7 P+ V) `) \! K2 Y. w - pMod:
" Q0 @' q! ?9 n! ~
" g8 L* J6 q P. Q+ s3 H0 `+ U8 R* [- mov fs, bx
- k& H- Q+ n4 U5 l6 e6 g3 K, K - mov gs, bx1 X) z; M' o' s8 ?: u
- and al, 0FEh
8 D7 g3 J3 k. ~ a$ v$ q$ B3 V - mov cr0, eax
* R6 _+ s0 p7 I -
) N4 Y" I9 H7 J& Q) a - jmp rMod# K0 p- i5 M1 p' W
- rMod:+ B6 ]$ j/ I0 }' M- M# p+ p
- ( x, x4 q( }8 i
- mov ax, 0$ E. W" N, ?* b d+ u6 m3 v) [5 T: g% u
- mov fs, ax
# B+ N- ~' o. I/ d) { - mov gs, ax
* |% Z3 K0 N! e& Y! y -
3 j( D3 z; S8 J4 ~* t1 }. j& l - ; 在2M的位置测试写一下数据# Q" L+ |9 k$ L' R' d& [; m
- mov esi, 200000h
) v& E; i% W9 ], K6 ?3 {& | - mov dword ptr fs:[esi], 055aa55aah) S+ Z! n* w. G: b$ O/ T$ o7 `
- ; 用RU去看看200000h的位置是否是此数据....' r$ H$ S3 @8 \
- 1 D( Q- A9 O1 x* |
- sti
1 e6 Q" E' e( z t, E4 } - ret
9 ?0 H; o: s9 [ - Set4gb ENDP5 y) u# O F" X7 u
-
3 c8 z3 h2 ^2 q/ V* H, N - CSEG ENDS ;代码段定义结束
% B+ V1 B+ M( u# p - end
复制代码 |
|