|
|
刚学习的同学,有些还不会,我这里贴点C和asm的代码。只供参考。
" j* x* s. W: X( W8 d3 u9 `6 h% w; K2 x: E% f, w; ^' Z
这是C的- /********************************************************************
' S; {& J( X3 ?; `1 j# n" h Q - * File: DOS4G.H *
/ h) B; t6 A; i+ M - * Compile with BC 3.1 ( Editor: Tab size = 4 ) *
3 A9 c) n4 E; j. h/ i; a( T' J - * *6 d9 C, {' h& W5 \; `8 C
- * ========================Title=============================== *) Y' S. ~+ h: b- c- z. u
- * 这个函数是让系统进入DOS 4G模式 *
" l2 P2 y4 X- S# R - * 程序参考了:陈家琪《DOS实方式下直接访问4GB》 *
( ^5 Z6 I' t* y# d - * *
6 ? K# B0 h6 E6 G - * 使用: openA20(); set4gb(); *5 r [1 ?: G( L% d( t
- * *8 B# @+ s/ H- m) z& A* r
- * ===========================History========================== *- U0 q/ y' ]9 `, M- |. O
- * author: bini *
0 ~- k! J# _) J, U9 M - * date: 2004-11-30 Frist version. *- w |9 r* F8 U5 ~
- ********************************************************************/$ o3 M% t+ w# A/ K2 l- {. F
- ! p( M4 t4 b0 h& E0 e1 m
- #include <conio.h>
. _9 ]; P3 ~# e* c - #pragma inline
' \- l- b0 f8 \6 i' ^$ H+ Z
2 S8 V* E( X& g9 u- /***********************************************
8 B- R8 {- v! {1 p9 j1 [! s/ W - * 两个GDT,第一个为系统使用,不管,默认为0 *1 D, e2 j& ?" e( e) O6 j" p' T& F: l
- * 第二个为一个数据段,没有代码段。 *
( ^* W: S* U3 d0 o - ***********************************************/
6 [. q/ U; ?* F/ o/ G7 q& I - unsigned long GDT_def[ ]={0,0, /*系统使用*/
7 U4 X; _; f, |6 x$ v$ ^; l - 0x0000FFFF, /* hi16bit( 0~15 ) is base low=0,
: \( d" f* l- h/ I4 C% t8 P7 E - low16bit( 0~15 ) is limit low=0xFFFF % \; ^3 x2 v7 k8 F8 @
- */$ K; ?8 U9 h3 F, i. H
- 0x008F9200};/* 最低字节为 base( bit 16~23 )' b0 Z1 m R1 |/ t
- 最高字节为 base( bit 24~31 )
' [: c3 ^. F% M% f& t$ I6 V -
; S. s3 S! X0 f, X/ { - 属性Attrib = 0x8F92
* L9 Y6 l0 `- a; I" V: [7 X+ \' [8 Z - . b& w- O( e1 ^& _) K( D
- 属性位Hibyte低四位为
7 H8 I U. S, _7 A; V# s - Limit( 16~19 )=F
/ Z6 R0 T! f/ Q" ?9 g, Y' V$ r( z - 属性位Hibyte bit7 为粒度" y' {3 D8 c5 r* g7 ~! ]: }! u! d1 |
- (值1=4KB粒度)
/ B$ X2 z; [! Q, ?# t: ]+ A7 D' o - 8F & 0x80 = 1
3 b! ^# M- }9 ^' r3 d - 7 Y& j7 l9 e D0 C
- 属性位Lowbyte低四位为段类型,值=2 K7 H) H+ R6 l0 s% q# x+ s9 X7 G2 n7 V
- 表示为可读/写段
* F% R9 b0 ~8 n - 属性位Hibyte高四位=9,bit3=1表示:& I; C. _* \/ A0 Y! [
- 描述符对地址转换是有效的。
! j! E( H6 H) Y4 d - bit0=1表示为:9 b0 i6 |# X; J9 |& T% u6 _0 e
- 系统段描述符。而不是门描述符。
; i; S; ]0 V* B! @ -
9 l2 V. b/ ~ L m* \7 F+ D0 g2 z - */* ~: u0 ?8 x6 n3 ]0 V( x
- 1 H( C6 K& c: F* R# w: ]0 n5 M
- /****************************************4 I% M. J3 e' ]: a5 D0 Z
- * GDTR寄存器, 48bit=6bytes *& m8 {. P9 H' a; r0 F$ q3 @
- * +-------------------------------+ *
; S3 F! R/ e# h6 J# Q9 v5 h - * | 32bit基地址 |16bit界限| *2 ?; Y4 l9 o$ R
- * +-------------------------------+ *
o- g4 p; e" m# \# J: s - ****************************************/3 V$ \9 h4 x0 r
- unsigned char GDT_Addr[6]={0};# j4 M% o( C6 {, G: |6 u6 G
- 4 r2 n. N4 S' j5 @
- /****************: t! i" ~# ^9 I# T$ |: w; l
- * 打开A20门 *( v I! X$ {1 _1 Q4 `
- ****************/. _4 _. t# h" M5 H4 |" I: H
- void openA20(void)) a( v# N- e; r
- {2 U$ Z7 l" ?$ v% f1 D+ c$ ?
- asm{
" g) D5 x: I( h7 V - pusha$ G- F' i, ?- t+ l. V6 ]
- in al, 92H
& }1 H& ?( q1 c& K' d - or al, 0x02, D _6 f& r* N+ P
- out 0x92, al
3 ^9 ^, f- |- u$ l* ?6 F: Z$ \* W' Z - out 0xed, al
x- o, K0 O8 F, N' x7 s$ n* a4 p8 x - popa
% g% W7 ^' h: j9 ~ - }
) {) N4 U7 h, `4 v% Y& h% g4 ] - }8 F3 i# c7 f, E
! s5 i6 L' |5 a7 J* T0 w- /***********************************************/ L. }0 k: |8 T) ~2 Q: k& N# `
- * 函数功能:进入DOS4G *7 Y) s. n/ Z* t8 k9 a
- * ==================== *, u% ~, g* Z! f) @
- * *( h! u- [) ~* s( _ C/ j
- * GDT描述符界限计算方式:描述符个数*8-1 *( }( n; s- t: u/ }/ ^9 v) @
- * 如: *
, M% p5 _& B9 s$ s+ Z1 w2 y' x2 Q+ L# ? - * mov word ptr GDT_Addr[0], (2*8-1); *
3 L" w! u9 |& C: L4 ~ - * 表示为 2个GTD *1 z' s, p" O2 B5 c ?) r0 a& a
- * *
% `& B, S* D1 ~. _% N - * 选择子为所在描述符内的字节偏移。 * S9 o2 \9 q6 V/ N- ^) u
- * *( t- Y' Y0 A \9 a
- ***********************************************/8 V- ^- O& S) N0 U1 P; l
- void set4gb(void)6 [, d( G5 X6 u% m5 m
- {
% Z; V8 z X! | - asm{
' m9 j1 s0 H1 ?3 G9 q1 S5 ^ - cli8 G% [" y/ d) e- ~0 } @. E
- /****************************************
& \6 F6 G7 R9 U* f7 T- W - * GDTR寄存器 *5 `& e/ S1 V5 M; _2 q5 {0 u
- * +-------------------------------+ *4 d& f1 o& K) n3 q0 d
- * | 32bit基地址 |16bit界限| *
3 T% M6 E# B2 J+ d1 \1 r6 A% | - * +-------------------------------+ * t$ [! [6 J( O: e7 e
- *****************************************/
/ b- r- L1 ~1 M/ g, A - /*********************5 l! V* D2 `" |* d- F
- * 得出段界限 *0 G( K8 V# i' h$ X" M: Y- d
- *********************/
( v) ]9 \0 ^/ y$ g0 b- K - mov word ptr GDT_Addr[0], (2*8-1);# f7 l) |, U( H
- /********************************************
; ]4 [7 O1 n2 n/ [+ Z- h - * 计算GDT表的32位基地址,存入GDTR *& S4 k* v6 `; T- P& p0 J' O
- ********************************************/
% F- W! ^& O E" { - mov eax, ds" D5 P% p: @+ ^+ A% R0 D% B1 h
- shl eax, 4
1 a/ F( s/ Z9 O+ `+ Z+ v - xor ebx, ebx
, z6 h" Q6 m) ` - mov bx, offset GDT_def5 H1 X* Z3 v/ U' r8 E" v4 G& K
- add eax, ebx
5 y& Z6 b6 K5 g- g- i - mov dword ptr GDT_Addr[2], eax
( L1 I' l+ I" s# o - lgdt fword ptr GDT_Addr2 v3 z$ `# u) V- u9 [/ G6 {$ H
- /********************) ?5 _1 r. M9 C
- * 选择子偏移 *
% k/ K& i6 @( p, \; F) w) o - ********************/2 [8 e0 B; g, l0 ?3 }2 @
- mov bx, 8" I$ f' ]9 B$ ^8 T* M+ b( { E, k
- mov eax, cr0
c: T! N6 s. q: T$ ?! ` - or al, 19 }0 C5 n2 A/ }% {- k& m$ D0 H
- /**********************
( y6 n2 Y0 X. P) o - * 进入保护模式 *0 S3 z8 H% S6 v L5 R7 I
- **********************/
* I' g# `. y" t. _7 A- s5 G# T& | - mov cr0, eax+ q! [( x$ @* J1 _
- jmp pMod/ ]% _. I& B7 m" y1 `+ U
- }# }4 M! f- H. r5 A: n* E0 ?+ W
5 o% v, y1 g: I* |- pMod: asm{3 c. [* h g6 G* b& e; g+ i, Y
- /************************************************************& k! F0 }, c" G6 y" J" M
- * 让fs与gs加载选择子,使其能访问 0xFFFFF * 4K (4GB) 空间 *
, M' L; L* _( t5 ` - ************************************************************/2 u4 Z+ |+ w% o2 c* t
- mov fs, bx$ G+ o/ o4 z1 l i3 `
- mov gs, bx
2 |! P# D$ [, K# G3 G - and al, 0x0FE$ t+ i9 W' x' F. A8 x1 l5 {1 E
- /******************
* @+ R* y4 i% y1 L* r2 A1 Q* ~ - * 进入实模式 *
3 R; }/ a4 ~) V. D! R# h- T+ `2 X. p- S - ******************/$ f! M; R0 e( e6 A+ d b* k
- mov cr0, eax& J/ S2 f5 i7 M9 d
- jmp rMod0 l' x, x* u+ [3 M3 i
- }
; V" ]: E+ S2 Z" m4 l* N
, E" L/ g4 { u( g# @- rMod: asm{
. {4 l+ C$ s, y2 u2 j; Q& W - /* ******************************************************************
3 d: h1 p8 J$ i) V' ^ - * 退出,fs、gs清0,访问系统内存可用: gs[32位,相对于0的偏移地址] *
~: z D6 {# Z6 p - ********************************************************************/
+ |' v1 ~" B& w" c, \* D - mov ax, 0! U! a* t. y) G2 m6 v) R3 F
- mov fs, ax0 r' K& X! w: l5 i! A$ Y T
- mov gs, ax
4 |6 B& O4 B5 B - sti
! B! b0 Q" c% W# Z, n* ~ - }
- H$ n- |, ^& E2 J; V - }
复制代码 这是asm的- ;/********************************************************************" R9 V! |3 C1 K: y2 i
- ;* File: DOS4G.asm *
( ?- x% b+ ^( u, e) m5 s - ;* Compile with masm ( Editor: Tab size = 4 ) *
: X, B1 u+ e) I& Y' R - ;* *
; \+ U4 d& K( A - ;* ========================Title=============================== *
6 b' `4 l. l4 @3 P5 q6 y - ;* 这个demo是让系统进入DOS 4G模式,进行数据访问 *
. a+ v- d$ b1 E% }3 ~/ i - ;* *! I: {+ {0 H6 D- {; [
- ;* ===========================History========================== *# j8 b, M) f b" s( E0 h
- ;* author: bini *
( J) y1 W2 j1 I" I$ f - ;* date: 2008-10-08 Frist version. *
$ U) N& {2 s T* R) P* A' u - ;********************************************************************/ % L! L) d1 R+ V& {
- .model small
" a8 O0 [' n6 z+ F - .586p
5 d$ C3 O5 D9 A9 T, F* K1 ]8 d -
, y( ^4 t" }8 }7 o4 u% o. l1 a5 _ - DSEG SEGMENT USE16 ;16位数据段2 y1 x8 |9 {0 U4 h
" W- K. g7 f1 f$ a! _/ J6 u- DESC STRUC
) E+ N1 W/ V0 q! c5 V1 k - LimitL DW 0 ;段界限(BIT0-15)& S; T2 @( }8 T, a' Y4 a; p
- BaseL DW 0 ;段基地址(BIT0-15)4 o: T/ `: Z8 O. J1 L$ {+ [; ]
- BaseM DB 0 ;段基地址(BIT16-23)
) Z- \1 V( ^9 ?. S# T6 [ - Attributes DB 0 ;段属性
$ ` L9 N g+ p) B/ C C" M+ x7 _, i - LimitH DB 0 ;段界限(BIT16-19)(含段属性的高4位)/ t8 j( _6 i$ [& O/ |
- BaseH DB 0 ;段基地址(BIT24-31)# Z; X& B- I- [, c
- DESC ENDS
2 N+ j3 Q) h4 h - # \2 z! O Z; Q) T
- PDesc STRUC* k1 v0 d0 r3 [) Q
- Limit DW 0 ;16位界限
; ?4 ~) C. p" k' O4 G) ] - Base DD 0 ;32位基地址0 [0 u7 x" p1 M0 Y* x0 j
- PDesc ENDS
9 w% Q2 ^" W1 @+ l* u2 u+ x& h
4 z! G0 ^3 ~) O- GDT_def Label Fword) U% j; _, k; ]7 j1 o, u: B# Z8 [
- Null_Desc DESC < 0h, 0h, 00h, 00h, 000h, 0>
+ d& b H% M/ { O; x; d$ T% p) P% | - Data_Desc DESC < 0FFFFh, 0h, 00h, 92h, 08Fh, 0>
! l6 s# B& {) Y W. ^6 m- G4 v/ q$ z - 1 \1 b5 f# V* ^$ \
- GDT_Addr PDesc <$-GDT_def-1, >! B5 Z# M, y i4 _: [
- DSEG ENDS ;数据段定义结束
) R) n, L* R7 M5 Q+ S p - 4 n& \8 q# q/ p( ^4 Q) q ]
- CSEG SEGMENT USE16 ;16位代码段
, U# X4 Q& c) j3 h {! E3 d - ASSUME CS:CSEG,DS:DSEG" v! @& i$ L' n( l' Q" ^. H' |
- .Startup
5 X, p- ~7 F& V$ Z& y - call Set4gb
* Y7 \6 Z' e% I9 P1 [# ? u v1 J - ;
. i: t; q7 d& h7 E* a" M - ; fs, gs即能访问4GB空间4 u" l) F! r1 @, T7 Q
- ; write your code in here.
- y7 g- x w/ b - ;, I. Q' W- K# v$ ^, a
- .exit3 @4 V# b, l3 c6 H' A6 B
- & s- ^; B5 U( Z- `( s1 x! p
- Set4gb PROC NEAR$ g! N& f, d+ U# y9 R7 Q
- in al, 92h U9 }# K6 t* s: Q
- or al, 0026 \' o/ }6 ?% F4 J
- out 092h, al! U, ?2 ]: e7 H E. W
- out 0edh, al6 z1 y' H) Y5 \$ i+ _9 f; F
% X3 q' M8 f( r9 t6 ]8 m, |. w- cli+ \( i9 a" ]8 W+ S: L3 d6 ?
- + l- S" M5 r- P* k/ e
- ; mov word ptr GDT_Addr, (2*8-1);
- V2 g! B7 K* N7 D/ K H - 5 Z( v3 W! h6 U! u6 e, O; m# M
- mov eax, ds9 U% ]; `. t: [. V# f* S! ]
- shl eax, 4- @. I. y! ]1 j a; H# u
- xor ebx, ebx
' Y A8 P* i% Q* ?! x7 u% K - mov bx, offset GDT_def
; ~+ x5 H4 ]. u9 K- q S - add eax, ebx
; ^5 o! k+ O* R' E - mov dword ptr GDT_Addr.Base, eax
9 Z7 P" @0 Y0 [- `( i7 D - lgdt fword ptr GDT_Addr
) M* z$ B! K) T+ _+ ]! J
1 _7 P: r9 v1 t; T4 W% X8 B- mov bx, 8
q2 Y3 X% I$ I2 p8 `( m - mov eax, cr0 q/ i5 w! z( T* v. v8 n3 e
- or al, 1- _7 e# M( T* i4 ]0 P# p
- mov cr0, eax
0 ?9 t1 i+ o; G8 h - # c% D6 X+ c& j o8 N: X
- jmp pMod
: ^: T& B5 ]: l; V2 J* E/ _ - pMod:
D5 [4 Z i% P9 X - - j; E! Y$ g# T E! V. |
- mov fs, bx: {4 q: e7 v8 Z9 i& M# T6 x7 Z
- mov gs, bx
3 U/ a" _* H3 _2 `6 y5 [- L- ] - and al, 0FEh. p# }' l Y" f& T- ]
- mov cr0, eax
, @- s; m L2 ^8 L -
5 V A8 Q! a* s* f1 E - jmp rMod; }+ b) ?( o3 |* O6 S/ H6 _9 o8 T
- rMod:* Z% L! |* G" `, X7 d3 t9 }/ I0 k
- 6 p& f: S) ^0 e5 R7 @4 ?
- mov ax, 0
- \7 D- U0 q. H8 `% D: Y - mov fs, ax
2 G# q- t" y: p( r \3 h - mov gs, ax4 p c0 B/ S, ]/ H/ [- z9 q' x1 w6 P
-
% I6 f7 _) c, J% C0 S( { - ; 在2M的位置测试写一下数据
1 W/ P/ |8 {+ y$ h6 L! q* [ - mov esi, 200000h2 D0 C5 {0 J0 Z0 g, k
- mov dword ptr fs:[esi], 055aa55aah
7 p+ u, ?: M% d+ A8 V - ; 用RU去看看200000h的位置是否是此数据....
9 p9 p) `; l! |+ f3 l. x - 4 O, f* }6 P( q; z& l4 C2 T
- sti- C0 b# N& @" p' O& S7 f
- ret* A/ w" A! ^% t
- Set4gb ENDP
7 _$ }% R1 g+ Q& \$ B8 J, q - - n; j* d9 R% U) e9 E6 p
- CSEG ENDS ;代码段定义结束
N# d! ?% R8 c \ - end
复制代码 |
|