|
|
刚学习的同学,有些还不会,我这里贴点C和asm的代码。只供参考。3 o4 ^2 |4 V8 Z! m3 k# o; \- e
( w, z# W$ [3 {3 {( R这是C的- /********************************************************************
9 z% y% c+ C, W/ { - * File: DOS4G.H *4 I r- Q$ e& ~! ~9 h- R
- * Compile with BC 3.1 ( Editor: Tab size = 4 ) *5 h# y! X$ v& N. B- s
- * *6 _# N! ~1 t; q. a0 C. B
- * ========================Title=============================== *
Q# F, W3 P6 \/ m8 r - * 这个函数是让系统进入DOS 4G模式 *2 Q& }' m( O6 |( g
- * 程序参考了:陈家琪《DOS实方式下直接访问4GB》 *8 J5 _1 `1 }4 ~1 ^
- * *% M' l1 U: W2 [! J2 _1 W, \6 p
- * 使用: openA20(); set4gb(); *3 K' q; S+ p' x2 M$ X! [
- * *" D e" `( {- P$ t0 g% I9 }7 G' ~
- * ===========================History========================== *
4 N) |5 w, A' ]8 L. m2 U - * author: bini *
4 D, h; E5 h3 a# [$ R a7 ] - * date: 2004-11-30 Frist version. *
: u& G$ i, S* a' W i/ S - ********************************************************************/, ]) O1 t2 w+ [# I
- + {' s/ c! y8 @' k
- #include <conio.h>
, I* C% ^, n/ R/ R4 K8 s# @ - #pragma inline+ t0 [) l/ r; X R4 s
D# J7 N" D; J* {- /***********************************************- o9 k3 r5 V% S
- * 两个GDT,第一个为系统使用,不管,默认为0 *
# Q' D* \7 E' f" d+ N - * 第二个为一个数据段,没有代码段。 *
. P, P: |& X% I1 G4 L( c8 f2 j - ***********************************************/
8 l! A. a) M2 H - unsigned long GDT_def[ ]={0,0, /*系统使用*/
g. ~( I% l! r$ x9 i5 A9 Y - 0x0000FFFF, /* hi16bit( 0~15 ) is base low=0, 8 O2 g \. s: P; d- X) |
- low16bit( 0~15 ) is limit low=0xFFFF
0 ?7 L& ^* x5 }7 \5 d' R* ^ - */# Z9 t1 g4 s: [! c6 n$ x
- 0x008F9200};/* 最低字节为 base( bit 16~23 )7 f" u2 p- j* P O. E6 r) h
- 最高字节为 base( bit 24~31 )( k# A: o' C6 H) H* ]9 R! M
-
7 g/ w% v) n3 B: Q1 w9 i - 属性Attrib = 0x8F924 C) L$ y% E; v0 h/ B3 n8 @
- 4 M8 L9 _5 E. g! ^( D' Z$ w
- 属性位Hibyte低四位为 3 \0 r4 o, X. j& o$ L
- Limit( 16~19 )=F
& P" Y- K* A. f3 j% r1 X - 属性位Hibyte bit7 为粒度9 s3 j6 k: G) F' U5 B; R) A
- (值1=4KB粒度)( I; A4 d1 v6 {4 C
- 8F & 0x80 = 17 V( |& P5 t$ Q9 q' E0 `8 r3 M
-
' r( N W0 s/ h3 G G$ j - 属性位Lowbyte低四位为段类型,值=29 a3 C) n% ^' j
- 表示为可读/写段
' x5 {4 u2 L# o% _+ B4 w% a - 属性位Hibyte高四位=9,bit3=1表示:
s7 x Q# a; v( n) w1 n - 描述符对地址转换是有效的。( w5 ] U( L" b N2 V
- bit0=1表示为:& c2 a6 F* n& |/ j0 I: `% W# ^/ U
- 系统段描述符。而不是门描述符。8 E) D! W J( h- k/ @
- 1 v9 a7 w: z0 G3 `$ x. s- z( y* ~
- */# U6 Y4 J! m0 w1 N' |& R# `% F' W
8 u6 [) u1 P* X1 C! }: w- /****************************************+ F; j# K% D' \% w( a# T
- * GDTR寄存器, 48bit=6bytes *4 v+ m* z4 O3 _& z* @4 _
- * +-------------------------------+ *
' ~- E: N" R0 m - * | 32bit基地址 |16bit界限| *
" Y7 c0 _; y& u7 q0 g* _! v+ `8 S3 W0 p - * +-------------------------------+ *
* W" L: ?+ I3 v' c" o+ x9 N3 Q. V" A - ****************************************/, b0 q& k/ G8 V; z2 [
- unsigned char GDT_Addr[6]={0};
( n4 l4 ?8 h8 J* L& A( W3 w" ?
' |6 h6 \( D& x7 C- /****************, E1 l/ Z" Y, G, A; c8 F; z
- * 打开A20门 *- F6 i8 N* K4 u& i: `: p% E/ e8 V
- ****************/
( C' x/ m9 X+ Y# ?: n6 X4 L - void openA20(void)
b/ o8 n" F- R$ @2 q0 C4 Z# ~/ { - {
& U' @6 m. H# s( q. K/ x - asm{3 h2 g0 c, [+ Z3 T& D8 x
- pusha; R$ n" v" n7 z, s) R' t' X: s! G
- in al, 92H7 J5 W4 @9 U( e' y) p" f' I2 s
- or al, 0x026 X$ E8 u; }) u2 w, I$ Z: s0 ~
- out 0x92, al
! E9 x: M5 `, d+ I - out 0xed, al) n4 I: C2 y: c4 z/ h+ k
- popa4 `/ w8 @' \9 \( t) U; Z1 t! i
- }0 P- t7 r2 \0 T% x5 Y
- }4 u' W) S: q7 e6 X8 M2 B+ j) H0 I7 R
8 \( l" i, N- A/ h* g! d- /***********************************************$ k8 n" M) V; u* T
- * 函数功能:进入DOS4G *
! V: |# Z' ~5 G" C: v - * ==================== *, o& t& ~& c `* \: j
- * ** y; g: W. x6 }
- * GDT描述符界限计算方式:描述符个数*8-1 *
8 V( P4 ?3 i* f; Z1 |3 ]1 V* ]: ^ - * 如: *
- j, Y/ W% u G4 ~ - * mov word ptr GDT_Addr[0], (2*8-1); *
7 I+ }) [: i: X) ?, X - * 表示为 2个GTD *0 [: f# S2 H" f) J& s+ _
- * *
o/ W& R/ G* p( ? - * 选择子为所在描述符内的字节偏移。 *! s2 c2 Z2 v2 F# W
- * *
% L/ d$ ~- c- { - ***********************************************/) t& e6 w; Q. g9 ^2 v
- void set4gb(void)
" U7 q* T1 V$ v! e( a& c - {' _7 h+ m# e v1 }4 `
- asm{
) O+ R3 Q+ _& w2 h - cli+ g, `. ]+ {& H. W7 b" n' o4 N+ ~
- /****************************************
$ ^3 I$ ?2 O! V, R# H1 w) z - * GDTR寄存器 *( E& d5 x4 I h
- * +-------------------------------+ *
/ i# Q6 |1 W, X! [* r: | - * | 32bit基地址 |16bit界限| *. j1 s5 S! T1 e" V
- * +-------------------------------+ *
* j' j1 g$ B" N1 f/ ^/ s. w; \: g8 B0 ~ - *****************************************/
+ {" i; z. m. M! ` - /*********************; t+ ?0 Q# A: P( [! A$ _3 ^' T9 \
- * 得出段界限 *; \/ K. r @3 ?& m1 }. U% s
- *********************/
1 u# R) l, ^$ @: E; Y) S - mov word ptr GDT_Addr[0], (2*8-1);5 t. J5 v$ k1 V) ?! l' r N+ j3 e3 X, }
- /******************************************** H& j5 J. _9 D7 ^- K& {9 Z5 z
- * 计算GDT表的32位基地址,存入GDTR *8 F9 m/ Y4 ] o B. m
- ********************************************/
4 h( l2 k, o! p h; N# t2 N - mov eax, ds0 \' e2 H, Y1 P' q
- shl eax, 4
7 ]6 A5 W* r. s; X+ I* K - xor ebx, ebx8 Y# l/ o) [1 t, ]8 D; i6 B; E
- mov bx, offset GDT_def
+ f9 Q" L5 w$ O- M: F4 j5 I) q - add eax, ebx
) T5 n8 R, q, x% a% f - mov dword ptr GDT_Addr[2], eax/ L: A6 y6 G8 x4 ]$ {
- lgdt fword ptr GDT_Addr, N- g7 q5 Z$ A3 `( l j( C' Q
- /********************5 g6 ? @6 Q1 v i
- * 选择子偏移 *
$ r, k5 X# a! z, n8 l - ********************/7 w4 t6 ?" [ k) m3 O
- mov bx, 85 l# b3 }' X0 d& w0 G( \
- mov eax, cr0: L. b7 u/ [+ n5 g& Z
- or al, 1: A$ v q# X7 f! \* o) Q
- /**********************
1 F1 o; P9 n% g) @9 J( k( j ~, _ - * 进入保护模式 *
) j" Z$ G$ J) q( q- k" n- L - **********************/
: y0 u- L. K$ s8 Y1 B - mov cr0, eax" `6 P- R4 u) W0 m8 C2 @0 d- h
- jmp pMod
& ?5 x8 t5 x0 o- J2 n: B+ k/ l, E - }
4 K& `- Y* E; d9 N ] - - B$ ]3 R' ]! ~ M- C2 q/ W
- pMod: asm{' v7 o! d3 R( p8 L0 g
- /************************************************************
& V* [% ^# s9 p) V" I; @" a4 x5 S - * 让fs与gs加载选择子,使其能访问 0xFFFFF * 4K (4GB) 空间 *. L9 O: t0 ]& Q& Y4 ~$ J
- ************************************************************/7 P/ d& l7 _" }/ f
- mov fs, bx- H: X% g( r8 G- F0 C# e
- mov gs, bx
" M+ @9 L8 m! c- r4 G3 P - and al, 0x0FE
0 K# h5 |: f6 p# y - /******************
& a$ |$ R { G9 h/ i# H- T* v$ l& q - * 进入实模式 *$ E# ~% |' U( A% Q
- ******************/
% N: k" I! B+ ~$ \% l+ W6 Y - mov cr0, eax
, H7 i2 f6 n2 |% L& c3 ~% d - jmp rMod
( \+ _1 i7 `9 D9 d, y - }
; B! p, [' p9 K, t. u1 X0 E" W
5 [) Q& ]- u: k- rMod: asm{. p5 F7 p* \8 U; u& J! }4 k) Y
- /* ******************************************************************( Z* j, e- X" P" G
- * 退出,fs、gs清0,访问系统内存可用: gs[32位,相对于0的偏移地址] *7 x/ D3 r F3 W; r# E
- ********************************************************************/ _- Q% Y2 P: Z
- mov ax, 0
; S1 \/ E) C! q - mov fs, ax- t0 Z7 N" l! t4 w
- mov gs, ax, X& U2 {3 B! J: N
- sti' i/ q8 V+ C0 D% }* H( _2 T
- }
$ O, t$ i& G/ H$ e; w - }
复制代码 这是asm的- ;/********************************************************************
: P, s( m( h q6 j - ;* File: DOS4G.asm *
0 B) n8 y3 e" \5 S; T1 K - ;* Compile with masm ( Editor: Tab size = 4 ) * ]5 I, @- K5 g& x$ s; |0 d, H
- ;* *
: K5 s$ X" i# y0 p" r - ;* ========================Title=============================== *5 U0 i; F) \, P# Z$ i* g2 F
- ;* 这个demo是让系统进入DOS 4G模式,进行数据访问 *6 u+ v" c& C1 n9 \8 r# t/ T: ^( j
- ;* *. x: t$ a% s5 ^% P/ n% O$ s* G
- ;* ===========================History========================== *
N# K; U$ ~3 J N: y/ i& D- p - ;* author: bini *
% R! b# [1 ^0 O - ;* date: 2008-10-08 Frist version. *8 ]& A; x) P7 n- D3 W
- ;********************************************************************/ ' f7 G9 k0 F l0 ?* U. q' t$ s! Y- L
- .model small' ^+ ^, g0 f; r3 {
- .586p& c% |* w# {* c
- H- O4 m( A1 ]
- DSEG SEGMENT USE16 ;16位数据段
2 h6 u4 N$ L* b; H$ v3 m; K - . `$ g: C) p) G% q/ [) m
- DESC STRUC
+ l+ a/ z# [& t [) i! P% ~ l( O - LimitL DW 0 ;段界限(BIT0-15)9 o( m/ g0 H! S( f* F
- BaseL DW 0 ;段基地址(BIT0-15)+ U0 J0 u( ]% u8 V( Y
- BaseM DB 0 ;段基地址(BIT16-23)
* n, b$ O: x4 \ P( A7 c7 G - Attributes DB 0 ;段属性
# U `* O9 ]* [0 t - LimitH DB 0 ;段界限(BIT16-19)(含段属性的高4位)/ P: C* O5 `4 M+ L! X6 n
- BaseH DB 0 ;段基地址(BIT24-31)0 T" C. o0 W' ?. n+ q
- DESC ENDS
9 \1 i7 U* C7 ?, K b
T1 ?0 j* g ~1 d2 Z3 u, ^- PDesc STRUC
8 V% V% @$ r9 Y4 e - Limit DW 0 ;16位界限
4 L0 }6 T7 S' C Z, k+ L - Base DD 0 ;32位基地址4 d, F) I7 H" e6 B8 N- z4 {; t
- PDesc ENDS* L6 f& I# D m* ?2 F9 S J* r+ M
) a8 h& R- `1 R/ ?1 C/ v- GDT_def Label Fword
2 R. j/ T7 F- A4 B - Null_Desc DESC < 0h, 0h, 00h, 00h, 000h, 0>; y! H$ m+ q9 j P( O4 A: g; x
- Data_Desc DESC < 0FFFFh, 0h, 00h, 92h, 08Fh, 0>( n2 D! O, e8 `3 J, @& S! p
- + X; E% W% p/ u( O
- GDT_Addr PDesc <$-GDT_def-1, >, D3 J: @" [# ]- T
- DSEG ENDS ;数据段定义结束
. [) [; M& a: F( E
" r" h9 F" T# C: q* h+ h- CSEG SEGMENT USE16 ;16位代码段$ b' t5 u& w4 e8 ]2 r/ z
- ASSUME CS:CSEG,DS:DSEG
0 y( I; ]1 h3 r. N7 a - .Startup
& j$ e* I) H4 y: z( _- K& R - call Set4gb7 N7 K' g- T! S+ z5 F
- ;4 y4 D+ U3 z4 c6 _# j& a
- ; fs, gs即能访问4GB空间
, t/ x$ O8 B6 ^9 G0 U, G+ s - ; write your code in here.
% u, \* C. s. ~( Q4 V T - ;
; }- u0 l/ U3 N1 b% l4 `. i - .exit
9 W4 D# w7 _: } - ' R9 b& k! D' ^# Y2 I& s' M
- Set4gb PROC NEAR
0 H$ E; g, x6 \" Q3 ?. O3 e9 g7 I - in al, 92h
7 \0 ^& W- {- C: M. x N - or al, 002- d" \5 B% n# q. L8 U. k; T5 K
- out 092h, al
* V4 `. C" g8 G8 e/ Y$ m- ^: t( R - out 0edh, al
g6 Q: k$ _ U$ c+ r/ r - : E9 _" A' e! H2 j# [3 t2 ]6 g$ t
- cli
* G8 u# ]( S, [4 O' K, o
% ]2 w. E1 [/ c8 n/ _" q- ; mov word ptr GDT_Addr, (2*8-1);
* U- i5 f7 [% B R+ g - " G( T( G0 o: z8 o! }
- mov eax, ds
+ d- f5 O( H: s) Z; I# H - shl eax, 4
4 p& B) P6 {* {6 m! ^0 p - xor ebx, ebx
; F3 k) R( i6 p8 b! I - mov bx, offset GDT_def
* X- S( L6 O6 ~8 A - add eax, ebx
) W1 M* \! h' u1 G% ^ - mov dword ptr GDT_Addr.Base, eax, b T" @! j# N& o5 M' Q
- lgdt fword ptr GDT_Addr/ _/ c: a1 m$ r8 ~2 U; ]6 T# ]
! J& l6 V8 A7 }- mov bx, 8' }# ]9 V) W9 ]. N' O9 h$ ?. h) e
- mov eax, cr0
% y) e" @* e3 {9 q/ e( w& |+ } - or al, 1
" ^- \* g; |- v4 o& y+ \# C, l - mov cr0, eax
6 n& @+ U _0 Z! q: l( T1 M' X/ Z2 l# O
. t5 K5 q3 I8 p4 Z: p- jmp pMod4 c( U* f+ i5 _+ f2 M, q5 O
- pMod:! v$ z' _* s- _$ K& f
7 j! F7 C5 v, W% Y- mov fs, bx/ O0 ~2 G! g, |2 V8 k
- mov gs, bx: z& U3 D$ k+ |9 p9 z# J
- and al, 0FEh. A$ L) S s' d/ \9 K J1 ~
- mov cr0, eax
8 x* _+ r7 T9 @. n7 @- L! c - : U% w6 w' G, j$ U0 [2 I
- jmp rMod
7 G5 A' r) H9 M - rMod:6 A4 H8 O# [6 H% L9 ?1 W
; k( H# Z9 I: k2 {& K$ y* a: r, b- mov ax, 0
, b% v2 ^1 L; f - mov fs, ax% M7 i: _5 i+ e' D
- mov gs, ax
& j% ^& B2 h$ Y7 n1 T* e1 P, b$ ^& u -
( Y, Q7 D( Z" l. r# a - ; 在2M的位置测试写一下数据. {. n& W8 p0 r/ L; V
- mov esi, 200000h% q/ ?# O. t; p5 u
- mov dword ptr fs:[esi], 055aa55aah
$ v- w+ ^2 q5 }% D1 J, V - ; 用RU去看看200000h的位置是否是此数据....
: Q0 R( K( p- ~5 R' N - [/ G) p4 c( `7 T6 g& `, H
- sti
5 _0 J; ]. b$ o: N$ P - ret
/ F# }/ ]2 U/ Q8 f+ H2 {3 y - Set4gb ENDP
% O, G" y7 w7 _4 m5 u* F - " k0 s j, ?2 b0 S4 l; H/ y/ ]+ W+ a2 v3 O
- CSEG ENDS ;代码段定义结束
1 j9 f" m% N1 ^3 Q( e9 c; Q - end
复制代码 |
|