|
|
刚学习的同学,有些还不会,我这里贴点C和asm的代码。只供参考。- o- x' I; v- a8 x# t7 l8 K
; m) i" d4 K6 E. E( h这是C的- /********************************************************************
, J' l5 S2 |7 B - * File: DOS4G.H *
+ a; d+ Z& B7 R" J- v - * Compile with BC 3.1 ( Editor: Tab size = 4 ) *5 [3 K* U. M, P& D+ P& l0 y
- * *; f7 C: m9 r$ K0 G1 C
- * ========================Title=============================== *0 t/ \( b' b$ u( S5 O0 O; B
- * 这个函数是让系统进入DOS 4G模式 *4 w/ t. s4 a, p% T
- * 程序参考了:陈家琪《DOS实方式下直接访问4GB》 *. a1 d. T/ Q5 O4 a! J( ?
- * *
0 L! G! Y# {- I - * 使用: openA20(); set4gb(); *9 `" S* L7 Y" _9 z( A/ r* L4 @' u
- * *# {. O7 i! I* K+ S( c0 L4 H% D
- * ===========================History========================== *
3 C8 u. _1 L$ H" f) S" s. S - * author: bini *
8 j9 `+ W# s1 } p7 `9 h - * date: 2004-11-30 Frist version. *8 c7 a$ z" G: T& j: s1 y& w3 W
- ********************************************************************/
! m5 Z6 R2 y$ e1 z' c- S' b
! U! n+ U8 m: M, Y& ~' j1 A- #include <conio.h>" N( E9 B/ L% V0 }# o l1 d% F
- #pragma inline
! I: O3 v8 B$ Z- {) y - 0 Z6 k% l% W8 E* F7 l% p: P
- /***********************************************) N1 c4 v) o2 j3 j1 p- ^% I
- * 两个GDT,第一个为系统使用,不管,默认为0 *
) o; ?- v( d& r1 R+ Y - * 第二个为一个数据段,没有代码段。 *) I: c# A* o" q
- ***********************************************/
5 u) _: {8 ~6 u4 f" C - unsigned long GDT_def[ ]={0,0, /*系统使用*/
( ?3 f5 D) R" H/ t1 T+ { - 0x0000FFFF, /* hi16bit( 0~15 ) is base low=0,
4 k& ^7 {( j% @3 v( Q- K - low16bit( 0~15 ) is limit low=0xFFFF
' l t9 N- d$ k8 H. ?0 } - */6 p) n. ]+ \$ a! s' j, W" v
- 0x008F9200};/* 最低字节为 base( bit 16~23 )+ c! ~( D: h" g3 P
- 最高字节为 base( bit 24~31 )
' |5 n$ E9 d: u! x - 5 F4 W; J) g) g: F% e
- 属性Attrib = 0x8F92
9 H% k. g( r& I) H* Z" M' t -
$ k* W7 \: ?0 j - 属性位Hibyte低四位为 5 H7 i0 l) |: X, P5 y+ f$ k
- Limit( 16~19 )=F* h2 ~& O9 x1 L; s
- 属性位Hibyte bit7 为粒度
3 L7 I; k' H, b+ K6 E: D2 b8 l' { - (值1=4KB粒度)) p2 I% j* G3 [; @$ O
- 8F & 0x80 = 1
) D1 A7 {6 B# c7 q- Q -
. {, Q4 Y$ ?' i; d2 m - 属性位Lowbyte低四位为段类型,值=2
' c. G8 Y; Z: {" N: w - 表示为可读/写段
' g: n( E$ H6 }; C# ^4 k - 属性位Hibyte高四位=9,bit3=1表示:, M6 h+ c6 s5 T {+ B
- 描述符对地址转换是有效的。9 g4 p( g3 U2 ?. _) Q- ?
- bit0=1表示为:
- h2 n. s& \* x H6 s - 系统段描述符。而不是门描述符。
3 y {2 s+ {5 o p -
1 o( I& X Z. l* X, ]8 {0 b5 ~0 _ - *// x+ v K# r1 n8 Z3 g$ A
- S, @5 q6 @$ n5 g0 [
- /****************************************
3 k: x3 M& y, ?8 {8 p x( b - * GDTR寄存器, 48bit=6bytes *
' {9 q, Z2 P2 j7 R% I - * +-------------------------------+ *5 y7 y7 ]# a ^6 n+ A
- * | 32bit基地址 |16bit界限| *& O$ C$ L" `4 [; h) g0 Q- X) n
- * +-------------------------------+ *
* z& B! ]# o4 R' t - ****************************************/
1 @6 `/ G% F6 Z- Q$ \' H6 q - unsigned char GDT_Addr[6]={0};7 z, ~/ h8 g; Q- B+ Y# v2 k8 Y
- / F G, J0 \; W; x. J
- /****************$ j6 }0 Z$ R9 E5 J. p) N) E
- * 打开A20门 *0 }- \: i9 U7 P7 [9 ~6 X; y0 H
- ****************/) P6 O2 g/ L$ o, J( _' k0 H6 R
- void openA20(void)4 `) \ n8 `& e5 w3 I) }
- {$ O! @; a. \* m) a" M7 y; y
- asm{
9 R0 s; b* X4 l) H' F0 `# c! Z8 y - pusha" }+ i% v0 H# E7 m0 @! w ~
- in al, 92H/ P% x. @8 O3 y3 z
- or al, 0x026 y( k6 _, M+ n) S2 g$ [. A
- out 0x92, al
! n ?* `9 C- E r7 {1 I5 R - out 0xed, al& T- K. c, u6 S
- popa
% J1 O# y+ l1 T+ _* k" | - }* J& z6 D1 k9 c3 E6 K# h0 N8 i
- }3 @! ^ G) a: _7 x8 I
$ V" y' }% {( M: J/ H h6 E- /***********************************************) n5 T" v8 ^! ]( j
- * 函数功能:进入DOS4G *
3 X. G2 l, D1 J* l( ]8 n9 O - * ==================== *
+ v- {1 k5 V/ t1 \* A5 u - * *9 d3 N$ Z M, U
- * GDT描述符界限计算方式:描述符个数*8-1 *8 I: X: K% _3 c8 C
- * 如: *, j% m( Y4 Q9 ~' p3 S* L
- * mov word ptr GDT_Addr[0], (2*8-1); *% |0 W6 f' [1 y: [ y! Q
- * 表示为 2个GTD *
* ?! T. |7 Z" F6 e: ? - * *8 K) ~& n7 ?- ?. J2 v
- * 选择子为所在描述符内的字节偏移。 *+ ]7 C9 ?6 _/ n( b* O8 l. W
- * *5 }, S g; A2 K
- ***********************************************/3 o$ w( \) h7 M: Z
- void set4gb(void)
# n1 l H' q/ X8 `7 W - {3 F; i% D9 v+ K) o' b( c# o
- asm{
* f8 F& N+ c- o; y5 [6 p - cli
0 v( H* W4 J/ s7 K3 J) r - /****************************************9 s. p& o) }+ r- h' U4 Z
- * GDTR寄存器 *9 v. i" y4 }$ B, V
- * +-------------------------------+ *% [6 h2 ^" R0 q
- * | 32bit基地址 |16bit界限| *
( j0 n9 c$ o: _2 x - * +-------------------------------+ *
5 n0 s# e: G1 u# v. P6 _, l - *****************************************/
% U2 h. D+ O% u8 O0 T& V# r# R - /*********************. Q. q8 ?0 @# e& q% E
- * 得出段界限 *
; |0 P9 s9 x$ h" k - *********************/
- G- c" H( a& L. Z - mov word ptr GDT_Addr[0], (2*8-1);% m1 }+ z) Y% h; ]6 j1 L7 W9 i4 O
- /********************************************
7 c& o' t& t1 W- |( x0 Y0 t* m - * 计算GDT表的32位基地址,存入GDTR *) A. d/ }5 d& I6 r
- ********************************************/" x5 ?6 b! V$ K8 l. N- j. i
- mov eax, ds0 L6 Z* v! }, P0 U' Q
- shl eax, 4% L# w& d( q7 P3 R
- xor ebx, ebx
$ X3 ^+ P6 D3 z/ ? - mov bx, offset GDT_def
- o# f, D& d' [6 O8 }6 G% t - add eax, ebx
: t6 g: S3 M2 ?$ s+ \ - mov dword ptr GDT_Addr[2], eax
& a8 `. J; V& J3 s. h) {: r6 A5 H - lgdt fword ptr GDT_Addr
$ H' {! L6 {; Z) I! b5 ^ - /********************1 g9 y) [$ |9 E, Y3 k% [
- * 选择子偏移 *
8 t: z& Z- h2 j5 W: } I - ********************/
0 c9 L% e F" I7 T9 U* B, i9 b* ?3 h - mov bx, 8
+ _, G E p: Z; ? - mov eax, cr0# J! F/ D F8 i" j; h
- or al, 1
' J/ f5 Y4 r4 u$ Z$ p T - /**********************' f! d* k8 V# |
- * 进入保护模式 *
4 o/ }" ~3 w8 `# D3 E( a; N) y) I7 u - **********************/ M/ V: l l/ K* N3 a: e5 }
- mov cr0, eax
3 @7 ?0 ]& w7 s" l - jmp pMod
" z& Z9 O8 _ S( _/ R/ M - }- @6 G- G( ^( n m9 |
* q! \% C, @9 ^5 y, J# F c) I- pMod: asm{
3 {( W" X- w& I0 { - /************************************************************
" k) r; C% ^; U- A$ z - * 让fs与gs加载选择子,使其能访问 0xFFFFF * 4K (4GB) 空间 *8 L1 \2 X# K' K8 B& A; ]
- ************************************************************/+ C) N8 |- [3 e$ A
- mov fs, bx
2 `" q- r1 u& f3 E( g - mov gs, bx9 U4 w7 l* |2 Z7 Q0 E6 G' n1 A2 P
- and al, 0x0FE
8 }8 h: B( M$ ^/ C+ Q+ A - /******************! I, ^3 m6 H, f9 K# ^, m1 `
- * 进入实模式 *
. s1 t$ k0 ~; X - ******************/, A/ }, i2 Z3 w7 I7 L
- mov cr0, eax' Y% [+ {- W) u1 D
- jmp rMod
4 p7 s# p+ R$ q0 h {( C# K - }4 D% |; _, F4 M& {2 \
- , z: }, n- w, ?' D! @) L# n/ M
- rMod: asm{
. q: D8 s9 w* G& Q! B/ ?) T9 I - /* ******************************************************************
: Z) h8 A. Z- f0 v: k) R - * 退出,fs、gs清0,访问系统内存可用: gs[32位,相对于0的偏移地址] *
* T) o- Y+ d2 v' k; W7 P - ********************************************************************/
2 Z+ u1 J+ n D+ W/ g. K E - mov ax, 0+ d5 d; y" {+ z( K/ s' \' Z6 |3 h/ ]
- mov fs, ax* T0 _0 y2 M" W
- mov gs, ax
. V4 |$ J, ^6 D, a! a) i" @ - sti1 f$ C" T' \" ?
- }
/ M- y7 ]8 b" h' w - }
复制代码 这是asm的- ;/********************************************************************3 j9 ~' m+ a- S! Q. D: A" A
- ;* File: DOS4G.asm *1 D* `- R. [+ ]# `5 X
- ;* Compile with masm ( Editor: Tab size = 4 ) *, a5 C. |' ~2 W& b& g9 d% H7 K
- ;* *
) g, K2 O: A. N% z: T4 e - ;* ========================Title=============================== *
7 v7 C1 M! f2 v1 ?7 s2 t) W - ;* 这个demo是让系统进入DOS 4G模式,进行数据访问 *7 k# M6 x' u9 H" a
- ;* *
9 M2 {% V3 Z: I" j9 z - ;* ===========================History========================== *
1 X1 R9 l+ l" }, j \' r/ w) f& ~/ `$ n - ;* author: bini *' C6 s& e }% c, u, V
- ;* date: 2008-10-08 Frist version. *
" v8 k6 m9 g) ~0 l, Z% H - ;********************************************************************/ / \7 H. c, E1 f5 c% q4 r k
- .model small% C/ w' e/ F/ P0 H& I, v9 |- B5 A/ f
- .586p$ z- d& ]. k; d$ u' G. t6 j/ j6 S
-
0 t. P1 J1 y) G5 `4 w - DSEG SEGMENT USE16 ;16位数据段) O* W* x9 [4 d: I6 e! \4 s: W; f
- P4 A9 h5 k3 h; \- h }- DESC STRUC
; u. J& d; X3 ^ - LimitL DW 0 ;段界限(BIT0-15)% |6 h& z. n$ A# n
- BaseL DW 0 ;段基地址(BIT0-15); U" q# q/ z& g# R& j( [
- BaseM DB 0 ;段基地址(BIT16-23)) y) n6 j; z0 w5 P* a, U
- Attributes DB 0 ;段属性+ N% k: R1 f) k+ ]5 A) E
- LimitH DB 0 ;段界限(BIT16-19)(含段属性的高4位)7 a% n; L0 Y- s7 e2 N8 t7 g( M" O4 g
- BaseH DB 0 ;段基地址(BIT24-31)0 Q" k; j6 g; b! U- P
- DESC ENDS
: ^, y5 e2 }, d9 Y( m
* ?+ {& a+ t4 f* j' W/ U" ~; N8 N+ N- PDesc STRUC1 N8 m7 g. o6 y. f2 P" w- Y
- Limit DW 0 ;16位界限2 ]- @. b9 j2 z# _3 m" e. g
- Base DD 0 ;32位基地址% N9 t1 h% {8 V0 q$ i3 s
- PDesc ENDS ^2 ]; j' s! \2 X B) {
- 1 Y, k; \: z* f% O# ~8 k3 H
- GDT_def Label Fword
+ u( H+ V0 g; q0 R- u' q9 ^) u - Null_Desc DESC < 0h, 0h, 00h, 00h, 000h, 0>
7 f0 l3 C. Q- [* ~' L$ A - Data_Desc DESC < 0FFFFh, 0h, 00h, 92h, 08Fh, 0>
) d2 v1 Y9 B0 I( P) B
8 C1 ?) j7 I# w0 S- GDT_Addr PDesc <$-GDT_def-1, ># y N# d# ?; \* K5 }1 z9 s
- DSEG ENDS ;数据段定义结束8 I" a+ a# }" l
2 R* v2 d; N i$ t* [# S) _$ _- CSEG SEGMENT USE16 ;16位代码段 f2 S/ H" m9 B, L0 D
- ASSUME CS:CSEG,DS:DSEG1 @) F( X7 A; x! y7 o
- .Startup+ Q1 G7 E" `+ j" |! [
- call Set4gb
) k; b n' S" X7 f; B - ;
0 x. e$ j a. M! X$ Z - ; fs, gs即能访问4GB空间3 R& l- [1 R! E) m8 D: M
- ; write your code in here.' [9 C+ B7 ^6 g* x! {" D2 b. _9 n0 |* C
- ;' q" }8 I! \. o. a0 L3 I# F" o7 h
- .exit
( L( ^- U) b! n - 0 h# ?( Z! b% E
- Set4gb PROC NEAR
2 t$ Z* }4 G3 B( Z, r! C4 J' w( k3 n( | - in al, 92h& ~4 o; p8 I% z4 ?1 ^ v
- or al, 002
( ?7 D6 P: G, M/ r, s: [ - out 092h, al
4 m$ `& v$ b; l- P - out 0edh, al" Z m- D1 b, F9 j% {; d( m* A5 K
- r5 ^1 v. W2 x, r- cli
) m+ A2 s% w2 B - $ G) e- \! x3 W0 ~* |$ J* Q* @. a
- ; mov word ptr GDT_Addr, (2*8-1);" P0 r5 t( R v' }1 C8 w
- 6 S% V# q/ V+ s0 x$ {: G
- mov eax, ds; j" s& l" m" |- B, H
- shl eax, 4
; C7 M, K" }6 j! Q/ k3 D5 g - xor ebx, ebx+ d7 q, y% g( v4 v3 |
- mov bx, offset GDT_def5 R" v% L& O3 [$ a4 m# m9 H
- add eax, ebx
* ?5 O3 {; X& U: | l - mov dword ptr GDT_Addr.Base, eax4 [$ M3 W, `2 @ C
- lgdt fword ptr GDT_Addr" H8 x! h4 b, t! ?1 s
- + ~% `3 h9 |9 f
- mov bx, 8
- S N+ a U$ z/ ~4 E3 _. a# }' t - mov eax, cr0: R8 k+ Y4 v4 m5 o6 {
- or al, 18 L6 x1 q, m8 z* l2 j* N) z7 g! B
- mov cr0, eax' i2 Y3 ]! W: o$ ?* g+ j+ n1 g' }
. L' n* J! e6 \4 W# r5 X# O- jmp pMod
3 G) r9 n1 o% g# u% E - pMod:
& ~6 {5 h1 ?- l7 r9 a - , X$ ~4 k, p' ^8 D: E: _/ V
- mov fs, bx+ ]' b! d6 o8 l, c3 H7 ?9 l6 S0 s
- mov gs, bx8 c. c6 V& q. p, D7 D( h2 m. m
- and al, 0FEh# m% V. G. d, O
- mov cr0, eax( r3 I1 p9 H' r R
- , d! F- f/ ^6 L+ N6 ~
- jmp rMod
; _* O- R7 t9 f4 f2 s) x - rMod:7 ^' k5 ^$ u5 B4 q: W, E
- 1 ?8 G* e9 x4 m+ Y
- mov ax, 0, V$ W4 G6 Q- R2 O7 i4 O' I
- mov fs, ax
4 {- r" e: R# T7 i1 D" t7 ]8 ` - mov gs, ax' | q6 n Z: k
- ( h* Y) u. ? `/ N$ j. Y
- ; 在2M的位置测试写一下数据
3 ]0 o/ V+ d' D& }' F7 F4 d4 n - mov esi, 200000h
1 ^* J) [% d- \7 s7 Y - mov dword ptr fs:[esi], 055aa55aah3 C+ D- e% V6 W8 z' h+ Q2 z
- ; 用RU去看看200000h的位置是否是此数据....* \1 B3 R, M0 e& e1 ~% Q9 c
- - q9 ~$ V' P4 n6 j4 T. P0 J
- sti* |& o, S X3 y& ]
- ret
& W, l8 L0 c$ d' Q4 c$ q - Set4gb ENDP
+ f! H& m0 ~ E: J. S) b, W8 Z$ ~9 D& d - - K$ \+ D6 ^4 i
- CSEG ENDS ;代码段定义结束
. M* }1 F# W# a - end
复制代码 |
|