|
|
刚学习的同学,有些还不会,我这里贴点C和asm的代码。只供参考。5 K' V3 c* N' v2 T* I4 q& r
# L3 {& L. k6 Y" _4 F$ O
这是C的- /********************************************************************
+ O V; A& @8 z8 R: B0 k' M% s - * File: DOS4G.H *
6 a. j9 K$ G9 |" s, c/ D- g% @ - * Compile with BC 3.1 ( Editor: Tab size = 4 ) *& a: n& S/ `5 w: W, R
- * *$ r2 v. u) _1 r1 T6 A
- * ========================Title=============================== *- p8 q- @. G/ A) n" Q1 c( `6 z
- * 这个函数是让系统进入DOS 4G模式 *7 r$ i! s9 j J' @% P
- * 程序参考了:陈家琪《DOS实方式下直接访问4GB》 *
! \! ?& C: J6 ]: K6 U - * *
9 @, T6 |0 U) g - * 使用: openA20(); set4gb(); *
) p% |$ J' g- z6 F! g- W4 i - * *
. F: C" @1 Y7 [# ]( V/ i1 L( q+ X - * ===========================History========================== *
6 z% E1 z! I, ^& l7 z - * author: bini *; N6 R& L& F: _& k- ~
- * date: 2004-11-30 Frist version. *
6 ~8 Z# ]* ?0 L. f - ********************************************************************/3 B( W7 f- b/ W7 ~) E7 m0 d6 I9 f
0 }. E" o/ N) N3 K- #include <conio.h>
( ~+ {. A( K/ P4 h' F+ k" ?6 K- h: b - #pragma inline7 p( I5 O* h; v$ ?2 ?: V
5 h: }1 C: G0 s. [2 N, z3 R5 Q- /***********************************************
; p9 H+ E# o: |) j# c - * 两个GDT,第一个为系统使用,不管,默认为0 *
$ t& z0 G: k7 s X3 c3 o' J - * 第二个为一个数据段,没有代码段。 *1 r# O' V% B' h# D* ^3 I9 E, m
- ***********************************************/8 S& P- K+ t2 m% t1 W
- unsigned long GDT_def[ ]={0,0, /*系统使用*/
8 `4 F1 U& J. D* A$ {% B - 0x0000FFFF, /* hi16bit( 0~15 ) is base low=0, : G- |1 K9 ~1 L3 T! F
- low16bit( 0~15 ) is limit low=0xFFFF
* _& g! A( z2 s( V) ]8 c( o) [ - */0 w4 }2 y9 \& V3 @! i$ a2 W1 w
- 0x008F9200};/* 最低字节为 base( bit 16~23 )
9 c0 d$ g0 ^1 `+ }/ X - 最高字节为 base( bit 24~31 )
9 A+ M9 J+ J: p2 u9 d6 ~1 |* Y0 O -
3 a" |4 w Q+ C! l6 C; y* H: B - 属性Attrib = 0x8F92
4 s3 n F ~; T. L% G& V# U - 3 H2 U) H. }, r8 j* k2 X5 d& E1 `
- 属性位Hibyte低四位为
! @$ m# h) [6 ]2 N9 c$ n - Limit( 16~19 )=F
4 Q; C! b4 c0 ^0 h1 M- y - 属性位Hibyte bit7 为粒度
4 H3 X* v5 P7 J( S3 e+ I0 O - (值1=4KB粒度)
( g1 U/ i2 c% J. |/ Z- w - 8F & 0x80 = 1
0 O* ]" g0 \; X8 x# ?3 s R( U2 Z - $ o+ E' c6 Y, J0 c7 V+ G+ B" \" R
- 属性位Lowbyte低四位为段类型,值=2* a8 g4 f4 @3 L, G! T
- 表示为可读/写段
: _+ i8 l% Y, g+ g5 d - 属性位Hibyte高四位=9,bit3=1表示:0 X% V$ j, k; O5 C
- 描述符对地址转换是有效的。8 ^: p0 F6 u3 n% P# z3 c, T+ ~& Q
- bit0=1表示为:
" d6 R+ |8 ^2 j - 系统段描述符。而不是门描述符。* G3 G" K: k/ B2 A q6 t, [# t6 u
- 9 J+ m' p+ C( w7 w, w5 x
- */
% M4 V3 C! |8 H" y3 f7 T. S6 T - * |! m5 Z$ C' s' M( G [8 x
- /****************************************
1 U+ T0 z( [% {; ~9 b - * GDTR寄存器, 48bit=6bytes *
$ t& _9 e X; e! Z) H. P1 L - * +-------------------------------+ *
0 \9 Q- N D( L6 c* [% a2 R4 g - * | 32bit基地址 |16bit界限| *
: ~% z4 n8 c, W+ s1 Z) j - * +-------------------------------+ *
6 B9 Y( q4 }# c1 y l - ****************************************/% N7 P- j v: g7 N3 M
- unsigned char GDT_Addr[6]={0};
7 A h; D# Z9 Q' [, P) E
U+ H/ a/ d' _. }- /****************
, _1 K [& W% b - * 打开A20门 *
6 H$ P, E+ F0 d. z8 e. y - ****************/
* L, a! a6 ^+ f! t - void openA20(void)
" X: t' \8 X- N8 W3 {8 s - {: ]: d& K/ M9 f5 l6 e% c3 U
- asm{$ ^8 B; Y% y2 ^' E/ D, t' C" T
- pusha
5 x+ y2 b; x* C# l; W+ J) R - in al, 92H9 e8 `- @/ a& d
- or al, 0x021 n7 j7 b9 ?2 L# J5 d
- out 0x92, al
" g$ B, N- D# T/ x/ o3 P% \) d - out 0xed, al0 ^( _) e/ K# H- n; {# g' `
- popa
1 Z4 F- u# B% Y* M, u* O$ m - }
: m: c- R2 p6 y( T* w - }
0 d! O: V3 J n* b9 w - 1 B0 h7 b2 q# s3 i0 S8 K! o
- /***********************************************
7 K. J8 e% G4 L# P - * 函数功能:进入DOS4G *; A8 M/ }2 s9 N" N3 I" }& ^( `
- * ==================== *
- J5 U/ g5 @( d! b: _+ _ - * *
6 Q6 k U% w/ j9 d& p6 d - * GDT描述符界限计算方式:描述符个数*8-1 *
0 c4 Q5 O' e5 n* X% _& K - * 如: *
% T9 e; `2 d. I; L - * mov word ptr GDT_Addr[0], (2*8-1); *7 R4 u- O4 f7 p) D* Z8 o. Z. N, u
- * 表示为 2个GTD *( g2 b9 f0 Z* \( H% C
- * *
6 V1 u# P2 C2 X8 M9 b( i6 @ - * 选择子为所在描述符内的字节偏移。 */ \ N; u7 |3 l! q3 F- F
- * *
5 N- o* P9 M& W. R" `9 y( v( G( z4 G/ A - ***********************************************/
: N# b& t1 |* c3 s" x0 C - void set4gb(void)0 Y7 z5 {7 B5 O
- {
( ~$ f% u) T- _. A+ T( @" i - asm{
7 B2 [* S, V* H& Z - cli5 t5 K8 x2 M' R2 A
- /**************************************** s) A& T' a2 Z4 ~1 n4 K+ ]
- * GDTR寄存器 *
$ u& |; Y; S* J3 t$ L) ` - * +-------------------------------+ *9 W5 P* K5 G: a5 S2 H; x( o1 K
- * | 32bit基地址 |16bit界限| *
+ W( {5 `1 N6 i. {' C3 ?( ^ - * +-------------------------------+ *
9 b, V% y: V4 A; L. t# x$ W - *****************************************/6 G9 G; ~: q1 \- I7 U
- /*********************
0 j8 F# s( P( X - * 得出段界限 *6 @$ n* x A' v4 }3 u4 `
- *********************/6 T' V8 ~5 ?2 p% i$ ?
- mov word ptr GDT_Addr[0], (2*8-1);
|5 j6 a* W, n8 }- s - /********************************************$ E) p+ L Q0 b: h) V- @
- * 计算GDT表的32位基地址,存入GDTR *: h5 k3 p$ `: Y8 }) v( z& p5 u
- ********************************************/# d/ J8 C) v" {$ B5 \9 @) N
- mov eax, ds
9 }# X% l1 L+ n6 G0 y. v( C - shl eax, 40 n" l6 U4 Z; |: ?% K. T% T- u8 k. q
- xor ebx, ebx( M3 ?5 T# a ]; q# ^
- mov bx, offset GDT_def
W5 ^7 l2 J. f0 E# P" ~" N - add eax, ebx
& s! [! J' N C& W7 J" i - mov dword ptr GDT_Addr[2], eax
5 M( {+ h3 Y$ X% t% N - lgdt fword ptr GDT_Addr
( z. g! H! s! k. \& X% d1 g; X' K - /********************2 y, f& u, O% i& I/ i) Z/ L' h2 s m
- * 选择子偏移 *
* O6 N4 z8 Y6 b4 b4 t2 V* C; ` - ********************/
$ M" @( N3 R- R" S - mov bx, 8
6 W( S* A# S: a& P8 i# \ - mov eax, cr0
2 J; A1 m; A! T, ~7 P5 a; D, U% K - or al, 1# r, r) O! W! H& }9 k. B4 [& s7 ]
- /**********************4 W; d1 s; Y0 G5 ]9 g$ S2 r
- * 进入保护模式 *# l; M O7 f3 Y9 f- `7 O
- **********************/
) s# N# i5 C- t5 a9 s - mov cr0, eax5 I% ^5 W$ b# E9 o
- jmp pMod
$ V0 j0 T3 z- K" U6 m - }) }: t$ W* @: N5 _
- 9 R* W1 ^+ @- d v) k* Z0 ^/ X1 K
- pMod: asm{
8 r3 }' e2 B5 \ - /************************************************************
6 t5 C- g+ _4 M: A6 _8 ~& c - * 让fs与gs加载选择子,使其能访问 0xFFFFF * 4K (4GB) 空间 *- ] e, u3 H+ {$ j, U" f
- ************************************************************/
2 \! y" E" L+ x: U3 K0 Q' p - mov fs, bx
/ F% ]) ~8 Q/ L o: ~" N - mov gs, bx& ]. D9 V( P4 e' }! [
- and al, 0x0FE/ v) [: J5 ?$ e; R
- /******************( _" q9 U8 a$ L/ k0 [
- * 进入实模式 *- j+ ^0 S/ O0 j) S, c5 H
- ******************/
& g7 ~8 L4 Y, @& T7 R - mov cr0, eax
- D% C' a( [" u) D0 ? - jmp rMod
% n& h8 |. [; m - }
/ C9 ]: l- K8 E3 C7 U
& g# W' x U H* h' n* D6 {4 t/ r- rMod: asm{. S- f3 L G: y$ E+ X# A
- /* ******************************************************************
% ^. [; I- D8 | o - * 退出,fs、gs清0,访问系统内存可用: gs[32位,相对于0的偏移地址] *
2 |; c) Y* r+ Y4 G' S - ********************************************************************/* _4 V' v$ t; I4 ^( X0 ~8 M Y+ ^/ P
- mov ax, 0
; y9 R+ P1 @3 L# N+ Z m - mov fs, ax
* k+ ?* O/ ^. c7 `, o - mov gs, ax& _# B& r$ `% _3 N/ z8 I2 W- Z
- sti
/ _0 v2 {5 ]- m - }
* `8 [4 k9 I* y* J - }
复制代码 这是asm的- ;/********************************************************************* y4 B( m a4 O& Q
- ;* File: DOS4G.asm *
9 F! B% U6 W+ W$ H& R3 t) K1 [& } - ;* Compile with masm ( Editor: Tab size = 4 ) *
% U. v" o4 U) A- | - ;* *5 u+ B) s8 \9 k
- ;* ========================Title=============================== *7 J) [6 m6 m; |- h" D
- ;* 这个demo是让系统进入DOS 4G模式,进行数据访问 *
) ?4 {, ?" F G( M0 ~9 r - ;* *! Y& U, @7 m( m5 k7 Z/ w
- ;* ===========================History========================== *
' k9 Y7 E6 t/ t% f1 U - ;* author: bini *
7 `" n9 F4 v# _ - ;* date: 2008-10-08 Frist version. *
- u$ y, {/ \3 ~' o6 c - ;********************************************************************/
2 _, M9 E3 x5 `: V3 [ - .model small
/ N6 i6 s5 b! y1 O - .586p
. F' H0 q) \- ?% t- U! N - 5 ]( t! H1 @) U/ p3 o
- DSEG SEGMENT USE16 ;16位数据段6 f4 p: ]* ?/ m; Q
$ m& H$ N' w- A1 B2 t! R; [: ?: r- DESC STRUC
# y! _' n6 ^! S3 X5 Q6 \5 M - LimitL DW 0 ;段界限(BIT0-15)
l* I5 s. K0 j6 o7 p- w" J5 } - BaseL DW 0 ;段基地址(BIT0-15)# b. `! W) L# c' _6 {& o
- BaseM DB 0 ;段基地址(BIT16-23). y/ W+ Y; N1 j* h
- Attributes DB 0 ;段属性
5 N' S& t3 f$ [. p6 x3 w" T- I& m - LimitH DB 0 ;段界限(BIT16-19)(含段属性的高4位) N6 z& x1 l; B8 |* {/ e
- BaseH DB 0 ;段基地址(BIT24-31)
# H2 T* n4 {' A# N2 d W/ w - DESC ENDS
/ o" o/ v s- F, e! v
, H% Y0 D* b9 z" y* W7 m( a. ]. j- PDesc STRUC* ?# o& { D4 c9 b
- Limit DW 0 ;16位界限
' Y& A p; O' N0 `. K+ Z5 p - Base DD 0 ;32位基地址7 R' b$ d) x, O
- PDesc ENDS
2 z. _2 T8 h, c& H- |3 R
* q5 J: W( X% L1 H- GDT_def Label Fword
9 d2 r8 C; t8 F& ~& g: K( x! m6 I - Null_Desc DESC < 0h, 0h, 00h, 00h, 000h, 0>
9 Q: M7 c1 T8 b/ _+ J* s - Data_Desc DESC < 0FFFFh, 0h, 00h, 92h, 08Fh, 0>
$ d8 t( r. o$ {& D J1 u
: Y1 {, x2 |) m9 x& N- GDT_Addr PDesc <$-GDT_def-1, >
3 s/ h' n, B6 \9 H& ^ - DSEG ENDS ;数据段定义结束; H" n6 R. q6 x! [* I; N) Y
1 N7 q1 {% U& C+ U/ x- CSEG SEGMENT USE16 ;16位代码段
* p; r. D7 q ]3 q5 k - ASSUME CS:CSEG,DS:DSEG
4 \. v/ A6 F. h$ y, @, w' q - .Startup
, `0 P, ], D7 z5 L0 V# }8 i - call Set4gb
7 O& Y+ E( e- u8 w - ;
6 Q$ R5 P# R' R! _+ p% | - ; fs, gs即能访问4GB空间
# t# U Q+ g: P6 Y - ; write your code in here.
+ a9 @$ y, ^- x0 | - ;1 I) R" S6 b x* [) J
- .exit8 V: z5 @, z; z! i) x# s
-
) ]8 F, C z% K( n6 L - Set4gb PROC NEAR: I2 R8 e: g* ] b
- in al, 92h
1 \2 e5 Y& M& @ - or al, 002
: Z, J& c$ M f - out 092h, al6 z4 }; ~& H6 |6 o# z# ?8 Q3 z. D7 ~" `
- out 0edh, al. n7 S+ y( V, Z% j; A" K U0 X
- 8 z" Q9 w' m: z) r7 z
- cli7 Q' u1 ]& A. s& V* _1 L, _& ?7 x2 p
- 5 E) Z9 Z& M; V% G6 T6 n! |
- ; mov word ptr GDT_Addr, (2*8-1);' K. H9 V' V1 A7 E( j/ U- U
8 H) n2 B0 e3 r- n5 p- mov eax, ds8 l: W/ K" W5 a6 b; d
- shl eax, 4# @) w3 \2 ?% R9 C, e
- xor ebx, ebx- O4 F6 U) n$ p; s6 k9 i) [7 L) E
- mov bx, offset GDT_def
/ V. m1 X1 a t9 }' v' Z( I2 ?4 r - add eax, ebx
, C. h3 P& r0 K. G+ [ - mov dword ptr GDT_Addr.Base, eax
- H- {! d* \4 L: L6 Z6 O - lgdt fword ptr GDT_Addr
5 s7 q& T" _# Y( ^ - . e% ^, a3 V2 r( W1 F" x3 C
- mov bx, 8* e3 b* t6 W& {6 y
- mov eax, cr0
7 W F, P8 T. c- b9 {. j+ `& S - or al, 1
& b3 l' J; S, M* i; H+ M4 | - mov cr0, eax
5 e x y. y2 h( H- w0 |- G" B+ R
$ {0 v9 d) i! o, O# X- jmp pMod1 J7 l% `' t4 G- a6 Y% } `0 N/ F
- pMod:
W& g- N3 D" d( ^/ K- O7 i* i% p - : {9 |# z% \: O' ^% n* A
- mov fs, bx( r* i% |) v$ W1 F5 m
- mov gs, bx& M( r' T" T$ s. ]3 ?' {% u
- and al, 0FEh
* |# }# E, v" m* C2 i - mov cr0, eax& e1 ?) @% A& w" z8 M
-
2 V, A% ]) }% H' n8 K - jmp rMod* ^% T: s2 k' R4 v9 ?9 p7 ~! T
- rMod:
2 Y; W1 J3 `: J. ~0 t9 I0 x
6 ?/ Y* ~. M0 X% f- mov ax, 0
. w9 t5 n3 o7 P0 e! { - mov fs, ax
7 V6 C6 y0 H' ]- d( v - mov gs, ax
- `/ r( g4 d" j: i3 w! N8 X7 I6 x - 4 E' s& w+ M! K5 @" z! H* ]
- ; 在2M的位置测试写一下数据3 `! t# Y; x+ X1 W" O. |9 a
- mov esi, 200000h
! x# O# Q/ P: U# a; j' Z - mov dword ptr fs:[esi], 055aa55aah
% f; Q4 d4 A" Y% l# _ - ; 用RU去看看200000h的位置是否是此数据....: W/ M# g7 A4 h0 e9 \1 _
- ; p9 ~/ v' e5 c/ z( B p
- sti% U2 X" z. G4 N0 f. b! U
- ret& M. X2 W; q/ W
- Set4gb ENDP. p+ ~# c; |/ a0 Z9 v# t
-
! l( o) h# ~) w7 F+ ~. ^ - CSEG ENDS ;代码段定义结束
+ Z/ X4 U. W/ Q/ ] - end
复制代码 |
|