|
|
刚学习的同学,有些还不会,我这里贴点C和asm的代码。只供参考。
+ `' }" C, d. k6 f1 E! L+ P2 D1 G4 f% p
这是C的- /********************************************************************
M8 e; u7 o9 l2 t& r% n7 ?7 [ - * File: DOS4G.H *7 `1 p8 ^! a* C3 S
- * Compile with BC 3.1 ( Editor: Tab size = 4 ) *
/ M" [) T `4 U4 b - * *) E- Y, q8 P8 a" v5 B7 W4 y3 f; e
- * ========================Title=============================== *
# F: |9 f) u; N8 g/ f. i. W4 B - * 这个函数是让系统进入DOS 4G模式 *6 }& Z; y7 r* i5 c- h
- * 程序参考了:陈家琪《DOS实方式下直接访问4GB》 ** `; L$ A' S8 {" H/ ? D
- * *
8 K3 N% [0 r7 ` - * 使用: openA20(); set4gb(); *
+ _0 a1 k' J0 r" }) Q - * * G: B* \/ d5 C) n( D, v. T
- * ===========================History========================== *
& B3 {- s6 I4 q. g - * author: bini *
! L# j- @" h3 ^* ?! a# _ - * date: 2004-11-30 Frist version. *% ?+ o' `- J4 Q, k
- ********************************************************************/1 O+ b! d+ Q; T' P% A: S, a
- & E8 q7 _5 V+ @' E$ Q! ?+ ^* ]1 {
- #include <conio.h>
8 I* G" W2 `, k" z - #pragma inline
% T; O. j5 A* L4 _
" C$ s; A8 `- ]+ z* I7 c9 x- /***********************************************" S' L3 e+ |9 v$ l. ^! G z
- * 两个GDT,第一个为系统使用,不管,默认为0 *
- f; D& F7 |; S& \ - * 第二个为一个数据段,没有代码段。 *
; o; V" v. b; ^/ c - ***********************************************/
0 [' ^& V5 l/ N0 ^# r2 d - unsigned long GDT_def[ ]={0,0, /*系统使用*/
2 d$ G9 M- h! K+ C - 0x0000FFFF, /* hi16bit( 0~15 ) is base low=0,
8 v, A* E9 C1 }5 F; [ - low16bit( 0~15 ) is limit low=0xFFFF
% W+ i# {7 i9 a) {, B7 U4 r* i( }8 k - */
" ~2 H/ Z, u. Q* H/ G - 0x008F9200};/* 最低字节为 base( bit 16~23 )/ M1 x, l' j7 z0 W+ K& }
- 最高字节为 base( bit 24~31 )/ L+ j" \& _' r- P' l
- 1 J H2 F& F/ O& i# u( u$ v
- 属性Attrib = 0x8F92# s2 {/ x) e% h2 [- _$ S! J# p
- ( q4 H( x+ g7 W
- 属性位Hibyte低四位为 7 G8 Y" V' U8 B
- Limit( 16~19 )=F
* j2 T+ z4 ^9 Q) B9 W4 P# w% E - 属性位Hibyte bit7 为粒度
$ r( \" b, K$ q! I; h& b - (值1=4KB粒度)
; w' ~# _( u0 |6 |, E - 8F & 0x80 = 1: S. M9 O' l& }3 a& n
-
% ?# a- |3 N( {5 o+ H$ M - 属性位Lowbyte低四位为段类型,值=2
% i- R+ C; b% S0 [) f. b - 表示为可读/写段% S2 ^0 l! G* v9 y4 ` c/ V/ N) _0 Q1 p
- 属性位Hibyte高四位=9,bit3=1表示:5 [& H9 ^* M+ U+ j- q3 b! D! `# {* y
- 描述符对地址转换是有效的。
5 i! s- @* Q5 J) c2 f# q7 R5 D - bit0=1表示为:
: }! e, k- U m. K! J: }- ?6 P - 系统段描述符。而不是门描述符。: \) u W2 w, l& _
-
7 }/ I# `& b9 e7 E, V6 v: D+ p - */( ~: Y* W% Y/ U4 l
- 6 @8 o' {. ^* Y* N
- /****************************************
# e' u, b; A" v5 Z; x2 j. X - * GDTR寄存器, 48bit=6bytes *
+ E, O4 {( `# `' d2 o' S. N y# o - * +-------------------------------+ * f w& r% `# F5 O5 v5 H
- * | 32bit基地址 |16bit界限| *- d6 `5 t- @, {/ }
- * +-------------------------------+ *
/ K# i. p, H2 |! Q y - ****************************************/( s& d; m! ^7 r) o$ L" w6 P) q
- unsigned char GDT_Addr[6]={0};4 r: p5 d. A5 P" ?
- ) z" m# c' A7 {+ `$ f
- /****************
% ^. |8 L! }( K" w/ G$ p - * 打开A20门 *- m2 o# D. c; d- R" H
- ****************/; f7 ~) X) ~, D/ d& {
- void openA20(void)
6 o/ v: K- ^3 P: M1 A% X$ R3 s5 Q - {
. N( h# n. _( E& v - asm{5 Z! {* i$ E( K. Q/ {5 i+ Z/ A
- pusha
. H+ O+ l" a$ w) r1 O" d( B - in al, 92H- Z8 {* L7 Q ?
- or al, 0x02
4 O/ @: W2 W% M) j$ K$ A* b* Z& Z - out 0x92, al
U, j: O, l/ J+ u' E - out 0xed, al; n* T3 h0 {. V; ?- ?" X; j2 t
- popa/ {- a0 E G) ^& c
- }+ A4 s v5 u& Y# q. g1 N! V _
- }2 c3 @0 h: ?" F' a
: T+ b, r% `. ~9 ^- /***********************************************
% D& _! }$ H* b. F) N - * 函数功能:进入DOS4G *% `) Q% D. t7 T2 N
- * ==================== *% h" L: i4 h8 ?2 C: d* K7 _
- * *
) @0 S2 [( u. Y. R- N, Q - * GDT描述符界限计算方式:描述符个数*8-1 *
- W' I( b/ [5 f: z5 Q$ r" S - * 如: *7 z& c& z+ |4 X$ P3 x6 w5 j0 `, E
- * mov word ptr GDT_Addr[0], (2*8-1); *% n6 X% b4 \! O4 `$ s* J% K/ H
- * 表示为 2个GTD *8 ~& G7 d* e; k# w* m
- * *
4 K J- {9 a; h- m7 F p4 G; O - * 选择子为所在描述符内的字节偏移。 *+ O/ x! d& H, q* _' R
- * *
& [: B6 z$ x& t g2 K - ***********************************************/
/ B0 \8 e# i G - void set4gb(void)
+ V: Z K6 P$ s! s( P- m5 Z0 V - {
- V2 ]1 l% L$ t& N8 U - asm{' `# M' q3 u0 j" t
- cli* K: D( q6 @" L: L7 c* g
- /****************************************
# k- D$ \: w; k* B3 L1 s& I9 E - * GDTR寄存器 *$ k* ]7 G9 H) @( ?& l
- * +-------------------------------+ */ }; i, G( R8 H7 `8 G
- * | 32bit基地址 |16bit界限| *
! E/ Z( C N4 |! ]1 T - * +-------------------------------+ *
- S0 L" h; J) e7 r9 j1 Z4 p - *****************************************/) _$ r% `: i, b$ c& z
- /*********************
) R: z# O4 p* i - * 得出段界限 *, p3 C) Q$ r" R: g" Y- M) O& ~: B9 S! N
- *********************/0 @' o( P' _) D a0 S, _
- mov word ptr GDT_Addr[0], (2*8-1);/ M6 O3 _# Q) ?
- /******************************************** o3 q- R/ @5 ~# |7 M% A6 f
- * 计算GDT表的32位基地址,存入GDTR ** U6 y. |. \1 F! \+ ~: O8 U
- ********************************************/
: ~$ r# E; n# t) O! O! v - mov eax, ds
8 ]: u6 c7 y& s9 d: [! j. E+ ^6 ^ - shl eax, 40 g( ~( n4 i7 O
- xor ebx, ebx
+ m4 [; ? A! i w" h! ?: s - mov bx, offset GDT_def
# m& u: a$ j0 P1 T - add eax, ebx0 @$ n. V4 c7 ~ J$ C. j
- mov dword ptr GDT_Addr[2], eax
( u6 A/ ^0 e" I. R& \8 T+ c: y - lgdt fword ptr GDT_Addr- S# W! N q- n) ?! s
- /********************1 A9 S/ D- Z- }
- * 选择子偏移 *6 p% k7 z$ F' ?: M! Q2 _
- ********************/, n) L! w8 _7 a2 @, @
- mov bx, 89 o0 [% t* F; S$ m+ R6 N e/ g
- mov eax, cr0
6 V' e8 H1 A) G$ m( _7 _4 z - or al, 1
0 _0 f* a; h5 @) t* q4 T: I - /**********************7 |8 W# O0 R6 h% F& d& Y
- * 进入保护模式 *' K! Y* j" J3 f. t( r
- **********************/7 o3 Y2 S7 A% ~
- mov cr0, eax& j; m; a \2 X7 w/ m9 x
- jmp pMod l* @; J& J6 a9 g# g! Z
- }4 O2 J. T# j) i* D, |
- * }. \3 m; R+ |6 x# U
- pMod: asm{
0 ^6 R* r# M6 R/ f7 [/ |5 J2 h - /************************************************************8 [) t0 r, E5 ~) T- `/ H& F
- * 让fs与gs加载选择子,使其能访问 0xFFFFF * 4K (4GB) 空间 *: o" b7 }# _+ M: [6 e
- ************************************************************/
& l4 q' X1 `: \1 n6 i - mov fs, bx
+ l/ n T6 L) j5 E) ~: f; ~ - mov gs, bx6 Z5 D4 J$ l7 r) e; N7 I0 @4 E. o2 T
- and al, 0x0FE
8 Y2 p( k! Z5 e0 y0 u1 g0 p8 S8 l - /******************$ B2 H5 q$ M9 |" L% v
- * 进入实模式 *7 D3 L0 O3 X7 P5 b/ V
- ******************/
; t5 M3 J, k2 I6 v - mov cr0, eax
4 A9 j, j$ p' }& _9 R: l$ { - jmp rMod9 f4 c( w1 a3 o: T% }7 {4 X. C: [
- }1 s4 n8 H% F0 O; B, f
- % U$ X0 F# H+ z& W! |* r
- rMod: asm{
( |: R8 F6 e ~6 _0 p0 | - /* ******************************************************************$ G0 C2 V) I% z' |7 u; [: o
- * 退出,fs、gs清0,访问系统内存可用: gs[32位,相对于0的偏移地址] *
( h& Q$ d3 K: w+ x - ********************************************************************/
( _: L+ a* ^2 E0 U- q - mov ax, 06 z' F& b3 ]! N- b" B: o' A
- mov fs, ax
! t, u6 S& G: p; c& } - mov gs, ax
( ?1 j6 c+ z4 G$ K5 y2 N' f. l - sti
8 d8 C* G y7 [) ^, N5 f8 X0 m - }& Z+ {9 d7 O8 `: Z+ G5 H
- }
复制代码 这是asm的- ;/********************************************************************
: Q) Q1 t! T$ S2 u - ;* File: DOS4G.asm *' b, M' b g& r
- ;* Compile with masm ( Editor: Tab size = 4 ) *
! |7 g$ |+ T4 ^1 r1 Z" l - ;* *1 g/ c8 ~3 p; A
- ;* ========================Title=============================== *
6 j: {% k3 p( C" |. i - ;* 这个demo是让系统进入DOS 4G模式,进行数据访问 *
+ X0 ~3 W7 p* ?& [/ M# N D/ v - ;* *
+ D- _& ]5 v' T+ V- K$ l8 X - ;* ===========================History========================== *
* J* V6 l# I- M( s, p& m* B' p - ;* author: bini *% q( H+ Q; R; n9 T3 t! k! |
- ;* date: 2008-10-08 Frist version. *3 |! l+ R2 \/ {# E; T) ]# s
- ;********************************************************************/ 1 c- P$ ^3 d3 r' T' R# a
- .model small9 T1 X# F: V1 d: |$ Z* v
- .586p
- s" c; z% b7 S8 t - ! b+ U9 o& s' D
- DSEG SEGMENT USE16 ;16位数据段
|% Q' L4 Q' i' A9 m* w - ; X' l/ W, {: y; s6 u: [
- DESC STRUC. r8 W, R$ [9 @* O) n! s
- LimitL DW 0 ;段界限(BIT0-15)! V' N: h& c$ o
- BaseL DW 0 ;段基地址(BIT0-15)$ E9 c6 v2 W" ?. d4 O
- BaseM DB 0 ;段基地址(BIT16-23)$ q( \ l5 K1 [8 @# }6 R5 J2 u/ E! K8 E
- Attributes DB 0 ;段属性( v5 Q) r! X8 A$ W/ H! W
- LimitH DB 0 ;段界限(BIT16-19)(含段属性的高4位)
. \9 [6 z# y& K/ V7 j. b - BaseH DB 0 ;段基地址(BIT24-31): A6 Y1 ^0 b: E. G0 w4 U3 Z1 n+ r T2 N
- DESC ENDS
! J% x: I" T7 k! p0 } n! J( ^: ^ - . k6 V, d8 }' n: v8 }8 x l5 m
- PDesc STRUC
+ f8 t% F8 v3 k# O5 G I- b$ k - Limit DW 0 ;16位界限
0 q% P# w- M" \+ H! U& i - Base DD 0 ;32位基地址
9 w3 _5 |- k9 e; F2 [5 P - PDesc ENDS
) P2 f- {8 R; N# Q& }. e
* N h( o# z2 L) X+ j U% [- GDT_def Label Fword
% I2 F* o, g% ~% ~" e - Null_Desc DESC < 0h, 0h, 00h, 00h, 000h, 0>
1 c5 n9 K6 U2 y( o! |: F- B8 L) g - Data_Desc DESC < 0FFFFh, 0h, 00h, 92h, 08Fh, 0>
! s/ Y/ B' a1 G, e) \( y8 d - " P! r# \" k$ Q" O; D0 \ ^ ]
- GDT_Addr PDesc <$-GDT_def-1, >4 {( a" V% D; p- F
- DSEG ENDS ;数据段定义结束9 t7 K; e3 ?4 `. a, |" T) g% h
2 P5 y" x( N. \& N8 V7 h- CSEG SEGMENT USE16 ;16位代码段( V7 S; D6 I+ T0 @9 ?( F
- ASSUME CS:CSEG,DS:DSEG
0 N! ?. I. }4 s+ s1 w) L - .Startup
5 _3 P" [. p9 C/ A# M/ j m - call Set4gb, J, ?5 @' N6 [3 N8 S
- ;. f% _. s h& z1 s8 E$ T
- ; fs, gs即能访问4GB空间/ n% f: h- _$ }* `
- ; write your code in here.
( a2 R+ I5 A1 l+ Q3 H7 E - ;
2 s9 \. C) z w4 _- r9 |: y - .exit
: y) U* p9 \+ H2 U4 n# n -
6 r7 I6 R1 ?0 L - Set4gb PROC NEAR* X) Z' B: |6 T1 s7 p+ _
- in al, 92h
% }/ u0 O( W+ U/ n3 O - or al, 002
# r3 r' U! e- X- V8 Y! h - out 092h, al5 D ]0 W; G$ ]7 S1 O! o# K" V
- out 0edh, al. }" q) Y6 a1 L& a
$ k8 i" Q M" j: o0 [7 X- cli3 W! s% H, z( O
' @* v. t# g) D- ; mov word ptr GDT_Addr, (2*8-1);: F, k$ U4 M' p% u9 X N
( V% R+ g8 a- A/ a$ d1 x* \- mov eax, ds
1 P$ m- o( H' O' i - shl eax, 4
' D$ x- e1 I/ t7 y& f: [9 L - xor ebx, ebx H+ v, E& C1 G2 M/ f/ D
- mov bx, offset GDT_def% B# v+ s) ^* i4 B: W
- add eax, ebx
6 j+ A+ Y! G0 D: e+ h! ?/ Z - mov dword ptr GDT_Addr.Base, eax7 p3 [& \; v: d9 D6 W+ _& ~
- lgdt fword ptr GDT_Addr
* {+ ?! X: P8 V& D! F1 K% S5 e1 _ - 8 o6 C9 b. s& I, j. A
- mov bx, 8. v, `3 Q7 z: f5 r- x- I
- mov eax, cr04 T6 {! e3 a' a) M& A$ I9 ?; j- h
- or al, 1, U3 X* O, c) V$ j7 y1 g- Y
- mov cr0, eax
7 ^: k( O$ r/ D# }. ^# C
0 a6 A$ h7 `$ g5 Q% @- jmp pMod. t6 U( [0 @$ Y* I6 d
- pMod:; z7 f1 J( Q' h/ e5 N! Q
- 9 c* b+ _& ^4 f6 D6 [
- mov fs, bx
2 \7 Q8 l m4 O9 E. G4 } - mov gs, bx' J6 e9 e% y. F, }8 a/ q( v
- and al, 0FEh; o5 m7 O+ o% U9 q' {
- mov cr0, eax
D z7 O/ ?$ q) q -
- z' v9 D& k" X/ b) s - jmp rMod& f) p9 t. j! E5 Q5 v
- rMod:
; t J7 u+ X* D! q
! \- d3 @+ ^' `- Y$ O- mov ax, 0
$ d. H7 a! A6 K' s. K - mov fs, ax" Q- d( V5 t1 Y$ S2 C
- mov gs, ax; a4 U2 u* I1 g5 x
- , m1 e3 a# v& p) `% q$ H" s
- ; 在2M的位置测试写一下数据' ]+ Q2 O( M( Q9 }+ Z B' G, l
- mov esi, 200000h
* l: G/ A; b2 {6 e' ^/ q: T - mov dword ptr fs:[esi], 055aa55aah. r5 v, y5 B! z( t% f: ?
- ; 用RU去看看200000h的位置是否是此数据....
$ f$ ]5 P: N( j/ W
- a6 x1 M6 R# u% h- sti- ^( `. R7 k/ y7 \7 {2 }
- ret
( r; r1 T+ h7 i) j - Set4gb ENDP; `8 f: Q# Z, a6 x
- ! ]2 @8 b0 r+ p) O
- CSEG ENDS ;代码段定义结束
% g# t+ E$ A" O" B1 H. e1 n - end
复制代码 |
|