|
|
刚学习的同学,有些还不会,我这里贴点C和asm的代码。只供参考。+ C! E/ P% A) b( Q9 t
2 ?: M: z1 D) g( x' y
这是C的- /********************************************************************
. f/ E3 X5 i- R# B - * File: DOS4G.H *5 t$ t7 U+ Q/ s
- * Compile with BC 3.1 ( Editor: Tab size = 4 ) *- C) @- S5 U. Q" k# E7 q
- * *
1 q5 p; K# ?# w8 s - * ========================Title=============================== *- o3 F: l+ b+ \! h, F0 B
- * 这个函数是让系统进入DOS 4G模式 *& I1 M7 `4 V; ?3 ]! |; D( d
- * 程序参考了:陈家琪《DOS实方式下直接访问4GB》 *
: _6 @* F- P8 a% w - * *! o% e, j4 J( h3 f- a7 p
- * 使用: openA20(); set4gb(); *
; a4 L C" K2 f0 L4 v# x - * *
. j0 q8 q& c, c( l: S% O* ? - * ===========================History========================== */ c$ k7 W% V Q$ E2 g2 T- q
- * author: bini *
$ U( X' @& g: |) D$ s% ` - * date: 2004-11-30 Frist version. *
9 K% I7 C# I& \+ v6 Q1 ]0 s9 p - ********************************************************************/" `: b2 W; s! q1 c$ q) v( x
- 9 N' ^; `, p2 v* w y. [7 l
- #include <conio.h>
' Q Q3 }5 G5 V6 N! a$ v! _0 c - #pragma inline4 c% G1 S/ t2 U
- ' }4 Z h6 w. E: y% X/ l
- /***********************************************
. d4 P; D, U7 n9 @3 Q - * 两个GDT,第一个为系统使用,不管,默认为0 *
2 I4 m1 G' l$ M3 S - * 第二个为一个数据段,没有代码段。 *7 y, [* N7 D+ W: H9 S6 A$ C) d
- ***********************************************/* n: d7 v# u$ Z1 d
- unsigned long GDT_def[ ]={0,0, /*系统使用*/
) C! e8 ?$ j7 F- s0 g# W+ {1 k - 0x0000FFFF, /* hi16bit( 0~15 ) is base low=0,
/ M4 n' i. I1 n# H1 ? - low16bit( 0~15 ) is limit low=0xFFFF ! S6 _2 I% q7 K( F% s- M% e
- */& ?; z% [/ z: R
- 0x008F9200};/* 最低字节为 base( bit 16~23 )" ]8 |0 p3 P6 a0 O: R
- 最高字节为 base( bit 24~31 )
$ @2 Z$ H' o8 D+ A2 @6 [ -
' E7 g e3 w. H. N6 f - 属性Attrib = 0x8F928 B& S# ?1 Y! l8 o5 l
-
& g' j0 z( u% w7 d$ p, c5 Y3 i& b - 属性位Hibyte低四位为 1 K! r- f' R( A3 v8 [0 L" h
- Limit( 16~19 )=F
+ W6 Y* |8 Y5 D1 ]- R% D; A8 e - 属性位Hibyte bit7 为粒度" S' z2 C; S& s l6 U" \
- (值1=4KB粒度)
! o+ n* F u2 c - 8F & 0x80 = 1
* N: ]9 i$ n$ `/ H p- L9 y) N4 h - 9 @" z3 p$ G# Z Y, ], B$ e
- 属性位Lowbyte低四位为段类型,值=23 J6 S% o- ^1 B1 }$ F# P) P9 B3 E9 r
- 表示为可读/写段9 \& ^8 E, ]$ z5 o$ v7 M
- 属性位Hibyte高四位=9,bit3=1表示:* ~ Z1 `/ e+ p% `/ U3 D1 [
- 描述符对地址转换是有效的。2 e. z' j2 @) X/ u) r2 T
- bit0=1表示为:
* ?0 p5 f( g! K* D3 J2 } - 系统段描述符。而不是门描述符。/ n1 a6 k7 r. A* [' X0 K# n
-
' F( i" d4 n5 }1 I6 \: H - */$ g7 [- \& M5 J; q& v" E
- / o; ]6 [" }: L# v
- /****************************************9 c9 x& s5 p$ s1 q
- * GDTR寄存器, 48bit=6bytes *
A+ G$ O/ `2 c- \: E7 k: m - * +-------------------------------+ *
# l. a+ p) N. f& @/ Y9 z - * | 32bit基地址 |16bit界限| *8 C7 p( S0 u# q) n8 s9 n$ ]
- * +-------------------------------+ *
9 s; k+ p1 E1 \( R6 `0 ?0 W - ****************************************/8 S( U! }% _ l: r
- unsigned char GDT_Addr[6]={0};
. \" x7 Q2 u' _! U; v" q+ A - $ E* U" r6 T2 Q5 C9 s7 y* H
- /****************! w; s# K% B- L+ Z# ~) h- g
- * 打开A20门 *
t+ k3 E' u! n. [ q5 D - ****************/
# @) H5 b' p% Z7 Q - void openA20(void)
! ]5 O2 s$ W( k - {
. W2 W4 g* \4 `# A& P - asm{
; [3 P+ [- h2 e - pusha& V) h! g4 x# } B# I7 ~2 K8 Z& m
- in al, 92H1 ?& m& g$ l, R) l' n5 y: `& {. t
- or al, 0x02, i; s! e4 F" D" g5 h& E
- out 0x92, al
- V' u# \) C1 s: n. q9 a6 L- F: S8 t - out 0xed, al5 c# c* u* I1 m' G/ Q4 f2 o
- popa" E7 B0 p; \2 G9 B$ l( p
- }' h7 v: w- d; ?; R
- }
{$ B, u- v6 n - - N2 w' f9 P0 j* Y: M: i% z
- /***********************************************; q: R7 h* F9 y5 x1 v
- * 函数功能:进入DOS4G *" O, n$ \& E6 c$ ~2 ~! N# x
- * ==================== *, V/ M2 f4 x, d* O5 `4 p& c
- * *) r" b) i# K$ Q! X0 Z3 h& Q( D8 }
- * GDT描述符界限计算方式:描述符个数*8-1 *5 B1 h! e& x5 H0 S0 L
- * 如: *
; T1 X5 [3 y( Z; @' G1 p - * mov word ptr GDT_Addr[0], (2*8-1); *
# ]; h: T- R% d5 n) K! g2 g - * 表示为 2个GTD *6 W7 I* J8 I; R6 e/ R2 d
- * *
( S2 }$ O1 k. _9 E - * 选择子为所在描述符内的字节偏移。 *! e ?# v. r% A P6 O' r! h; {
- * *
. P0 l" x1 j0 q! ]6 q( L7 n' ~ - ***********************************************/
0 ~# s) v; c$ B j+ ] - void set4gb(void)/ A! V2 W$ j2 e: B
- {
2 G2 ?$ G+ K% I4 G" T$ w$ X: T* K$ X - asm{/ }; B3 ^- v S1 |
- cli( v1 O& J) X/ z, f, ^/ t4 v- R* t
- /****************************************
: l9 |# X9 `7 }0 ~+ J% g0 p - * GDTR寄存器 *
/ `; w8 N/ i: Z# h9 ]; T - * +-------------------------------+ *
' H6 i$ p2 [/ b" w/ S - * | 32bit基地址 |16bit界限| *
) D' _6 c( E( `; H3 z - * +-------------------------------+ *
6 K( Q8 T4 j. {) ?: M# A0 M& m - *****************************************/: s' u |: N3 M: }& A& ^! q
- /*********************
4 I9 [- ^% `7 M - * 得出段界限 *( S8 v& t2 {" C: j6 [( a; E! `
- *********************/
4 f8 n; J; q+ O4 e3 E' p - mov word ptr GDT_Addr[0], (2*8-1);
! e. Q0 f$ M) j+ K+ R1 [+ I - /********************************************
% M6 v! w+ n" Q7 ?2 ] - * 计算GDT表的32位基地址,存入GDTR *$ g Y7 u g- y% z' B: W3 E0 z
- ********************************************/3 d$ ?" F9 {! b+ d
- mov eax, ds
* R8 F" B8 R F% v/ S - shl eax, 4) r" y) N7 y3 y
- xor ebx, ebx
% U6 A/ x) f+ }" W7 V - mov bx, offset GDT_def
' m9 o% z+ ^/ q1 P7 H, G) U2 {& _' I - add eax, ebx n1 u5 J5 l& v- n+ G( W: b* x4 h9 t1 p
- mov dword ptr GDT_Addr[2], eax
5 \2 j/ ] Q1 y% ]8 _, i - lgdt fword ptr GDT_Addr( S7 m( |4 Y; v1 H
- /********************
0 h& G; `/ V0 O: Y - * 选择子偏移 *
. o8 B1 a& \; A" p8 ~, g9 f, g( v - ********************/8 m( W& x) G) J# Q5 T( q
- mov bx, 8* z# ?; n7 G$ J4 t# E% f
- mov eax, cr0
4 @, h# }6 T4 b( T" P) c - or al, 1. b R1 ?* p& |6 W. S" g+ n7 Z
- /**********************7 N7 R" h% ]/ C; J3 P- J: |2 z( h
- * 进入保护模式 *
3 r" ^; c* C) L2 m* g6 T) q, R - **********************/
- {( B8 s. c+ F7 u* p: ?; [9 J- a$ u% h - mov cr0, eax
0 d2 a: d. U; m" h- n1 d5 p4 ~ - jmp pMod
5 A$ I7 a9 V0 z. e# V) Y5 R - }" M- p O8 C% w$ u' \9 A
+ @5 T; b- E9 D- pMod: asm{9 ~5 ~5 R' ?5 w' ~# n5 ^% b
- /************************************************************, X' W7 F+ E$ B+ e$ t/ O6 g+ U4 g
- * 让fs与gs加载选择子,使其能访问 0xFFFFF * 4K (4GB) 空间 ** H2 P) A6 M7 {1 ?
- ************************************************************/
5 N7 `- V) F) V2 L; ~/ Z- k3 p - mov fs, bx! Q% m7 Y4 j- n5 ` ]1 Y) M7 a; y/ G
- mov gs, bx% ~+ ]" o4 d0 S6 Y' C
- and al, 0x0FE% _5 C! W( X5 n! h. O) x' o' j
- /******************
/ V$ m, w1 `* t+ {7 W - * 进入实模式 *
( t% r. l/ d9 q8 V7 w - ******************/9 v9 C3 o2 m& C% ^* g" _2 ]' A) d
- mov cr0, eax
5 k0 o. [# F8 l3 [+ W) M - jmp rMod3 T2 I% l8 _8 @# [1 X( J/ e1 X
- } [) V2 _" @4 \( F R# P9 I2 ~; W
- , R% z8 {6 ^( i) B
- rMod: asm{
5 v7 ~; d* T( `8 N: T - /* ******************************************************************* j+ E% n6 i/ j. A" h" B
- * 退出,fs、gs清0,访问系统内存可用: gs[32位,相对于0的偏移地址] *# U3 j& g/ f% E M: N
- ********************************************************************/
8 |! y! \: k: ]7 T - mov ax, 04 o( M1 K* [5 u/ W+ Q
- mov fs, ax
_6 M" ^4 C4 A8 w' k8 Y& u2 \ - mov gs, ax
: G) q" n. e! E( V3 A( T - sti
( i! Q4 V+ w2 a& B" e - }
% Z" M( @; E! o) m, `6 w4 P7 X - }
复制代码 这是asm的- ;/********************************************************************4 Q7 z M5 U3 D
- ;* File: DOS4G.asm *7 G* T0 ~# k0 h& @1 g$ n% Q
- ;* Compile with masm ( Editor: Tab size = 4 ) *
* T- B( c, G' Z; o; `, f: p& r5 n - ;* *
/ h: \9 q8 h) h9 e$ @ - ;* ========================Title=============================== *
! o* d y3 Y3 s. K" b( O - ;* 这个demo是让系统进入DOS 4G模式,进行数据访问 *
3 M& B* J C# ^& H% t5 H5 X - ;* *) b4 ^, v7 h: M) Z! y
- ;* ===========================History========================== *3 n: r% g$ r8 p2 V
- ;* author: bini *
. f6 }6 g* q( j7 P4 V& z) S: O - ;* date: 2008-10-08 Frist version. ** O; X8 | h' q, I
- ;********************************************************************/
5 k9 {4 X# ^6 y6 V& V. ? - .model small1 H' c/ t9 r5 X" u& h/ {: U
- .586p
3 g/ P4 u4 z: T# n - % a+ {1 x3 y; F* j- \3 m8 C" q
- DSEG SEGMENT USE16 ;16位数据段( c/ Y4 a5 ]" u' y8 [
- ( v2 [' `% P G. e( E q! ]8 H9 h
- DESC STRUC
9 l( G5 v+ _% m0 }+ C - LimitL DW 0 ;段界限(BIT0-15), S" F( ]* t# ^
- BaseL DW 0 ;段基地址(BIT0-15)2 O" r% ~) ]& T" P' d+ W* x
- BaseM DB 0 ;段基地址(BIT16-23)
5 F0 D% H/ s( s& M( d - Attributes DB 0 ;段属性1 S$ ^4 V' w) P: q# T; O
- LimitH DB 0 ;段界限(BIT16-19)(含段属性的高4位)0 E; }' M" B2 K' ~" Z: {
- BaseH DB 0 ;段基地址(BIT24-31)
; ?/ e- ^2 [! s& y7 r" u - DESC ENDS) i% g8 Y6 [, L3 G1 m, a% @% X, n
& y6 p9 O3 w4 V1 B- PDesc STRUC. W- t8 Q5 ^) l9 o+ }0 B9 G
- Limit DW 0 ;16位界限
: n- f' u! L: b+ k- Q8 f - Base DD 0 ;32位基地址5 y$ q, e4 t3 ?: e# c
- PDesc ENDS
/ F& B7 o% U! _6 Y. R
* b9 `0 y7 P8 n9 K4 B# _- U# k$ r- GDT_def Label Fword4 c- |4 z3 G/ p# Q1 S1 o
- Null_Desc DESC < 0h, 0h, 00h, 00h, 000h, 0>
9 s1 `( O0 x- z- t$ @' b - Data_Desc DESC < 0FFFFh, 0h, 00h, 92h, 08Fh, 0>
7 D' z: Y+ x4 P. S- \ w' K7 }
8 r: |1 }. n, S8 m5 S- GDT_Addr PDesc <$-GDT_def-1, >9 K& a, @3 C$ U% e+ W9 ]
- DSEG ENDS ;数据段定义结束
) h! \& I/ N% a5 s - * F, M+ C* E& o* G4 x
- CSEG SEGMENT USE16 ;16位代码段3 p- S3 e. P8 U5 d. d+ `' H
- ASSUME CS:CSEG,DS:DSEG
?& N' \. J" z - .Startup& g3 k) D, {/ M% X: I/ j1 T. d
- call Set4gb; f! C5 d M6 R2 `0 l% T
- ;; l& N- |) u" L" c1 ?, p/ m
- ; fs, gs即能访问4GB空间( F) a" u) ~! N, u
- ; write your code in here.
* h+ M O7 d' C, l6 Y% @0 J# _5 z! S - ;. b A( V4 }9 W. E
- .exit
7 M R+ ?* J0 A# y8 S l& F -
8 D! f+ T8 Y7 {' L - Set4gb PROC NEAR
3 g2 N9 O0 ^* J- M" q- P - in al, 92h
& D2 e: j0 w4 r- f - or al, 002
. Q0 V! I$ S/ W( K, O* V o( e' @/ T - out 092h, al& C, r4 ]$ p2 p# a# j B# h
- out 0edh, al2 v- f, H+ p/ j/ V/ N, J" t
- ; @; a) q# u% y- @3 y' C4 C
- cli6 w/ L8 y" F4 I, I9 _% X$ h
- $ x6 t* U- E! E: @* h% r
- ; mov word ptr GDT_Addr, (2*8-1);
}8 |0 a) Z' P8 }- t, a
7 m- e9 i9 ~8 m9 }& M7 w2 [" N- mov eax, ds' z# F7 O- N4 `3 h6 l& \% a5 y) \! N
- shl eax, 4. i J& S) z9 ?' i
- xor ebx, ebx, m; N1 h# }. L9 \/ t( {: `( I m
- mov bx, offset GDT_def* G% N$ y- Z2 r9 Y
- add eax, ebx5 z" r: _* H$ M+ ^+ u. q" ^
- mov dword ptr GDT_Addr.Base, eax
% S& P/ L( g7 ?/ w( v9 e2 G/ \: i$ y - lgdt fword ptr GDT_Addr% a8 ~0 x# [% Y* G: V" T
( z* {* m* r* k. S) z) x3 f- mov bx, 8
/ l ~+ I% x/ D( t }; V - mov eax, cr0+ @' b/ a$ Q3 O) k3 @, O
- or al, 17 V3 q! W- S6 f- s8 M& z
- mov cr0, eax# \) K* V7 B- S/ t+ I# |; g
8 n0 ?# S' ]; K) K- jmp pMod
. T/ t2 v. j7 m+ T9 F6 H - pMod:5 c8 E7 L, q, t
7 X# u& Z0 g V( J0 D$ p- mov fs, bx
1 Z% K5 e4 V% O/ F, I6 U* q6 A - mov gs, bx4 w8 ? G. X: ]
- and al, 0FEh
$ V! |/ B c" K - mov cr0, eax
* Y+ S$ M4 `3 K -
* S" w+ Q% E' E( l5 b) @ - jmp rMod/ S b& |8 s. N
- rMod:
2 p: |2 c. p- w9 H8 T; M# p i
% \/ h8 F6 y. t" j- mov ax, 0, l# c$ V: `9 E, v' ?
- mov fs, ax
& C0 f. c7 y2 q3 E - mov gs, ax
- [- e/ S- f& Z/ P - P- A/ W2 j2 K
- ; 在2M的位置测试写一下数据( o, n& y" w( k! p
- mov esi, 200000h
2 C0 h+ h; ~8 Q4 W% ]1 o - mov dword ptr fs:[esi], 055aa55aah
# S$ N0 N, B) q6 k; F3 I: d) q - ; 用RU去看看200000h的位置是否是此数据....* ~) I6 [$ {7 H2 J! [$ c
; ?+ W/ c& g1 b1 Q6 [8 F. ]: n0 \. N- sti2 N6 r) o4 ~$ ~: O% U* V6 l) q. C
- ret4 Z8 j+ L2 M% Y* f7 _
- Set4gb ENDP$ ]1 n3 Q q% ~1 o% G
- * L% r# c* A- ^; D/ O- @6 M
- CSEG ENDS ;代码段定义结束
# a; a" a& |' k3 f0 f - end
复制代码 |
|