|
|
刚学习的同学,有些还不会,我这里贴点C和asm的代码。只供参考。
% f1 W5 ~2 p3 i6 A( G& {
- ~% U) G* S. T这是C的- /********************************************************************
! D; X/ f9 K8 Y& Y1 u% E% O - * File: DOS4G.H */ M- V) t6 C: u {! c
- * Compile with BC 3.1 ( Editor: Tab size = 4 ) *
9 `6 ~8 |; p- u/ H' K# S - * *7 H6 i! `& Q5 _5 a' Q
- * ========================Title=============================== *
1 ?) Z5 a7 j# R+ |. ?7 l4 Y& Y - * 这个函数是让系统进入DOS 4G模式 *) E/ t5 N2 R) x$ J5 M
- * 程序参考了:陈家琪《DOS实方式下直接访问4GB》 *5 c3 j+ x$ l7 }' h; w2 a7 U7 v
- * *+ ]; z# G. |, e: o1 }
- * 使用: openA20(); set4gb(); *
. a: R* p1 Z2 k m+ _ - * *
$ ~. g! I% M+ C( e) [ - * ===========================History========================== *) i* [2 P' d: M
- * author: bini *
( \1 r0 N' v6 Z+ j" O - * date: 2004-11-30 Frist version. *4 r5 ~8 \8 b* u# a) _& n- K
- ********************************************************************/, H x# e# n- A
- # z3 B- b$ ^, D6 |1 N$ {. c
- #include <conio.h>
6 I6 V3 ?! Y3 r Z- i* i" e - #pragma inline
4 v. a4 }2 d. C6 m0 S( S, M - % P$ E0 p) B6 s- B
- /***********************************************
, Y+ u3 g+ l1 W/ W6 j- \ - * 两个GDT,第一个为系统使用,不管,默认为0 *
+ a6 L v5 t2 C) [; E% Z8 p - * 第二个为一个数据段,没有代码段。 *
; V5 E) c' d) Q; S8 }0 q/ {+ ? - ***********************************************/
/ P0 u5 r( n- L - unsigned long GDT_def[ ]={0,0, /*系统使用*/
9 n) M) v1 G) `7 B( H7 m - 0x0000FFFF, /* hi16bit( 0~15 ) is base low=0, ; @) g/ H. w# E) j: g# i
- low16bit( 0~15 ) is limit low=0xFFFF F7 Y" g( q7 p8 @" ]
- */
) Q1 p8 f! v: w7 u( x - 0x008F9200};/* 最低字节为 base( bit 16~23 )
- H# w) D" V# {7 Y8 q - 最高字节为 base( bit 24~31 )
, p9 j( _; \& \5 X/ j. | - ( c/ n9 @* W/ ]9 r3 T% d
- 属性Attrib = 0x8F92' \! m, R" u0 N5 l
- 7 |0 t9 f+ a1 @+ r1 i0 n1 K/ \
- 属性位Hibyte低四位为 * Y# c/ i, g$ ?# O( O
- Limit( 16~19 )=F
% U8 e0 z! k* L, h+ z) j( Q7 z - 属性位Hibyte bit7 为粒度! A- |* ^7 `) r( c# x* ^- {3 ~
- (值1=4KB粒度)
8 Y3 n) z% E, n% t - 8F & 0x80 = 1& z, O/ q6 f, T0 ~' {( z7 p
- z+ o: S3 I# n) d) r
- 属性位Lowbyte低四位为段类型,值=21 O( U+ W# i E. x; @
- 表示为可读/写段
7 Y2 n; H/ {: ~; n8 d ]# i4 |! p - 属性位Hibyte高四位=9,bit3=1表示:! S8 g4 g4 T( c! g, q% h4 S
- 描述符对地址转换是有效的。. N( ^. o' \! ~
- bit0=1表示为:! N* J0 j. J% i7 A' d; b4 o; Q+ r0 J! H! s
- 系统段描述符。而不是门描述符。& m9 T l# Z/ S& [ U9 ~3 y1 l
-
, U+ I: d* B- |! \5 X3 x - */
9 P: s+ e, a4 r7 \
; f" i; [+ b1 U- /****************************************4 E! R7 ?% \) ~
- * GDTR寄存器, 48bit=6bytes */ |* ], F, l& p3 m1 q
- * +-------------------------------+ */ d. F# V7 l0 \$ Y
- * | 32bit基地址 |16bit界限| *( u: M; K2 i! o! p
- * +-------------------------------+ *
+ n0 w8 p: }* o - ****************************************/2 b$ @& ~5 q: Q; R. B2 Z2 a1 H* T
- unsigned char GDT_Addr[6]={0};
' Y9 U- q: p1 E1 n - 4 x( \9 k9 k1 o m* R) E2 x
- /****************
+ ?' {/ L* `! n0 x7 ?- N! r1 E - * 打开A20门 *% V$ w$ k1 {5 T9 ~. Z1 r d4 ?1 g
- ****************/
) f. w X6 H* V M) B2 w: ` - void openA20(void)
$ Y ?# p! M. Y1 A2 h, B - {
$ |2 V, i" F# R h! `3 G - asm{: m+ q) |# H" v0 ^- z; f' w
- pusha) D. c* x$ y7 C" E/ j5 S- o
- in al, 92H1 T) x5 D$ J& A i! x
- or al, 0x02) d2 L+ @, _* u- L
- out 0x92, al* y9 V5 Q: U( J
- out 0xed, al/ H( o" t- Y+ n$ ?) Y( {
- popa% h% B1 i; D# @9 M
- }0 w' c8 T2 B' t- @8 E
- }
: W- Z! ~, E( O/ v& y5 A& [1 T - ! M% d6 }, p; q% ^
- /***********************************************. A- V8 y ^& @* r
- * 函数功能:进入DOS4G *, h3 j8 l7 {5 n6 A; C
- * ==================== *
: D, Q" a9 a' N4 D. k - * *
' M# D( O8 |% ^. w. }4 c+ q - * GDT描述符界限计算方式:描述符个数*8-1 *
; j$ \" d: H) S9 T7 \* k) q - * 如: *. F0 N6 F# X7 C, F3 z" [
- * mov word ptr GDT_Addr[0], (2*8-1); *4 {; q% a* O) Y( V0 ~. |0 A' M' x# @
- * 表示为 2个GTD *
8 d$ v8 A, g* Q: ~; n - * *
. u B( R s( G* ^: _ - * 选择子为所在描述符内的字节偏移。 *
5 u2 D5 \$ {6 O0 J - * *& S9 P: [* V! R( ^ z3 X3 F
- ***********************************************/+ T* O* \2 ]3 p+ F
- void set4gb(void), D: y" q+ P: b, B
- {
: v0 W3 [% n5 f1 J3 D/ d - asm{
' K8 _9 B3 j" g6 j4 q - cli
S3 e' V/ ~7 L `" G. i) Y& ] - /****************************************
, p9 ?- N5 f8 }! K7 `( l" r - * GDTR寄存器 *2 ?1 @& P7 S1 o" e: D+ Q0 v" O
- * +-------------------------------+ *5 I' N! N/ M1 S% b* S1 F. u
- * | 32bit基地址 |16bit界限| *1 _/ x+ i" ?) M) e/ l
- * +-------------------------------+ * x& P' ^3 e1 L3 Q; Z5 M6 c
- *****************************************/
$ H& t. w. T- R% T5 S/ Q4 D - /*********************; K. i" Y& G4 ^/ U7 q3 q
- * 得出段界限 *% f, ~1 R% ^& F
- *********************/
* i2 D8 H( V/ e! m" k% j: z* y - mov word ptr GDT_Addr[0], (2*8-1);+ j5 H, t/ Q9 H7 q
- /********************************************# _) z6 \- d; b/ V$ r9 Y' ?/ [
- * 计算GDT表的32位基地址,存入GDTR *
0 t: q8 Z, P, H, u0 o - ********************************************/$ V& @3 Y" J0 ^: [
- mov eax, ds9 i, I5 ^+ O' Q) {' d' M% h# N; V! g
- shl eax, 4$ z" G% K' \. G1 x+ B6 Y' z
- xor ebx, ebx
2 |- @& r! e1 i- [# S, h$ c+ L - mov bx, offset GDT_def1 J5 r+ H1 c$ R7 N/ m5 v, G3 p! d
- add eax, ebx+ f) }2 S" s$ P2 Z. h1 l$ W' E
- mov dword ptr GDT_Addr[2], eax
+ J; W- Q1 l0 c/ x5 l0 | - lgdt fword ptr GDT_Addr
6 T2 p+ G5 r; e# t8 H" m, X3 C - /********************
3 Q0 i& v2 m. [ V' Z - * 选择子偏移 *
4 w. o" M i. l( ^: q* B. r - ********************/$ B. C4 w9 ?5 c( {- `0 f: s8 l
- mov bx, 8
3 ^5 H# f" O0 T/ c" H# W* i( K3 q - mov eax, cr0
3 Z" e- w' J" u7 h$ U5 I" {) b - or al, 1
$ j% W7 b% p; e1 G- H - /**********************
- F& K1 X) X- s+ q - * 进入保护模式 *
: ~5 \( r0 e' m. {! ]# T - **********************/
" n" B+ A N2 X8 L% q - mov cr0, eax
4 F' T8 f! Z9 O: n; K9 z. _" K" _2 X - jmp pMod
1 x4 y' A! U0 R# |3 H - }% u/ V* N1 a' E5 |
8 e/ e$ U2 S4 g" p, V# T; f- pMod: asm{
, h& H! g: U) `/ P - /************************************************************0 e! Q7 k- c" b# Y
- * 让fs与gs加载选择子,使其能访问 0xFFFFF * 4K (4GB) 空间 *' ^5 Y1 Z: J. c1 l, R" |2 A
- ************************************************************/) S) s1 Y: O. w: W- x% }% K. K
- mov fs, bx
" L ?! |% i# a% M - mov gs, bx q- M. p# x8 M2 } j2 p
- and al, 0x0FE
' S( f1 Y! e# u4 g, Q - /******************
3 n; N9 H' Z3 m5 o - * 进入实模式 *
, l, d$ O( z c# i8 U x - ******************/
" w3 Q, ]! y3 P& c$ M2 B- c - mov cr0, eax
# y+ C: Q8 q* U6 w- o9 l - jmp rMod
: P1 s9 F8 S7 K' U4 Z+ u - }
1 S* [$ v( p/ M2 b3 s2 U2 g0 A - * ]1 [! B9 ~3 x7 ~
- rMod: asm{
: l' q$ {( X% D9 h3 P+ w - /* ******************************************************************. a9 Y+ {( D1 J' @. q) e
- * 退出,fs、gs清0,访问系统内存可用: gs[32位,相对于0的偏移地址] *7 y1 D% i+ R9 a5 q, r3 @
- ********************************************************************/$ U' U! ?2 j% |) O* u6 `. W
- mov ax, 0
; N+ Y, E; ^) M/ i" u$ m - mov fs, ax
. }+ I( d. C2 _& Y8 c4 W9 y- n' d - mov gs, ax, Y5 n5 [& z) F4 |+ _, B! G9 A
- sti. o+ e* t9 g: s& r
- }0 q& B- i0 F& }
- }
复制代码 这是asm的- ;/********************************************************************
9 t" `7 ]! Z7 J: G) @' S7 | - ;* File: DOS4G.asm *7 v4 |9 }# }7 d7 e
- ;* Compile with masm ( Editor: Tab size = 4 ) *
H* F1 H' }' D" x - ;* *) a3 O* v0 N) _
- ;* ========================Title=============================== *0 ^1 x4 H% j, ~+ |& t2 O; V
- ;* 这个demo是让系统进入DOS 4G模式,进行数据访问 *: r9 t" R$ w7 T' _3 m
- ;* *
6 S6 t3 c4 J, Y! x0 L! Q - ;* ===========================History========================== *
" J0 h( }- [4 f - ;* author: bini *
; ^# e; K. L& e& ?# P/ C - ;* date: 2008-10-08 Frist version. *
7 G/ l. C, o1 J( V0 k8 G! { - ;********************************************************************/
" T4 e* b+ L1 Z2 x& {& X - .model small5 T2 \ q" B, J9 s) u
- .586p
0 r1 t( w. D9 V9 i+ p& N- z2 h2 q, f -
0 [. r2 m. I6 E: ?9 [ - DSEG SEGMENT USE16 ;16位数据段
1 ^6 i* H7 {1 ~& h U( N
; u6 Y: K" R6 G# \2 I. Z- DESC STRUC7 i8 Q* Q; b* |! J a2 V( n$ v
- LimitL DW 0 ;段界限(BIT0-15)
4 u! B# n* z9 c7 ?) j5 S - BaseL DW 0 ;段基地址(BIT0-15)
" T5 I" H: D. K/ F - BaseM DB 0 ;段基地址(BIT16-23)
2 \& U( n+ ~% c, [; I$ o; d - Attributes DB 0 ;段属性5 Z7 i" m; b- j D' b
- LimitH DB 0 ;段界限(BIT16-19)(含段属性的高4位)
9 }& s( `7 L) h$ L& @1 W! _ - BaseH DB 0 ;段基地址(BIT24-31); c1 Q2 A& L. I. _2 v) h
- DESC ENDS
( T( V7 _1 b( R! ?1 n/ r5 {: }
: A9 w; U: r4 k6 k- W- PDesc STRUC
9 @8 ]8 h. `5 ^' m% Q - Limit DW 0 ;16位界限+ {8 E: G; ~7 Q6 u) R- Z q) a7 y
- Base DD 0 ;32位基地址
8 J8 z* {! r+ s9 ? - PDesc ENDS
; j: Y; Y6 F+ Y - + |$ {4 h+ N- C3 f, o8 S
- GDT_def Label Fword/ s- j+ P2 m: c$ Z
- Null_Desc DESC < 0h, 0h, 00h, 00h, 000h, 0>
1 a8 G: V0 B) r- o) N5 k - Data_Desc DESC < 0FFFFh, 0h, 00h, 92h, 08Fh, 0>
" E1 c7 T6 O! q, ~* _. K* q* S( O" z - " X! U5 L$ r3 w# {, S" ?
- GDT_Addr PDesc <$-GDT_def-1, >
, @* d; ?: }6 ] d - DSEG ENDS ;数据段定义结束5 {7 _0 @- A" ^( g8 B
- 8 r& R* A! e, T+ g3 w# X
- CSEG SEGMENT USE16 ;16位代码段
) P7 |) V( ~# I. m5 m2 [: k - ASSUME CS:CSEG,DS:DSEG) h" C3 C+ O- l9 }/ F
- .Startup7 n! F, T: ~( P2 f( y" {( c
- call Set4gb
6 g7 p! b5 d& B. h- j. T - ;
0 C, R* X& T% V2 j( g1 Q( u$ a2 s - ; fs, gs即能访问4GB空间
9 w1 r4 M3 {8 k% ^3 g - ; write your code in here.; |3 [2 X6 y9 ^9 |7 m! J- C; ~
- ;
# t) M5 M9 v1 |' o \) x - .exit0 w! [/ Z2 X e
- ! m5 r: r7 i$ j5 Q* O: a" [
- Set4gb PROC NEAR
7 P+ x1 W- w) D% R m: q8 F3 n3 [ - in al, 92h
4 K% y5 R, x7 v3 H6 b7 S4 F. f- f - or al, 002' ?: O( G4 h' e8 U1 R
- out 092h, al
, d( X' f4 `/ g8 x! s( p4 f - out 0edh, al
' L, ]; Z1 T, y$ }5 Y - , s% `* T1 }- u) H6 Z q6 M" w9 o
- cli
# X4 u6 O( N: d) X# H+ v s! | - + x; V! d# w+ Z4 G8 R3 f
- ; mov word ptr GDT_Addr, (2*8-1);
: A7 X! P# m, P+ a - 5 j9 K% `% u) G7 z9 l4 [" w9 W
- mov eax, ds
3 ^1 s/ B" e7 o( U: D - shl eax, 4
) Y5 V% B* U! y9 z% X- { - xor ebx, ebx* d/ i/ ^2 N1 `3 V
- mov bx, offset GDT_def. p: t$ H1 i' y- [6 G
- add eax, ebx
$ O/ i3 X: d6 m; y5 K - mov dword ptr GDT_Addr.Base, eax2 |8 R$ ]1 i7 B" w+ I; ]
- lgdt fword ptr GDT_Addr
8 F( _/ x" M- W* `0 l" h( P4 r - " B/ O, z6 T4 o' }
- mov bx, 8
+ C5 S+ X/ Q2 a+ N, r - mov eax, cr0
S) A5 y$ f1 Z' Q) Z. `9 E - or al, 1
3 G" P+ z* c; ]8 b J" f - mov cr0, eax
% c+ p9 P0 |# g4 \( j3 S - % [! ?: l4 @0 a2 z* V I. Z
- jmp pMod
) }2 q4 o! P. A) C6 {: U) }* H2 W - pMod:; X0 ?5 M2 u, {) X' @$ g( X, o+ `
- 3 E8 a/ g# P7 V- v
- mov fs, bx/ Y( T. k& M9 I) |; d) i8 a
- mov gs, bx; [, Z9 F \( {5 ~
- and al, 0FEh0 J$ W L8 L0 J/ B+ a6 l7 ^! t
- mov cr0, eax
, x% [/ a: N5 W# f2 d) M; u -
! N2 G* y( [9 ~5 n; H - jmp rMod
/ y5 d+ n" S& m5 p: n - rMod:- T$ O; \% t4 p( E! L! h) }3 m
- ]4 c! A7 R% @- mov ax, 0
7 x9 c- {* w& n+ m+ `' s+ B0 c - mov fs, ax$ n$ W, G* y0 A
- mov gs, ax
5 @5 }7 `- ]5 N+ O -
* |/ ?* m, f: R# n% L" e - ; 在2M的位置测试写一下数据
. ~- X7 S9 C/ F6 h) T - mov esi, 200000h
3 V" F' V t3 p! } - mov dword ptr fs:[esi], 055aa55aah
+ `8 x$ K/ a' N! G - ; 用RU去看看200000h的位置是否是此数据....
; M8 S2 F' O) v. f- k( d1 w
3 @7 w" n% \, y; r6 F: R- sti
% I1 G5 N# c# ^; x$ w$ U - ret
9 Y) ~ t2 o* x+ `9 M - Set4gb ENDP
/ s9 [! C- Q# O -
0 {+ v( ~. O! R' R5 ^' }; J - CSEG ENDS ;代码段定义结束% E; [/ E2 d, {. M. `- n
- end
复制代码 |
|