|
刚学习的同学,有些还不会,我这里贴点C和asm的代码。只供参考。
4 S6 Z+ a% U C9 a/ N7 W: M/ Z5 t
% u& y! S: `$ Z7 K这是C的- /********************************************************************$ N" r5 w/ t* d! B# [
- * File: DOS4G.H *( M8 F9 e& ?. X$ Y
- * Compile with BC 3.1 ( Editor: Tab size = 4 ) *9 E, D& U7 F+ ?1 K6 H
- * *
: b: ^* H) }0 C& @ - * ========================Title=============================== *
# [ v( M7 U; B8 n% { - * 这个函数是让系统进入DOS 4G模式 *) K/ l7 ?% h: U/ A- ^$ Q. V
- * 程序参考了:陈家琪《DOS实方式下直接访问4GB》 *
7 L1 |/ k: ~, \ - * *
/ Z8 Y; U5 L/ L" Y6 m7 C - * 使用: openA20(); set4gb(); *
- w2 V9 F. H- u* `6 h+ X# @ - * *
6 o! d+ Z: u2 i) V m& r - * ===========================History========================== *$ V. P/ k/ I; ^
- * author: bini *
9 s# i3 l" a/ c9 I5 e3 x - * date: 2004-11-30 Frist version. */ u; G J& E% V1 Z) }( M3 t
- ********************************************************************/& [' \+ w6 _1 K
- % s1 [/ ~1 S; Q% z; `( }2 U
- #include <conio.h>
& x" k. k, }; S& k - #pragma inline8 c1 S I( s5 p( G, l( A0 c
- 0 r7 E3 Y0 N& T* R Z0 S! u( R
- /***********************************************" T2 O5 K( F5 a( `! E
- * 两个GDT,第一个为系统使用,不管,默认为0 *
2 e( U( @* |( k - * 第二个为一个数据段,没有代码段。 *$ t0 Y) `9 N% j) e e
- ***********************************************/& m1 f8 Q) d {% H! f2 ~4 g
- unsigned long GDT_def[ ]={0,0, /*系统使用*/+ \4 n0 }3 e3 `# T+ [( O& M
- 0x0000FFFF, /* hi16bit( 0~15 ) is base low=0, " z5 e. M- l) K( C
- low16bit( 0~15 ) is limit low=0xFFFF ; Q/ `, A7 T3 p/ b! _# ~/ M
- */" w8 W8 t; x# w
- 0x008F9200};/* 最低字节为 base( bit 16~23 )
8 h8 ?8 \% v& j9 S+ q - 最高字节为 base( bit 24~31 )
3 R$ d$ p+ }3 h3 z# T% L0 L S -
( T7 A% X& P3 W; J! \ - 属性Attrib = 0x8F92
$ T% D# s) I* X: H -
. Z+ I* n$ W. j - 属性位Hibyte低四位为 ) ?& d7 R# x9 [0 z/ j" a3 t
- Limit( 16~19 )=F4 Q! `" E8 x+ f+ Y. q4 b6 k
- 属性位Hibyte bit7 为粒度 `% @6 V/ c, a
- (值1=4KB粒度)/ i/ ?1 f1 [9 `' I4 K
- 8F & 0x80 = 17 D2 S/ c( Q# {
- # B' s$ L; ~& J
- 属性位Lowbyte低四位为段类型,值=2
( X x) P0 F8 a1 z% A+ Z) c - 表示为可读/写段" O; q6 ~/ d, } q Z& H
- 属性位Hibyte高四位=9,bit3=1表示:
0 P, q) A- C+ \5 |* I* N0 C4 ^ - 描述符对地址转换是有效的。- t6 N7 i+ y9 u, T, R
- bit0=1表示为:
0 j+ I; P" F1 }6 ], Y2 [) n7 x6 f - 系统段描述符。而不是门描述符。7 A( c" v4 N& o$ G
- * \: O) o' l4 L
- */
; b `$ k/ k6 d% [6 `- r4 P
' e1 m/ S j+ X! D8 c9 l7 @ W- /****************************************
0 A6 U; p9 j( a w2 d( S - * GDTR寄存器, 48bit=6bytes *# r/ }0 \( u# }2 h |* w
- * +-------------------------------+ *
D9 T* P* O8 D; Z W2 \# m - * | 32bit基地址 |16bit界限| *
2 k. A* b- G: s0 x7 _$ N1 z - * +-------------------------------+ *
" m1 _8 f% a( a' ^8 L! O8 I - ****************************************/ e6 A. t3 x& M6 e
- unsigned char GDT_Addr[6]={0};: o, I( e% `' v% A" B- o. k I
- 3 Q% y: G5 |% p$ g
- /****************
: Y$ x, Y0 O! v! {. y# l - * 打开A20门 *
' F" T' I' c5 T - ****************/5 j* o5 U, u/ T. f- ?$ `! h* @0 W
- void openA20(void)
9 }2 D! S2 k$ L4 d% | - {# I, o4 C3 J* S6 p7 d
- asm{
& g( o; K* `9 H2 H9 V# |% n - pusha
: i1 F4 k2 n6 O, D1 F0 ` - in al, 92H
0 H1 J8 o3 N# [ b - or al, 0x02% [' F( e X8 m! ] S0 F
- out 0x92, al
# z2 m) F) [$ B J V - out 0xed, al
+ [+ |, V. u' n# w ? ]/ N; m - popa
( i" E+ a: Z8 S# X5 R# j - }
7 v+ V1 D7 x* o5 ^ - }
% `: p4 ~' l! y1 I' J! ?9 ?7 B - / j t) j3 q* `" C F0 N
- /***********************************************% K7 _1 d* S" x5 F' a
- * 函数功能:进入DOS4G *" O1 F {2 B5 w+ N' t2 ~4 H7 e
- * ==================== *& m$ N- M; [) Z/ ?) J' O
- * *
2 [1 |3 S, K' f; [7 | - * GDT描述符界限计算方式:描述符个数*8-1 *
( L9 F8 z0 a1 C/ _. V4 r' U' W! |3 r2 ^; V - * 如: *
4 K$ @ w7 V8 t! K" P- } - * mov word ptr GDT_Addr[0], (2*8-1); *
8 o; ^" b7 q+ }" l6 c; x - * 表示为 2个GTD *9 d3 S4 I; N5 n5 ~1 F: w( z
- * *
0 x8 h/ d, B, M' G9 Z- L - * 选择子为所在描述符内的字节偏移。 *2 ?1 K/ x% n( m* U9 b
- * *. k, k3 ?4 K8 }3 N1 k; K2 c3 Y
- ***********************************************/# ]* ~3 L. G6 k5 P5 {; U
- void set4gb(void)4 H3 @! O @) t4 a
- {
6 o- c: x( _+ U+ m4 P& b - asm{; T4 t! {* Y! T4 Q( D5 T! g) p
- cli
+ m, s. S, y* q% c |6 ]& t& ]! c+ L - /****************************************4 l( A0 L$ V6 C U
- * GDTR寄存器 *
$ u5 i. \" C6 z, X& s) Z4 V - * +-------------------------------+ *0 D4 G* B, e7 C& q. I
- * | 32bit基地址 |16bit界限| *
- Z- h4 z* K6 ]# ?3 g' I4 ] - * +-------------------------------+ *! }: P* y' p& C' N1 {+ g* k9 `
- *****************************************/5 A9 U$ ~) X8 Z7 l1 w4 Z5 s# F# `7 f
- /*********************
* k% n. M. n* s/ `# } - * 得出段界限 *
3 I) Q0 i" T Q; |. E - *********************/
' {2 y, h, g# c6 f - mov word ptr GDT_Addr[0], (2*8-1);
6 d2 t, Z5 @+ F4 B( G. P - /********************************************
; L% F+ U* m% N% G# p - * 计算GDT表的32位基地址,存入GDTR *
- I* ~. E0 c$ U/ z1 v4 Q. p, j - ********************************************/
) ]! o( b3 a; J5 [ - mov eax, ds
# j5 z ^; M; ?5 D0 \0 b - shl eax, 4
4 a% n L( c/ l8 [ - xor ebx, ebx
: H- \ D/ x; A/ z - mov bx, offset GDT_def
: h/ j7 I" r; v; Y. a - add eax, ebx* q# A) z' c& M# r/ \3 i! h
- mov dword ptr GDT_Addr[2], eax
, Z2 R1 S" Z7 g - lgdt fword ptr GDT_Addr9 D! \" F0 B6 C' b+ |) b
- /********************4 V; C+ }& I: c; n4 S. Z8 k; ~0 `
- * 选择子偏移 *, u$ E `0 f. o" ~& h
- ********************/4 U8 B X4 p7 f r! }5 s" ^8 {' z
- mov bx, 8( M y7 z, Z6 ]/ `( T7 z
- mov eax, cr03 C. z' K. Y, d7 ]; T
- or al, 1
" V3 G4 R, O3 U: S9 G6 \# p - /**********************$ i$ s3 i/ E0 C h) r. x2 L0 R6 B
- * 进入保护模式 *
0 f" Q* t* S1 V) t0 \2 Q6 H - **********************/$ [/ N% [, \9 U7 J
- mov cr0, eax
/ D. K' u' g0 m4 V4 q - jmp pMod" J& q9 f$ s H# i
- }
8 ~& e8 W" S! R& W; I
& M9 s8 ~( f7 v# o- pMod: asm{# ]" i7 Y) ^$ g$ n7 Y6 A
- /************************************************************
- V6 A! s9 H! J' L1 @ - * 让fs与gs加载选择子,使其能访问 0xFFFFF * 4K (4GB) 空间 *4 q( `( k" O# N: Z' C5 F# _
- ************************************************************/+ n! h' x( B4 w" p# f
- mov fs, bx
; k- @& Q% E! M3 ?; j+ p# r3 o2 B - mov gs, bx
& w% @& O0 n5 ]% V - and al, 0x0FE
7 ~4 `9 l7 _4 U7 o+ P" z6 ~ - /******************% ^6 Z. H3 @* A+ m
- * 进入实模式 *& \( d# I: ~8 Y; z" H6 X
- ******************/2 p [2 Z( U2 I2 \
- mov cr0, eax
+ b! t0 b0 h9 a4 d, D - jmp rMod
# R4 Y* r1 }( d - }$ I# z! T6 m1 w7 ]
- ( ?" ~* }" L5 m( X% T+ Z5 ~2 Y# X
- rMod: asm{
3 w- P, A" ~' v) ]0 T - /* ******************************************************************
. Z; B; Y2 N2 K% k - * 退出,fs、gs清0,访问系统内存可用: gs[32位,相对于0的偏移地址] *
7 @+ M7 J9 L' O6 u, M0 ~ - ********************************************************************/
/ z9 G# D0 O1 I; s) c2 e7 Z - mov ax, 0! T1 b' n$ @' Y/ r3 F8 u7 @1 b; k
- mov fs, ax
5 b! ?) G- n, I. H" H% e# G- N - mov gs, ax
. q1 U3 z; c& z1 t7 C, N - sti0 p0 O4 q7 R* x7 t5 {1 L+ N
- }
3 j/ \! x; C% i& h* ^+ ~: e- l - }
复制代码 这是asm的- ;/********************************************************************
, N% P) X+ ~3 I - ;* File: DOS4G.asm *
: a3 l5 R7 n7 X" g0 U; j7 ` - ;* Compile with masm ( Editor: Tab size = 4 ) *4 t2 a. C% d$ N
- ;* *
0 |, ^3 O. W y - ;* ========================Title=============================== *5 y( }2 ^- j4 v4 v
- ;* 这个demo是让系统进入DOS 4G模式,进行数据访问 *: u5 L I6 z4 ]$ K9 v/ L8 M2 Z
- ;* *
8 P% e+ ?8 f; t: Z8 P1 r - ;* ===========================History========================== *
( |1 Y" _6 ~0 h5 X2 R, \" B - ;* author: bini */ |# x$ \- B2 U
- ;* date: 2008-10-08 Frist version. *
8 p0 H/ `/ @6 ~% E - ;********************************************************************/
, }* s6 U# n2 |0 w/ T' y$ N - .model small
; K6 w7 x# S7 v! _) u - .586p
9 r2 [6 ^4 ]! _, \/ L -
' ?9 G* \2 U# g/ s* @& k" _ - DSEG SEGMENT USE16 ;16位数据段9 j/ w4 ?3 K4 a
- m1 \5 P8 X- a" w: p- DESC STRUC
% j6 Q% r4 ^. l! A) W7 Q9 r - LimitL DW 0 ;段界限(BIT0-15)
) O' {, o' }% [3 ^3 M' a p - BaseL DW 0 ;段基地址(BIT0-15)
; j$ ~, N( y- L+ ]2 a - BaseM DB 0 ;段基地址(BIT16-23)
4 r2 S. v$ q5 B& u- _* [: n - Attributes DB 0 ;段属性! [$ P# f. i- E2 _4 J6 ~& |
- LimitH DB 0 ;段界限(BIT16-19)(含段属性的高4位), _" Z) P# ], m
- BaseH DB 0 ;段基地址(BIT24-31)3 E& r3 u+ [9 T t
- DESC ENDS7 l8 o0 V) n. k) N# _# n
: I5 R+ m2 v3 O* A9 M- PDesc STRUC1 |: A+ I0 q. |$ S
- Limit DW 0 ;16位界限% ~0 n% s( m2 a4 P" C/ ^
- Base DD 0 ;32位基地址
' p0 p+ P {9 S2 { - PDesc ENDS u2 }1 E/ h! W# z3 D
9 q% `- Z6 a0 u; f8 B- GDT_def Label Fword
$ ^( ?: e+ c( A6 N' f+ h. ` - Null_Desc DESC < 0h, 0h, 00h, 00h, 000h, 0>
5 C$ \2 U5 W6 I; K7 A - Data_Desc DESC < 0FFFFh, 0h, 00h, 92h, 08Fh, 0>8 w, f u3 t2 K! M0 i
$ `" e0 K' @) _) w- GDT_Addr PDesc <$-GDT_def-1, >
- h) J! M! N2 i$ V- r, o - DSEG ENDS ;数据段定义结束
7 p {9 V- \( l" i6 _
8 I5 ]5 W5 W/ P! e$ p# f5 I; F- CSEG SEGMENT USE16 ;16位代码段- E+ E: Q4 i f- b) ^
- ASSUME CS:CSEG,DS:DSEG
5 x% q+ u- Y% \2 n# u; e& ? - .Startup- T, b' S# B$ Z) }$ T9 |) H4 M. V
- call Set4gb( N" j8 Z3 |* _( I2 P) l
- ;
. q) Q* N0 m% Q% b" F7 D - ; fs, gs即能访问4GB空间9 Q3 t3 T3 V' J; \ `; Y
- ; write your code in here.& ~8 }( S0 b+ n) o- _+ m( r: e
- ;
1 Z( X! z) @3 K: z1 } - .exit
( n' e* o r6 H' B( Y! P, P -
) ]. p% r2 \1 n3 n - Set4gb PROC NEAR
0 m1 x3 Y8 f$ F6 z! A1 a - in al, 92h0 w' h* a2 L/ N' q# I3 W# [
- or al, 002) u" h. a. W- ~, z; X4 G. g! M S
- out 092h, al) |. H, U6 H0 j/ ^9 C& e! p
- out 0edh, al
6 ^& x( ^8 k6 _: ^4 x - 7 n! o z2 j: p* j& E
- cli) `$ \6 ?4 W( \
- 6 {: X1 p& A7 m; d: K
- ; mov word ptr GDT_Addr, (2*8-1);
$ @/ E8 d6 G5 D& e! A* |: k7 u
J5 P6 Q* j$ O3 ?4 e& C- mov eax, ds! P4 t# G. z5 p z4 C3 P
- shl eax, 4
$ v b7 p& r- L; o( f" L5 c( \ - xor ebx, ebx$ N* W' E( h- V7 O& n) v
- mov bx, offset GDT_def( Q1 Y( ~5 m& {- Y1 s
- add eax, ebx+ f4 _9 Y- K- `! R
- mov dword ptr GDT_Addr.Base, eax
! n) E8 T0 e! \+ H' q9 U5 W - lgdt fword ptr GDT_Addr- T0 J3 t9 Q8 U& ~0 L9 S
- / ?/ O& Q5 q8 V" m. a
- mov bx, 8* o/ G2 \% L3 T F/ N, C
- mov eax, cr04 A' i% _. @5 m7 B, w) X' g, u
- or al, 1
3 o$ x' U/ p4 ^+ t6 U" x! j3 F* }) ] - mov cr0, eax- ]- T' T) {7 t7 s
- . \; {: G( j# D4 b, c! W1 w( K2 ^
- jmp pMod t& b, d' E# @6 x4 d
- pMod:0 G; m# @4 F# T, s. K
- 3 ^! {; D, ?9 A0 b
- mov fs, bx; f: m/ z, [5 ~4 h% j. t# c
- mov gs, bx1 `# q( l+ F) J& T, I! }
- and al, 0FEh
/ g: t3 H5 d6 Y: l0 `1 R - mov cr0, eax
# {. @) j# I$ i1 Y -
7 d2 e* q6 k* q% W" r0 R - jmp rMod& \, p1 N% C% w- D6 z4 W- X( ~
- rMod:4 I' J, q( |/ n9 s: z
; m' T# ]* W0 R2 |3 O5 N$ `- mov ax, 0
2 k, e3 y7 ]2 A1 _# K - mov fs, ax( m: ~, Q0 {/ _' v: U
- mov gs, ax+ w, r w: \( I
- 1 j( {; N7 w0 j! k/ V0 v, Q+ r b
- ; 在2M的位置测试写一下数据/ u; N3 u; X2 j0 V
- mov esi, 200000h# Y7 d/ p( o: N1 z
- mov dword ptr fs:[esi], 055aa55aah
$ O' c, j$ x: T - ; 用RU去看看200000h的位置是否是此数据....$ j3 X! I$ }% v, A8 y9 I* b R& O
( _, H& D$ S5 X* ]3 N- sti
! Z8 k" z8 W! ~4 ?) S2 j - ret
( v" ~; d3 k+ R# T - Set4gb ENDP
+ `/ Z) N2 O# E4 l. {: t+ V$ m - ) q9 Z1 E3 w' s! f7 G- J6 U% l ]
- CSEG ENDS ;代码段定义结束
, M+ v* h. O4 o$ @ \ - end
复制代码 |
|