|
|
刚学习的同学,有些还不会,我这里贴点C和asm的代码。只供参考。' n( b& G- z7 f+ J
( d$ F( s0 [4 Y这是C的- /********************************************************************/ q) ~/ K* K. E x$ j9 n
- * File: DOS4G.H ** q; K8 x5 ?7 x% ~/ @! x
- * Compile with BC 3.1 ( Editor: Tab size = 4 ) *+ Z# b5 ?. }1 H: X, g' L
- * *% D, c! ]6 S t2 q: ]& c
- * ========================Title=============================== *
3 T# U2 U1 r( |( M! P+ Y - * 这个函数是让系统进入DOS 4G模式 *
! \' `0 P" m3 q+ Q$ A4 m) W - * 程序参考了:陈家琪《DOS实方式下直接访问4GB》 *
, F$ o% Q4 x" @: `0 ^) |8 h7 T - * *" `8 `3 q3 a& e9 F: @1 ~
- * 使用: openA20(); set4gb(); *1 ?4 }/ {' `2 N2 G$ ^; \
- * *% p9 b6 F* J8 e# X: s9 J' @% u
- * ===========================History========================== *
, X g9 V& G2 [( J( A/ S. z9 Z - * author: bini *
% Q. D- s' C( ^2 k9 R/ N" b) v - * date: 2004-11-30 Frist version. *+ r$ T" \5 [" Z5 d
- ********************************************************************/, E9 e8 f* `* y# S
- / _! n! S( }0 l7 _
- #include <conio.h>
8 G+ f, S5 A& m7 o0 u - #pragma inline
2 d5 \# k L7 p* b; u
- \4 R% S9 T* v: V0 T) A3 b- /***********************************************
# c1 L5 F V* h - * 两个GDT,第一个为系统使用,不管,默认为0 *
& W- n, w0 y: v+ l- J% N2 r - * 第二个为一个数据段,没有代码段。 *
* t+ n/ I* v6 C' x- b9 D - ***********************************************/
- z. r, j# i" |) _: [ - unsigned long GDT_def[ ]={0,0, /*系统使用*/
- \9 {3 B0 x. {: s) ?' p - 0x0000FFFF, /* hi16bit( 0~15 ) is base low=0,
. i- V- M! s8 o- @" O - low16bit( 0~15 ) is limit low=0xFFFF . s4 O1 y' w& L& B4 E) z
- */
1 _+ P$ ]+ W4 f - 0x008F9200};/* 最低字节为 base( bit 16~23 )
1 h/ H' ?) f4 c& e/ ?, X' h' i. S - 最高字节为 base( bit 24~31 ). i7 ~7 ~* ?3 k( Z
- : N8 k: V% i& ~6 m: I, L. w/ k4 m
- 属性Attrib = 0x8F92
1 y. ?5 ]/ o z+ Y/ m -
7 [" a8 h1 S- x- A - 属性位Hibyte低四位为
8 a% o# b/ w; c - Limit( 16~19 )=F
" s6 T7 o) s: C" _$ m, ~ - 属性位Hibyte bit7 为粒度" F5 u, L6 {2 i& b, V, Z; O
- (值1=4KB粒度) t$ X. \; i3 s6 `
- 8F & 0x80 = 1
$ z2 f) t2 Z1 j4 ~4 q7 y8 p; B6 b -
- a+ @' E/ S; p; _. s - 属性位Lowbyte低四位为段类型,值=2
# ~8 P" I3 _; h( d# e2 o - 表示为可读/写段; P8 {4 }- ^* \. l4 f4 u
- 属性位Hibyte高四位=9,bit3=1表示:
# ~% i3 A% ^$ S$ ]+ H9 Q4 x - 描述符对地址转换是有效的。: w( ` e, G7 { S- w
- bit0=1表示为:6 x4 y/ V, ~: m: ?
- 系统段描述符。而不是门描述符。
Y; W6 q3 z% ]# a, X- s5 q - # z2 C5 r/ q" {1 q9 y( Q& e6 ?
- */
' l% J5 f1 K: B7 q - $ W) s" w: W% G; }5 g( o6 d% `
- /****************************************
0 p# Y% [% i, w) O - * GDTR寄存器, 48bit=6bytes *3 l6 M* y& b" [2 T* A* {0 v
- * +-------------------------------+ *: i* n1 m% N+ d9 o0 d! u* M* d
- * | 32bit基地址 |16bit界限| *
9 J$ M6 D9 `# ]' g - * +-------------------------------+ *! v; l3 J6 b8 b
- ****************************************/
1 a0 v5 t) o3 G - unsigned char GDT_Addr[6]={0};* M L" B3 X* c( i. V' @7 k
- 9 ?8 ~+ \2 v; t: C( d& s
- /****************
8 M1 v6 W8 m) N: x5 U) \9 T/ r - * 打开A20门 *
/ r+ P9 A% w2 x, U - ****************/6 E9 s2 N5 i, v+ z/ q5 X
- void openA20(void)1 q& S5 M. [4 P/ m' a. k
- {5 N# X; M$ d1 n7 g" b1 I. ~( t
- asm{" v$ Q2 }; N: s! ~" |
- pusha- |% V" Q* y( O8 s
- in al, 92H% q" D6 y( s* p( \: b) ^
- or al, 0x02' f h9 T9 \( G0 ~" T
- out 0x92, al
' K) u4 I+ y4 ]: i% S - out 0xed, al
! U. L9 P5 g2 G! F$ O2 I - popa
" s4 | Q+ |/ B* [/ F - }
* }# V9 l+ f+ B% l: W v - }6 h% I: w$ [' @; }
- / x; V4 r. R5 g; v3 ?8 {
- /***********************************************, B1 ^4 N! A; V' K
- * 函数功能:进入DOS4G *
1 ^7 o' ^6 \5 Z9 E' r! @: I - * ==================== *
2 H8 h: q' J1 f: V0 i( }3 s4 J - * *
. _- R2 D/ {" h - * GDT描述符界限计算方式:描述符个数*8-1 *5 l: E5 V; `; t: ^, O0 ^3 ^9 y; ^( _
- * 如: *
k/ R( L' M" d: X# `% P" q - * mov word ptr GDT_Addr[0], (2*8-1); *
& o7 Y$ n7 }7 O' f6 z! @ - * 表示为 2个GTD *, X& Y; |. L2 N- `4 O
- * *
8 ]( Y7 d% a1 j - * 选择子为所在描述符内的字节偏移。 *6 V0 K( T2 O! B, G/ U T! p
- * *
2 C8 F3 a! @! u% H" D) N2 a - ***********************************************/
5 b! ^ S5 f' @+ D% O - void set4gb(void)0 [; m6 x8 l9 o3 [# d7 X4 T* z
- {" ^# _9 R0 b4 V0 @2 Y* W2 o- a
- asm{
, Z$ w, T: a& k# F7 h6 h0 A8 U - cli/ g: j3 [' l: Z8 V0 F
- /****************************************2 j5 c2 B) x! J* c8 y
- * GDTR寄存器 *
9 A- q$ \* }; e - * +-------------------------------+ *
; k- K0 H$ J( u, m& X3 R& n. I# h. m - * | 32bit基地址 |16bit界限| *" @* C( n1 L- k' w- h
- * +-------------------------------+ *$ M3 m, ]! _) R7 Q; J
- *****************************************/0 H' j" v% |, s g5 p- B
- /*********************
2 L* N5 y0 ~' S0 D, F4 ] - * 得出段界限 *
0 ~2 _( b$ ?7 s" n - *********************/
7 g: q4 G( I% c - mov word ptr GDT_Addr[0], (2*8-1);9 g* N6 ~: \3 K
- /********************************************
5 c3 U ~ s1 f2 @' A* q - * 计算GDT表的32位基地址,存入GDTR * V7 Z9 q& J# F& c) q0 q
- ********************************************/
$ H j! ^# b( I$ d# [ - mov eax, ds
7 o) x R7 T0 G. G- m - shl eax, 4' r1 A' Q& f3 l
- xor ebx, ebx. x- T" b/ F# X! f# d
- mov bx, offset GDT_def4 _9 J3 l( Y8 @- f
- add eax, ebx. j8 }- T7 p" a. N/ M# G8 c0 x
- mov dword ptr GDT_Addr[2], eax
5 D1 } L6 E8 f/ m1 r - lgdt fword ptr GDT_Addr
) b: a$ K/ [$ m' W+ P/ F9 W - /********************5 R" |2 |# j# q8 @
- * 选择子偏移 *
0 Y- T. f( ^0 _3 `8 O! v+ S - ********************/
' ~9 n2 ]& i" M; V1 {& g - mov bx, 8
0 f6 G5 r% Z9 x5 e5 @. ` - mov eax, cr00 ^* R5 ~0 d2 o _, k5 V4 B' S* Z7 q. y
- or al, 10 K0 g) m' S: }8 Q" X2 P- y* }: S
- /**********************/ N0 C% w! `. O, [) L$ W
- * 进入保护模式 *
+ a, F6 y8 h. ` - **********************/
' E e/ \ T' ~: u% A! w - mov cr0, eax" e' o$ k- L5 s0 a& t @
- jmp pMod A m2 t7 L/ [ b
- }4 n7 |/ A9 F1 r
& p# F& G. \- c1 X- pMod: asm{+ S: l3 r/ A. u6 V
- /************************************************************
6 T3 h# Q& b0 n3 n3 f( d; T2 ^' F. f - * 让fs与gs加载选择子,使其能访问 0xFFFFF * 4K (4GB) 空间 *. h0 }+ Y. r) x1 f$ B$ u2 }$ W4 V3 ^
- ************************************************************/4 S5 s& r! h$ W1 Y1 \3 l
- mov fs, bx
/ a3 [* D7 ?% p& M- p4 d i! f - mov gs, bx
! F C1 U2 a- g - and al, 0x0FE, W8 u* b- j7 ^, W! O4 c
- /******************) n& f6 W$ a/ M# C$ U4 [
- * 进入实模式 *
! E3 V2 [# s5 C* q _6 x5 l, ~ - ******************/ ~2 l! W$ G( V) D) Y% w9 }, `% @- X
- mov cr0, eax
" ]6 s# s9 w8 c, k1 i. A" q# x8 k - jmp rMod3 W/ X$ {, e9 ?$ e- K
- }
b2 \0 [; P& p - " l7 z! |+ W4 M. r; E
- rMod: asm{3 y- p2 t5 m4 T Y
- /* ******************************************************************
8 H- \4 C9 B: {" P/ ~, `: [ - * 退出,fs、gs清0,访问系统内存可用: gs[32位,相对于0的偏移地址] *
3 Y$ `# p: J, M) y" e6 P3 J. ~ - ********************************************************************/
2 C0 i. s( L% r9 j/ k& r) C - mov ax, 0
- `; G5 B( d! V' d - mov fs, ax3 U: J$ P# C8 g' `
- mov gs, ax
; ~# \* {! `, C - sti N) I+ F$ D( Z, f$ d1 J
- }
/ ?" L9 s; }, J" h/ a4 e! a - }
复制代码 这是asm的- ;/********************************************************************
~! y& K2 r. T1 l; T2 A% z, N$ G - ;* File: DOS4G.asm *% r; J; ~# T9 P, ]4 _
- ;* Compile with masm ( Editor: Tab size = 4 ) *
, N" r9 A1 s- _: Q - ;* *
. J9 x1 I% }- S1 T: T - ;* ========================Title=============================== *- O+ X# L6 J( a8 @4 F+ B
- ;* 这个demo是让系统进入DOS 4G模式,进行数据访问 *
# E& G7 S( d$ @: n9 Q: A% W - ;* *% I3 B" H3 [3 t* W* z6 U, s
- ;* ===========================History========================== *
. q( }7 m: y$ L" T - ;* author: bini *& N3 H/ n5 `5 X- j/ N/ j& T
- ;* date: 2008-10-08 Frist version. *
h& v# d; X' s7 q - ;********************************************************************/ ( [% M' z2 A2 Q
- .model small) C0 u3 p3 E$ \' e: b) q9 Z" {
- .586p% T" D. |; |1 r' J: b' u8 h' p8 h
-
3 |& q2 K* [: z( Z j& J1 g2 f - DSEG SEGMENT USE16 ;16位数据段% |3 P; S8 o4 m' e0 ~, w0 n
h5 d/ o" A% g# B+ {- DESC STRUC
/ V7 i5 i, A9 s - LimitL DW 0 ;段界限(BIT0-15)- ?1 W2 E( X: {1 j! n
- BaseL DW 0 ;段基地址(BIT0-15)' p q" g( \/ V6 B4 ~5 }( j% s# W0 z7 D
- BaseM DB 0 ;段基地址(BIT16-23) i$ f$ r$ A z
- Attributes DB 0 ;段属性
; F+ U' a2 O* d' i$ | - LimitH DB 0 ;段界限(BIT16-19)(含段属性的高4位)
) s, K& x4 _: w) l1 p+ {% M5 T# p8 V - BaseH DB 0 ;段基地址(BIT24-31)
2 I6 K" M5 Y# @- j% P; c F+ s - DESC ENDS" @3 D- L/ J4 k
- " X! _; w2 [) E! n% `3 A' y/ G
- PDesc STRUC
+ w1 \6 H; W3 h - Limit DW 0 ;16位界限
3 O* }, u9 l& F1 [7 y7 u( S - Base DD 0 ;32位基地址
: g# Y- A3 t$ L" l - PDesc ENDS
! p, a. d" ^- r2 ?8 j: q
3 y6 r! @( A! ?" m0 q- GDT_def Label Fword
7 v* [4 ~- V7 E! A% a- n - Null_Desc DESC < 0h, 0h, 00h, 00h, 000h, 0>
' s7 Z$ j* n0 d9 c3 t& _( L - Data_Desc DESC < 0FFFFh, 0h, 00h, 92h, 08Fh, 0>
2 S* r- k6 u7 G+ t- Y3 P- X! ~( Z - 6 U1 J/ k( e3 ]: v- A7 s. d
- GDT_Addr PDesc <$-GDT_def-1, >
7 p- A9 w# R* d+ t2 H3 u, Z - DSEG ENDS ;数据段定义结束$ V+ M# ^$ P! A! P
x+ @# t) d2 A' s" S% m- CSEG SEGMENT USE16 ;16位代码段6 S( H4 ?: y0 S! ?( }
- ASSUME CS:CSEG,DS:DSEG( E- ]: Q1 M$ s) N
- .Startup
4 n. s" |$ M9 A* q E! \+ h* c* f - call Set4gb
7 q6 x | m5 H: F* ] - ;1 O& L2 h( O2 C. a1 P; J* t. c
- ; fs, gs即能访问4GB空间
% c R' O* _7 F& K1 G# k - ; write your code in here. T2 Y3 }0 I. k3 w5 _% C
- ;
" q4 d$ U( S/ V( @" B - .exit/ ^* E/ ?) m* U% W& M. {5 u, C' a
- ! o3 s$ z7 O1 J* Y
- Set4gb PROC NEAR s/ z& _7 [' F* E0 K
- in al, 92h
) C7 }' ~3 p# h6 O) h+ D. Q - or al, 002
6 j$ K* E( x! ?9 |6 r9 S - out 092h, al4 e4 u4 a( L4 E3 K: M4 `$ h) }
- out 0edh, al3 K$ I% w( U. f/ H" A9 i
- : Y3 A% {( |1 g! |
- cli
2 f# }5 C4 L/ o* j# \ - 4 N e& p9 P7 P+ X
- ; mov word ptr GDT_Addr, (2*8-1);1 p6 o# ~" H; ` N8 l
- ; K `, N+ X/ A9 E. Y! D
- mov eax, ds
+ q- v5 Q' @1 R: ^6 S8 W - shl eax, 4
5 u1 N) w6 ~9 `) S6 d: ^, [0 b0 w - xor ebx, ebx" M- _* k2 w" F- ~4 V1 D3 b
- mov bx, offset GDT_def0 B; z( S6 v9 \5 t
- add eax, ebx
; X- H5 u' P$ a9 C6 m, ] F. a) E - mov dword ptr GDT_Addr.Base, eax! b( d3 W6 l7 u& L1 R* U9 \
- lgdt fword ptr GDT_Addr
4 o6 p' A/ b* K
& L( N% u# j/ p& b, S x- mov bx, 8! n" F2 @, o) v$ l* J
- mov eax, cr0
. W4 F6 R. K1 V9 w9 Y6 R5 D - or al, 1
+ Y9 I! e. @ W4 E* H9 A - mov cr0, eax4 b3 I0 |& Q% y' v3 k0 @
- + Y: C5 Q0 x; K$ ^+ A
- jmp pMod
; M; x& U5 e) |) n3 \( O& _ - pMod:
8 K/ v- O+ J" ~1 _
$ n8 `/ ^4 d* y+ ]0 t2 ^- mov fs, bx
$ W% v( U6 }* ?' A% v - mov gs, bx2 [/ d( m# G! C8 }, ^
- and al, 0FEh8 O! O+ k( X# V
- mov cr0, eax* o; X9 q( o6 f
- ! a1 a/ N% i4 s: w% P- V2 b4 {
- jmp rMod
7 ^3 |5 U. m+ k* d& c' |3 i/ z+ p - rMod:2 ~" u0 Y b8 F( k+ Z `
% r5 t* i; m0 U, s3 H1 T% ^- mov ax, 0
1 v" j0 N; g O - mov fs, ax
& E8 c3 @6 Q2 z' e7 g - mov gs, ax
- U* ?/ T9 n4 ^9 ~ - # p, W+ [2 l; t x4 O4 @0 ?$ r+ F
- ; 在2M的位置测试写一下数据
) _" e" @7 \6 L - mov esi, 200000h8 l$ S" Y' n2 l; E) @
- mov dword ptr fs:[esi], 055aa55aah5 U- x; @4 t$ t5 |' O/ o
- ; 用RU去看看200000h的位置是否是此数据....4 o1 ]% l8 E1 k0 b; i' v$ ]8 b1 q
- }8 f1 i6 m& u" I2 ?+ e
- sti! q ?; r# o! x* T# f
- ret n+ K/ \' `8 H: n3 a
- Set4gb ENDP7 g$ G e# q% l8 ^
-
" s1 d; P1 A) c4 I3 |' F) u7 ] - CSEG ENDS ;代码段定义结束
2 a" D5 g; B4 o8 j4 P - end
复制代码 |
|