|
|
刚学习的同学,有些还不会,我这里贴点C和asm的代码。只供参考。# U* l% x4 Z! ~( \. ]
8 ]+ e" d6 |; m# n( p- m
这是C的- /********************************************************************
$ M" L( v( i9 i/ a! |$ i) B' u - * File: DOS4G.H *
8 W3 `* K5 I: {7 m$ M9 R! D - * Compile with BC 3.1 ( Editor: Tab size = 4 ) *
4 r( o: O8 P" Q9 u$ q - * *; J+ U5 e4 p9 {/ m) `1 a& c, S
- * ========================Title=============================== *
+ b# t+ [! I. @- C - * 这个函数是让系统进入DOS 4G模式 *
) i% H0 ~0 e0 x- m" V - * 程序参考了:陈家琪《DOS实方式下直接访问4GB》 *. a' z- x0 n2 ]8 {" i" ^- w
- * *
+ G$ { a# d8 _. l1 n - * 使用: openA20(); set4gb(); *2 k% r- f; n% q3 `
- * *
3 R8 O: m9 P L, w" H7 X: a' l - * ===========================History========================== *
, Z9 a7 G, c# L5 K3 W ^$ E - * author: bini *) r9 F& B5 H5 r( i; b
- * date: 2004-11-30 Frist version. *
5 X) @$ n* V" Z$ h; Z" a/ N - ********************************************************************/
. z4 F7 l/ Q A1 p0 I W - $ r5 i, o8 j7 D( o8 d a
- #include <conio.h>
! v. ?+ [* O; h - #pragma inline
+ j# U3 j! x3 Y" B7 j
7 J: L1 [) V: h# w2 B1 |9 h- /***********************************************
1 G; V+ o- S6 p- b# ~! O5 G - * 两个GDT,第一个为系统使用,不管,默认为0 *& I! ?- v6 B3 @. X# i: N
- * 第二个为一个数据段,没有代码段。 *
4 T5 b5 F# @/ O7 K! t4 o( | - ***********************************************/
8 }& |& ~. ~; O; ~, a) x* _$ V, n - unsigned long GDT_def[ ]={0,0, /*系统使用*/
: W0 U/ f$ y0 h1 Q, s5 B0 } - 0x0000FFFF, /* hi16bit( 0~15 ) is base low=0, 7 B/ x" E. F- F3 T5 [
- low16bit( 0~15 ) is limit low=0xFFFF # e: f) Y% C5 Q# Q* N# a
- */
' r$ Z$ R- x5 m - 0x008F9200};/* 最低字节为 base( bit 16~23 )
; n t& F. {9 R3 P - 最高字节为 base( bit 24~31 )
+ p) b$ V" b9 y, o) }' [! w& ~" y -
- p5 y( B. |/ S8 r - 属性Attrib = 0x8F92, E6 z; S/ C5 d+ z' n+ L, j* d
- & s/ h! U( U7 [# Q' R
- 属性位Hibyte低四位为
( Y+ O4 K" W5 O, m - Limit( 16~19 )=F
6 J3 ?) a) |3 x& B - 属性位Hibyte bit7 为粒度* b# [9 @% ]! R" s# Y+ c% E1 _1 M
- (值1=4KB粒度)
; C7 v) l; c' X/ W% n# d - 8F & 0x80 = 17 y# K3 N( G( R( ]5 Z5 p" Z
-
: y k; u; d9 F q- e# p - 属性位Lowbyte低四位为段类型,值=2
~1 f7 F, P' g0 a% k2 s' Q - 表示为可读/写段
$ r4 K/ d5 U: b3 y% Q; P* n - 属性位Hibyte高四位=9,bit3=1表示:5 `9 m5 m3 [% ?6 V% y* e: E/ }
- 描述符对地址转换是有效的。! @% s8 c, D# u. [; v
- bit0=1表示为:% a" X' K+ j1 P: |7 `- c! A
- 系统段描述符。而不是门描述符。
% I1 j( ], _% C# \ -
4 M+ ^# N4 I9 m4 _9 _1 q0 u3 X7 ?- W - */0 Z. h2 `5 O2 m' u) M/ [- M
% [) z! ?1 E' m, `+ u- /****************************************, x9 H; W8 D% J, j
- * GDTR寄存器, 48bit=6bytes *
/ H. Q$ C. m0 P6 }2 @3 d) ? - * +-------------------------------+ *
' K0 g: q! i$ b - * | 32bit基地址 |16bit界限| *8 r# ?, B( a% R
- * +-------------------------------+ *6 j9 e) h6 V/ x" I* H
- ****************************************/7 ^- t7 q) i# \
- unsigned char GDT_Addr[6]={0}; X) e4 [# Y8 H D N% e6 G1 a
- ^, b4 ^$ d2 g5 c) b
- /****************
" F( S+ O! a& L+ `4 U4 N - * 打开A20门 *
4 B! I8 }, i& q - ****************/
1 i8 w4 J. Y* D - void openA20(void)) x9 C% K. P9 c" n) @. I2 L
- {/ X1 k* S( o* ?# G
- asm{% R! @: j$ a4 n; B* W
- pusha
& F2 _0 A" o: I1 j R3 f) ` - in al, 92H1 `9 {3 R7 f$ m( U
- or al, 0x02' A8 Q) T$ M6 Z ~
- out 0x92, al
. j- s+ K8 o6 Z q9 o0 z - out 0xed, al1 O ~ D" d& N1 x3 w7 {
- popa
$ T$ d2 g* e% n0 m# a' p - }
. w! S0 |4 Y5 u# d4 u, `% i4 O - }1 U7 @( \4 {3 L( U9 [9 {
- ! M- B2 W* _; Z% G; m) p- U5 s
- /***********************************************& o7 d. [# |; n9 }. N% h9 G( M
- * 函数功能:进入DOS4G *0 X' A+ l) G5 {0 I' [( i( N& I
- * ==================== *& R. E7 L3 p0 X; R1 _# c6 Z% z, \
- * *
+ w* e: \% D1 d3 T* a+ i - * GDT描述符界限计算方式:描述符个数*8-1 *# }4 i) Y5 `- F+ j
- * 如: *
( z1 U& ?2 Z1 M# r. v) R - * mov word ptr GDT_Addr[0], (2*8-1); *' R) s4 c- y+ v3 Z, b" f" L
- * 表示为 2个GTD *7 q+ I3 h1 C6 ~: `" N! W0 l
- * *
: {" Y) _; l2 u5 G/ O2 P8 k - * 选择子为所在描述符内的字节偏移。 *( i4 z. H( r2 a( B( O( H7 l
- * *6 x: D* w8 q) H5 \+ ^- r* T
- ***********************************************/5 T* i6 ?+ i g4 A6 w" j$ H3 |
- void set4gb(void)
# Z+ O3 ^1 R$ A, P( G - {( N4 e+ W# \4 j2 `5 t; k& ~
- asm{" |1 H* d% e: F' ^/ t
- cli/ n! d7 x0 p: \8 N2 }% W( [
- /****************************************
6 f1 F$ g0 i! s! d - * GDTR寄存器 *5 u: [8 w% x- ?! N* r5 b( _2 N" {+ a2 N
- * +-------------------------------+ *9 r6 J3 y( d" v* x& a& f4 N# r0 }
- * | 32bit基地址 |16bit界限| *3 s0 T8 i# O2 F# A* b
- * +-------------------------------+ *& W& N5 k2 U" v0 D! O
- *****************************************/, S1 o1 C, v, A
- /*********************
+ @; Y1 q$ S0 t- f) h3 @$ N - * 得出段界限 *
) f% p# V% m4 k - *********************/, z) G' V5 o- `
- mov word ptr GDT_Addr[0], (2*8-1);
v( p3 F1 r9 F - /********************************************
5 ]0 U1 h4 X6 I - * 计算GDT表的32位基地址,存入GDTR *# a- |7 j1 x; }4 h* x L+ |# [
- ********************************************/4 y1 ~( e: P* b: L9 u' J3 Y
- mov eax, ds
& ~: V$ K7 Q4 Z1 { ] - shl eax, 4( k$ ?1 m$ r7 U3 i) B% j
- xor ebx, ebx3 ^" [# r6 A+ \! R8 A) p
- mov bx, offset GDT_def' q2 U+ {8 n3 M- T9 E
- add eax, ebx
4 O) }4 j; ^; M, X - mov dword ptr GDT_Addr[2], eax
0 ]( f% M+ V: {; ~5 _ - lgdt fword ptr GDT_Addr
) D, O. E7 j0 v: F# B - /********************
6 H/ q; }4 c# g" t% i6 i! q6 W7 u/ E - * 选择子偏移 *- e$ a; y# G& l( c
- ********************/
/ A+ f, V5 Q$ a9 E0 _( E: s. w - mov bx, 8! H' O/ b; H" d1 Y3 p) C5 D
- mov eax, cr05 U4 f {$ s6 `( z
- or al, 1- o' a1 D9 ]4 ^1 s0 x
- /**********************
& b. b, q. V% k* q! _ - * 进入保护模式 *
& T# Y, v* k$ u$ B: w6 [; d - **********************/
+ M I3 h1 ^" D7 r9 h - mov cr0, eax
9 A. C; D V. o& h - jmp pMod+ ~; K6 T' ]$ @6 h. k E' y$ f% j" M+ R
- }4 o! v7 E5 l) G U4 ^7 ^
- / l! U4 U0 }1 D- W" P
- pMod: asm{( g: s7 E( S: U7 l, g& b( m$ n! X
- /************************************************************
# B7 P" ~0 c5 ?" Q% ]. |" R - * 让fs与gs加载选择子,使其能访问 0xFFFFF * 4K (4GB) 空间 *
2 ?% g2 y3 K' i6 A* X. ? - ************************************************************/
+ s: d" w8 n% s# A/ C4 [ - mov fs, bx
" K+ j1 E8 e" z H1 T4 b - mov gs, bx# }3 D# L h x3 I+ O+ g/ P7 k) s
- and al, 0x0FE
* F( ^1 E$ X1 f: F3 ^ - /******************5 _6 m# I* j" G1 h! B# g9 x
- * 进入实模式 *. ^9 r K% M& h9 O: A- f" _
- ******************/
$ B0 W4 T9 Z$ q0 G8 z - mov cr0, eax8 c3 A. X$ C. _ C9 I, _
- jmp rMod. g9 m: p! ^; t( t' z% I4 \8 Q
- }9 h+ V. s8 M% N+ Y' g
- * h# P2 S# E/ @! ] Q/ _+ z5 W
- rMod: asm{
/ X- c8 [' q* u7 S- i( O. D; W - /* ******************************************************************
: K* a5 q$ C1 w/ k" q, m! l. K - * 退出,fs、gs清0,访问系统内存可用: gs[32位,相对于0的偏移地址] *
) R3 a \/ X8 Q- x5 ^ - ********************************************************************/5 D$ q2 i, I& f8 K% v; M1 y
- mov ax, 0: J& _/ X- n( n) \0 h6 k
- mov fs, ax
) n E {2 |) a/ L; o - mov gs, ax6 {' W2 x' r X* r7 j, n
- sti0 X8 A& m6 H; `$ p
- }, _: T; f! U/ q4 S9 n
- }
复制代码 这是asm的- ;/********************************************************************6 H0 _* X+ ^9 s+ i# k7 u6 s+ V! v0 @
- ;* File: DOS4G.asm *6 e+ T; X4 V. `; \- s
- ;* Compile with masm ( Editor: Tab size = 4 ) *, v3 \2 P& r0 a [& K. J
- ;* ** w( D c; I$ }) s1 [: B' R! i0 V2 L
- ;* ========================Title=============================== *4 P1 ]! E: i. D$ Y
- ;* 这个demo是让系统进入DOS 4G模式,进行数据访问 *: f6 U8 y8 a6 ^8 c/ x
- ;* *7 T' U$ r+ ~& W: @
- ;* ===========================History========================== *! d K' y; ?" A6 f' C4 Q, |" [/ I
- ;* author: bini *
1 `+ _3 ?* w" ]6 Y - ;* date: 2008-10-08 Frist version. *$ s: t7 y0 E9 e) W
- ;********************************************************************/
( }" C. v0 S3 o: R7 ^0 z - .model small
& J. Z, n9 p- @, o+ u6 n* _ - .586p. d6 _) Y3 H+ t; Q0 j
- ( a/ C" _2 {" |/ _- |7 @
- DSEG SEGMENT USE16 ;16位数据段
& g4 v" U* ?$ D) _ - " O& Y: E6 x8 }! |& w( t
- DESC STRUC d5 C- C7 J# d( w5 u( ^- [/ G
- LimitL DW 0 ;段界限(BIT0-15) \) p N! M8 J3 P2 [
- BaseL DW 0 ;段基地址(BIT0-15)$ |' E3 |" J/ w( H- c& v n
- BaseM DB 0 ;段基地址(BIT16-23)- |/ C& Y7 R/ J& h! w; I$ H: h* Z
- Attributes DB 0 ;段属性
: w3 U# \! [# V4 O9 o+ q& l - LimitH DB 0 ;段界限(BIT16-19)(含段属性的高4位)
: R8 B' d/ M( g, g8 u7 D1 A7 n - BaseH DB 0 ;段基地址(BIT24-31)
1 i' q m D' i - DESC ENDS1 n7 y0 b j3 C- h4 Z1 u
- , W, l4 T0 A- P
- PDesc STRUC' x& f9 R7 a7 p7 @( }7 B- p
- Limit DW 0 ;16位界限; w; I7 {, X8 U
- Base DD 0 ;32位基地址
. |. V, t7 O1 ~4 A1 ^ - PDesc ENDS7 o# T- _6 W; J z
! {+ F9 S( ]6 }5 s5 _- GDT_def Label Fword
) m' o% O1 U0 O( U - Null_Desc DESC < 0h, 0h, 00h, 00h, 000h, 0>9 \ t6 L# C0 y0 S/ u( ]
- Data_Desc DESC < 0FFFFh, 0h, 00h, 92h, 08Fh, 0>
/ z7 i5 W) b( ~$ x& s
& [2 M6 b0 O5 p, Y- GDT_Addr PDesc <$-GDT_def-1, >0 n @- ^- ]2 d* @% u
- DSEG ENDS ;数据段定义结束
! C* Y9 ]! z1 _& Q - ; D) O3 N1 N9 i3 u
- CSEG SEGMENT USE16 ;16位代码段+ |1 M. j$ k; H8 t
- ASSUME CS:CSEG,DS:DSEG `# _( G) u: F/ E# N
- .Startup0 j, F4 g9 [5 z8 }$ w+ E3 q
- call Set4gb
' S$ y4 t+ a6 }( q/ h6 c8 S - ;% A( z q8 Q+ {/ f/ T1 T
- ; fs, gs即能访问4GB空间
( @7 M5 d7 m' j- v& e - ; write your code in here.2 J5 {/ v+ s) J- d+ O3 s6 e
- ;& c6 O, L4 n$ |6 l
- .exit
$ f4 | C3 E$ g, t& J0 e* k: D -
$ P, r9 z& x; }7 U - Set4gb PROC NEAR
# X1 A! [1 Q3 L0 p: O2 D - in al, 92h
, I, L. n( P# b" X9 c - or al, 002
, u+ l' {% i, `, n5 B - out 092h, al
' z1 O: ^. r% \- m - out 0edh, al( _) C1 Q. |; ~4 N' i4 p
2 p% L b, {: o% n0 d- cli
4 n7 F8 u& K; Q7 H o# {: H8 P
6 v# _" a) \2 N1 V- ; mov word ptr GDT_Addr, (2*8-1);( ]5 u) m3 T3 g8 \2 B1 `7 b6 w" O
8 f' h7 O. I( k" B/ y* T% d' J0 T7 `- mov eax, ds
* B# o/ Q# r2 d3 Z( ], P1 g8 f - shl eax, 42 y% K8 D8 t! \0 i" p; R
- xor ebx, ebx
( s" |: Q% k! o5 l - mov bx, offset GDT_def
9 E2 z4 [6 p3 \) u! U - add eax, ebx
4 L) a! {/ k9 ?% E" q$ V+ g7 O - mov dword ptr GDT_Addr.Base, eax
* J ?! O$ [: T! {, G6 `/ c - lgdt fword ptr GDT_Addr7 i# ^& |* d' b' V) s' n7 R! `
2 d: h- U2 h$ X+ {: f. p V- mov bx, 8! n/ i* a5 n. s1 l& W' x1 }
- mov eax, cr0: b4 h( ^' |8 E; [3 ?4 i, b
- or al, 1
$ o2 T" Q+ u0 t - mov cr0, eax7 E/ ]! r7 M$ X+ d# B m
- & x1 g( L: t5 R' u
- jmp pMod
: t0 J# t! O' y: X: D* a - pMod:2 u3 ^% S+ _0 x2 S. @' S' X! N
Q# h* Z& d1 c$ j6 m3 W$ d2 t K- mov fs, bx
2 |$ w+ Z0 E, O7 v& d/ {: q - mov gs, bx
' G3 _+ \5 s E7 D9 p" T - and al, 0FEh
+ w: x1 a: }3 {* {2 p7 t2 P - mov cr0, eax h1 p% ]' [- I4 ?: M
-
8 }% R! Y4 R1 P& |" X - jmp rMod
6 G* R$ r" E& c5 M - rMod:+ h% C/ O9 ?3 ~3 f: Z3 {! I
. j9 J9 @: L, i& s- mov ax, 0; H, T& V+ E$ t0 Z
- mov fs, ax
, {5 _6 t. \5 }, f5 I3 Y - mov gs, ax
( N% P2 C6 A! |) ]# z3 _+ o6 H - ; E' X% m* c& z4 G$ r. L8 K# h
- ; 在2M的位置测试写一下数据
/ W# E ~3 a2 T+ R8 a: i - mov esi, 200000h9 z- H. x% t( W% c& I% ~
- mov dword ptr fs:[esi], 055aa55aah# `/ h% G, ?5 p& O& e5 X4 t; ?
- ; 用RU去看看200000h的位置是否是此数据....
2 M+ m' P: H! a. [' U0 q3 c - ' S* j4 q8 a7 V
- sti
1 x( E4 J9 ^$ v/ D$ Y) Z& J - ret
4 A) B) a% d0 ^ - Set4gb ENDP
1 {8 W' i7 J, n. L; K2 [+ P" a" x9 q -
. C' {9 b( @+ A - CSEG ENDS ;代码段定义结束
1 V+ ?( l3 z; O$ l - end
复制代码 |
|