|
|
刚学习的同学,有些还不会,我这里贴点C和asm的代码。只供参考。
" Y& t1 T# s! ?' V3 w; I2 c5 `9 ~4 o' q {, y+ J- F
这是C的- /********************************************************************
+ C: i" N7 Y# Y) o1 _. U - * File: DOS4G.H *
5 e* m: j- g0 [' y - * Compile with BC 3.1 ( Editor: Tab size = 4 ) *; w; T# ~$ d8 P1 w
- * *
l! _2 ?/ r2 A, T: f, p( \2 N - * ========================Title=============================== *3 Z* n% X7 q9 c% \, J u E% e
- * 这个函数是让系统进入DOS 4G模式 *$ g/ |2 m3 C+ V
- * 程序参考了:陈家琪《DOS实方式下直接访问4GB》 *' P9 L9 F3 K/ J! s% W$ }
- * *4 Z$ t3 K( S/ O& e0 a4 v
- * 使用: openA20(); set4gb(); *$ Q L# A; k6 @, d
- * *
# {2 s1 Y$ o9 G7 s - * ===========================History========================== *) `& h$ e1 U4 Y+ U6 e, N! T. Q' H
- * author: bini *: k6 p9 ?. {+ b" l, b5 I( ]
- * date: 2004-11-30 Frist version. *
9 W4 X$ J0 o( s: t - ********************************************************************/
+ c* X$ S( I1 K
2 x% t& N; F% o- #include <conio.h>
3 B- |/ F( V7 |, A w; v2 b - #pragma inline
. V R1 j6 B2 x9 T3 u9 x9 t
/ i% B7 C4 C c* I" B( x* K- /***********************************************# q: P* r! f! z. w5 X
- * 两个GDT,第一个为系统使用,不管,默认为0 *( {' [, w9 r# F9 ]' Q
- * 第二个为一个数据段,没有代码段。 *
1 Z4 t, g3 o; `$ k - ***********************************************/
2 R$ ^) v8 d3 ?' u, q( @/ G - unsigned long GDT_def[ ]={0,0, /*系统使用*/
7 @& x% f' o2 m. c - 0x0000FFFF, /* hi16bit( 0~15 ) is base low=0,
. L1 [: \5 Q9 i% o, s - low16bit( 0~15 ) is limit low=0xFFFF
' X. m6 K7 Q" p7 q) ~2 R B" Z - */
8 M% }6 V0 _! Y: K - 0x008F9200};/* 最低字节为 base( bit 16~23 )
1 A! L, v# v# Y* i8 T% ^1 d- L - 最高字节为 base( bit 24~31 )
' h1 M. r& m" [ ^- z& o - 6 Z0 ~! h0 ~- d8 L/ ~) B# Z
- 属性Attrib = 0x8F92 G& E* v7 {! K9 W
- 6 `$ p2 j3 u8 M% \7 Z: T$ z
- 属性位Hibyte低四位为 5 F5 s) `9 N8 x. O
- Limit( 16~19 )=F' A+ ?$ g8 f: Z2 u0 ^" k( _1 E" R
- 属性位Hibyte bit7 为粒度
6 z; N1 C/ }9 W - (值1=4KB粒度): c' @# G8 E3 [' x- X
- 8F & 0x80 = 1 [% a1 p( i; N) h
-
, j( q0 Q) q5 n" T U - 属性位Lowbyte低四位为段类型,值=2
* ?( c8 B$ E8 ?) k9 s l$ P/ Y - 表示为可读/写段
* M$ O3 [' n/ r! ?! U - 属性位Hibyte高四位=9,bit3=1表示:
( F6 M y# @+ C - 描述符对地址转换是有效的。
6 G" h& ]; [# \& O - bit0=1表示为:
0 |1 _3 I1 G% c: q" |* Z - 系统段描述符。而不是门描述符。
7 S; w4 y/ x k8 l' E( ?5 {+ j - " Z) ] T* ^6 H3 `( i9 V
- */) _6 G5 f2 G7 V8 i
- $ p2 m3 c6 Q" Z* {% \9 ^# q
- /****************************************
6 V% e9 ~) o5 } - * GDTR寄存器, 48bit=6bytes *4 T7 n1 x, L, A
- * +-------------------------------+ */ R5 C0 Q) }- E( H) z/ q" p
- * | 32bit基地址 |16bit界限| *
6 _1 ?5 m. T/ Y - * +-------------------------------+ *+ n" Y W; ?' K/ V' J8 m* l& q9 L$ S
- ****************************************/
5 Z; ]8 @. l) M2 C; @- p - unsigned char GDT_Addr[6]={0};4 r; R8 s+ B% `; E7 y
- ; J; v; E% [0 E/ q1 [: j0 t+ y
- /****************4 j8 l$ b* n" W) ?. p4 J
- * 打开A20门 *" ^$ S& x+ x+ b/ ^ e/ W- D$ s S! O
- ****************/1 ^: Q) \8 E9 K$ o) N7 J
- void openA20(void)
. I# o/ X# W( d# ~* Y$ |8 @% O7 T - {# z* Z: z3 G1 `+ M6 n, X! d
- asm{
+ P3 R7 [% D% O+ R2 I( W8 U- ?3 s* O - pusha
" o" h2 F6 Q: K. j - in al, 92H
- b" h. W) Q+ ~" D - or al, 0x02. s$ z+ o, H( z
- out 0x92, al8 B% ]8 R$ n2 O+ d+ f
- out 0xed, al7 f1 \) |- w, I4 C7 l
- popa2 l- U9 {# y( _, N
- }9 e. S$ A2 w7 @+ M1 H9 @" V! Q
- }
: @2 [/ L% Y: H9 o" m9 X5 ~. l, ? - 1 ~# Y& u8 q0 W# e, e
- /***********************************************, W1 X( q% P% J/ X7 t5 X- x% J
- * 函数功能:进入DOS4G *
2 E/ L8 g" v5 ?& d0 ?% X; C - * ==================== *
. c# i4 H) u3 ?: X+ g* K - * *
) y R7 {% u8 W$ ` - * GDT描述符界限计算方式:描述符个数*8-1 *
) e; s- `& x; N' \3 ? - * 如: *
$ A* C s7 `8 O7 p' G3 c5 F - * mov word ptr GDT_Addr[0], (2*8-1); *
`9 x6 Y! D- b5 c - * 表示为 2个GTD *
# T2 \) b8 v8 y+ G/ [ - * *6 c0 o& c5 n9 H3 ^$ Q
- * 选择子为所在描述符内的字节偏移。 *
3 h6 I! F- G4 t - * *0 C% k# V' ~+ C T
- ***********************************************/
6 q/ F2 K, ]/ N - void set4gb(void)
& w" t, w7 Z- m! G) z" O9 P. _2 n - {. g- I& u7 n' }# ], M$ [1 _+ e; m+ T
- asm{8 e3 Q7 P* V, x* ]4 c
- cli
" q$ n# }. u4 J3 V - /****************************************9 O: A/ z+ o$ y! U; ~) S F3 u
- * GDTR寄存器 *
% \2 o3 }- Q7 v; s% {( O5 D2 L - * +-------------------------------+ *
2 o$ L3 z; y. U3 W, P) k7 ^ - * | 32bit基地址 |16bit界限| *
( v9 Y, l) d6 \2 _" L" c$ c, Z: o( m4 T - * +-------------------------------+ *8 p# a9 q9 H9 p2 C/ i: N9 ~0 |
- *****************************************/
( Q: Z O: _& C6 `( g6 q - /********************** N2 g5 O7 c: }1 _0 I( N
- * 得出段界限 *
; A( Q/ u7 |" O - *********************/
; o% p# p4 M3 L' R! g - mov word ptr GDT_Addr[0], (2*8-1);1 \# y- n s1 f3 M3 i
- /********************************************
( ^% U4 K! [ T! K2 j - * 计算GDT表的32位基地址,存入GDTR *
3 k5 z# B; B1 l" r" Y - ********************************************/
! y9 o! K O" h3 s' t' U/ w - mov eax, ds: h3 h. C, Q( F
- shl eax, 45 T: R3 }/ Q2 Y/ P: Q: {1 x K
- xor ebx, ebx
! S' g* [- w* |' @ - mov bx, offset GDT_def9 U& f" d1 u. _6 m* E# H
- add eax, ebx5 K a- u. g2 L. k8 u
- mov dword ptr GDT_Addr[2], eax
$ }% v% @2 m7 Z+ p: b - lgdt fword ptr GDT_Addr
1 `* V4 R1 V l& z, I9 v - /********************2 ~$ E) j7 Y: _2 d* Y" Z$ G4 k
- * 选择子偏移 *$ d, _, \8 V0 K3 Q/ [6 G
- ********************/9 |' E6 j7 F0 G# g5 B4 b
- mov bx, 82 E. h# C+ Q. F% F& ]8 @/ @6 D" V
- mov eax, cr00 |- t# N/ L7 X) ?$ C i
- or al, 1
* E4 ]! s) U9 l9 i4 k- P - /**********************) b6 f% R! \( ^
- * 进入保护模式 *
, X! N1 f. C4 [- C p, F; } - **********************/
4 q( O( X, D' `% ]; f - mov cr0, eax
8 f7 L, M# I) L - jmp pMod; R$ I) H0 W0 }# K5 ]' x* y' h& a+ L5 Q
- }
1 o0 t, r" K8 | d/ Q - $ Q3 M r4 ~8 Z; w8 L
- pMod: asm{1 [6 q4 l% L7 J o F
- /************************************************************
# |4 P2 n+ o- A1 x8 U# l. T - * 让fs与gs加载选择子,使其能访问 0xFFFFF * 4K (4GB) 空间 *, [$ f( c# G: E1 I9 w& L. R
- ************************************************************/1 @- N) ]) a& W }5 k
- mov fs, bx4 g; _6 ?. W; t% z* o
- mov gs, bx
1 v% Q, A0 f1 {6 \$ w+ n) T - and al, 0x0FE( {6 b, ]) B2 W$ h
- /******************
$ ]4 R/ i$ W- p6 L - * 进入实模式 *% M0 ~0 G! J5 ~& e) K2 a* R0 R2 E
- ******************/
( Q# z# B& K& g# k$ j! w - mov cr0, eax+ d% O9 @0 a I8 ~2 K: d( t, y
- jmp rMod# ^+ m8 G/ C( X* h
- }
# u1 Y. ?$ a8 Z - - H) U8 R' b( A+ q# j+ O: b
- rMod: asm{. }; M8 c8 b! M
- /* ******************************************************************4 s5 H* |7 `# G5 T* d+ _. s% c, }
- * 退出,fs、gs清0,访问系统内存可用: gs[32位,相对于0的偏移地址] *( q* {7 b7 S( M' n; H+ h, j4 Y
- ********************************************************************/5 n' s: \9 d$ A# a% A
- mov ax, 0
5 H4 Y* Z* |( z/ z/ v3 H/ ^ - mov fs, ax, k& e7 U% {% A$ p+ ~% q
- mov gs, ax8 s' f }2 G$ v# I' B0 V6 C
- sti
# ]0 L6 Z0 `( d/ h- ?" _ - }8 t1 K: L- G% {7 Q
- }
复制代码 这是asm的- ;/********************************************************************- c0 M0 L2 J) J9 _' J* q
- ;* File: DOS4G.asm *
* E6 O# |# ^; s( s4 ]% l+ P - ;* Compile with masm ( Editor: Tab size = 4 ) * J) R* z* g' M8 z$ ?6 l& e8 O+ O
- ;* *
5 e( e* t( Y) ]2 t# ~5 a ? - ;* ========================Title=============================== *) k- t. N) V* K& T* o6 E
- ;* 这个demo是让系统进入DOS 4G模式,进行数据访问 *( V: ~& | e- ^% j4 D
- ;* *; ^5 Q$ J8 d+ a3 n$ g7 b2 R; W
- ;* ===========================History========================== *) K2 C) p) N @! z
- ;* author: bini *
4 ], d7 R: P3 l5 ]" p) y; {' Q - ;* date: 2008-10-08 Frist version. *
0 r2 s8 b! }5 V! y$ n - ;********************************************************************/
; _8 x3 |- T1 t" O - .model small% A0 T- A. y% I4 u5 c' d; {: J
- .586p
% ]6 p, {& `. S: V* W: Q7 m3 h - 0 w9 o {5 f% z
- DSEG SEGMENT USE16 ;16位数据段
2 |. f$ `1 g$ j. q5 Y - 5 t0 X8 ~5 k! i8 o. _
- DESC STRUC) e! J# U) t6 @' g9 z9 @
- LimitL DW 0 ;段界限(BIT0-15)) z! _/ Z6 C2 `, V
- BaseL DW 0 ;段基地址(BIT0-15)
! H8 |, w+ [! E4 g1 h! c/ s - BaseM DB 0 ;段基地址(BIT16-23)4 ?( n: q$ Z+ F- v: `1 F& k
- Attributes DB 0 ;段属性
% W' N' R0 R" y, P - LimitH DB 0 ;段界限(BIT16-19)(含段属性的高4位)" ?4 [+ j4 V: ~2 ?/ \! t( }
- BaseH DB 0 ;段基地址(BIT24-31)8 h! u, b( k* i$ r
- DESC ENDS z5 U9 {" R) `: z) U" P, r, [
- O+ v0 s* H* l9 ~; x- PDesc STRUC9 y! H. X) P9 b i( ^
- Limit DW 0 ;16位界限- b' g: {2 \2 Z' x
- Base DD 0 ;32位基地址
: I; ~3 S" i) j, a0 W9 Y; |! {3 w( D6 O - PDesc ENDS
- @2 B" }! r7 ^. y - # w0 l5 R; v1 Q) D/ N; Y6 f
- GDT_def Label Fword
! N3 X* x, n( D8 z5 {. M. b) n - Null_Desc DESC < 0h, 0h, 00h, 00h, 000h, 0>9 m9 e% @; T. D% ?; _. ]) {" L5 {
- Data_Desc DESC < 0FFFFh, 0h, 00h, 92h, 08Fh, 0>
; D6 T* [ S3 _% q$ f$ V) F7 J
8 }" E; S- P& S2 D2 ]5 D7 o- GDT_Addr PDesc <$-GDT_def-1, >0 U- N9 H# {3 |! A9 t- S4 i/ h1 e
- DSEG ENDS ;数据段定义结束
- |' W ~- q; N2 a# S/ W5 y5 { - 3 @) J; }8 q& c9 b$ t" k* m: |; F
- CSEG SEGMENT USE16 ;16位代码段1 M# p. K& m) l8 u5 V4 d
- ASSUME CS:CSEG,DS:DSEG" l9 w, p5 W; t; J1 B: _9 [
- .Startup
' v- j7 I* O* J; N' }% d - call Set4gb) v! ?, m8 ?* B: M
- ;
3 |" {4 J8 \+ J8 n4 w H - ; fs, gs即能访问4GB空间
! d& I3 r# E% R% e- e - ; write your code in here.
0 _; Q2 j/ K5 f# h( Z - ;, p/ b, {4 m7 [* b6 X! N/ {; b- D
- .exit- @, B. a; X: h; D! E+ q
-
" {% i+ a* m8 G/ c9 d4 P - Set4gb PROC NEAR# ^9 M/ Q- `; A# @
- in al, 92h
5 ^8 k; R5 y( X( g) T i" R - or al, 002
! }% d1 r! w, Q8 H* [; E( K) m( O - out 092h, al: d; H: i# @. U+ H0 p
- out 0edh, al
7 }. V, `+ y, u9 X4 X& b
f+ |( K8 k: V' K) k2 K( t7 ^1 K- cli
! f4 C3 \3 m' E
( T8 ?( y y% \6 C- v$ ?( Z; Y- ; mov word ptr GDT_Addr, (2*8-1);7 t1 p' _) z% @4 w, z N0 F- c" T
- y9 o: F: m3 `# u! e0 D3 {
- mov eax, ds
* v4 P4 N, G9 w0 a9 G- p - shl eax, 4
* a6 ]4 t& S) h& y$ ? - xor ebx, ebx
8 `: K* O+ E* g& f; `$ Y - mov bx, offset GDT_def
# U( u* g0 h$ e( S+ z. m - add eax, ebx
( ^* K9 k9 c0 ?9 |. C4 I - mov dword ptr GDT_Addr.Base, eax
& y2 ?1 C3 L$ h* u4 U: k - lgdt fword ptr GDT_Addr
s9 q) q1 F' [ h5 X
. q; Y B1 \8 p, B5 ~- mov bx, 8
. m; g) ]- F' ? N7 h6 C- r - mov eax, cr04 W$ I& @7 @, V3 U* S- U8 D
- or al, 1
& i$ k5 q( l8 P% n6 u - mov cr0, eax
. c3 b% G) p8 [* c) A" C4 s - & {$ e9 F( n* p: c) L$ F8 d
- jmp pMod( M0 @4 Z5 w$ a$ ~% N! [
- pMod:
: l, [4 m. b( J2 o+ q
1 x* u& K* O x4 ]) ]- mov fs, bx' y+ F$ p$ B( E' x
- mov gs, bx
) s R" ?; I0 ^ - and al, 0FEh% c$ @/ ]5 a7 o/ t
- mov cr0, eax
& W4 A0 R/ ?3 z& z( l4 M -
) x0 n& b8 c6 D - jmp rMod
8 i, g: d( Z( p+ Y5 y7 D - rMod:0 u( ?& f/ U5 E9 D
0 S+ c' c2 m5 j J9 ^! @! m& ^) ~- mov ax, 0
7 p, X3 L: d9 T! }' i# K8 q* x1 b - mov fs, ax
% f) e' z! K; | K - mov gs, ax
+ l2 U/ ]- ]' [% S. w: B& I. D' N -
' [) B& b. k+ E/ J: T6 C6 c - ; 在2M的位置测试写一下数据
" r E# _8 V0 E0 T$ ^ - mov esi, 200000h& a; d# O& T4 O/ H7 B
- mov dword ptr fs:[esi], 055aa55aah: k9 [2 [6 r( H G% W( n$ i& X2 J
- ; 用RU去看看200000h的位置是否是此数据....
1 C9 i# G0 y. r: o6 I$ d
# M# P! P1 \# b- sti; e4 a8 f6 z4 P- i. @0 j B y
- ret
5 ~3 N3 x2 k- Y; o - Set4gb ENDP
: A5 _. ?$ H- t1 w2 o -
8 z. r* ]9 ] ^7 z( Y- F5 T - CSEG ENDS ;代码段定义结束
@3 j1 i' M( A9 E - end
复制代码 |
|