|
|
刚学习的同学,有些还不会,我这里贴点C和asm的代码。只供参考。7 V: P9 }1 H' s
4 V; W+ v& J: a* I
这是C的- /********************************************************************
' m; c# D+ x* B! [8 Y - * File: DOS4G.H *
+ \- }3 e- G% T - * Compile with BC 3.1 ( Editor: Tab size = 4 ) *
* y9 c6 |% C1 |5 T4 ~# M - * *! r) L( g0 V2 [0 q$ ?/ }. Y+ C
- * ========================Title=============================== *% d k |! P. O' h6 t7 n
- * 这个函数是让系统进入DOS 4G模式 *; Y# `) l5 [# @4 ^
- * 程序参考了:陈家琪《DOS实方式下直接访问4GB》 *& L9 c$ q/ D# F
- * *1 `5 G# H1 t r4 P& y
- * 使用: openA20(); set4gb(); *
9 R1 a8 T- c# Q; S: i9 @4 P1 B, k+ S - * *
/ E; i( @- Q( c" K7 A - * ===========================History========================== *( M5 T3 Y! R1 F E7 {+ z5 A
- * author: bini *. T1 O4 y/ ~: p: N! M# G. T
- * date: 2004-11-30 Frist version. *
. H: r+ H, a: p# }. O: @5 B8 F8 ` - ********************************************************************/% o9 M# u f6 [! a
' F" v0 }, V) u. P3 ^- #include <conio.h>7 W- X; n) h: x9 {
- #pragma inline; V: s% P- t( \4 I
9 O; ~3 J: E" j y) O- /***********************************************/ M6 b6 n5 X% o
- * 两个GDT,第一个为系统使用,不管,默认为0 */ y" I1 G6 @/ F
- * 第二个为一个数据段,没有代码段。 *2 F) F. Y0 t& m) e# Q
- ***********************************************// e* Q/ x& b3 c7 U5 u$ _
- unsigned long GDT_def[ ]={0,0, /*系统使用*/- ?7 N6 Q6 l$ ?6 P
- 0x0000FFFF, /* hi16bit( 0~15 ) is base low=0,
$ L5 x, c- X) V* | - low16bit( 0~15 ) is limit low=0xFFFF
" e& v6 e0 U( v - */; ^" Z, P# q% q5 f& W0 ^
- 0x008F9200};/* 最低字节为 base( bit 16~23 )2 H% ]' J3 j6 g
- 最高字节为 base( bit 24~31 )
4 Z7 n" w3 X% ~' A- b- q; D8 G -
/ O$ B; v4 [" w6 y1 D$ s; W0 b - 属性Attrib = 0x8F920 G% g; I( x, I5 D( ^$ f
- 8 V [9 B8 S$ [" f5 h
- 属性位Hibyte低四位为 ; X5 S- K1 g* l3 z( e
- Limit( 16~19 )=F- k8 ?6 f+ ~2 b+ z d# y: p
- 属性位Hibyte bit7 为粒度1 g' k9 p" `0 m
- (值1=4KB粒度)6 I0 J5 k9 N* m6 @; m8 S4 ^
- 8F & 0x80 = 1
3 e& v& J$ y8 s: a- J% J# i, o# T - % l* l* z' H8 R g' |6 n, A" f( [* `
- 属性位Lowbyte低四位为段类型,值=2& p1 y6 z. @0 y1 V
- 表示为可读/写段
% y. P+ j) t0 [0 O& I* N' L - 属性位Hibyte高四位=9,bit3=1表示:
) E. o9 O! g, k: f; g$ B$ ?/ Q: Q2 v - 描述符对地址转换是有效的。
% R( @: {1 Y; R- `- m - bit0=1表示为:+ E8 M' `! H& c% c# Q+ ~
- 系统段描述符。而不是门描述符。
; F" z% g+ u8 x n3 q1 I - - c# |6 ~0 E; c+ P( c
- */+ Y0 e# `: e' l: w: f! Z
- ( F: [/ R7 j3 U/ k
- /****************************************# V! E7 Q, z t+ t! g2 g3 p+ u5 P
- * GDTR寄存器, 48bit=6bytes *
) A8 ~( G/ b- A- r4 i% ^+ U - * +-------------------------------+ *3 j, H) Y& O& z% W5 D1 Y& S
- * | 32bit基地址 |16bit界限| *
: T: S l- N6 u) N( R* R6 C - * +-------------------------------+ *9 i) E ]! G7 S0 k! Z/ Q8 u
- ****************************************/
7 V) x5 d& v/ P - unsigned char GDT_Addr[6]={0};
, g& ^7 k' v+ {& J! T) q5 q. g - / K+ T" H/ u0 _ {5 ]
- /****************
7 `* F' x2 s* ]9 Q8 p7 U - * 打开A20门 *
! u' e, w+ A4 ~: U0 w) t3 z3 ~ - ****************/$ {- I7 F' X$ C7 B1 e) z0 q
- void openA20(void), m: Y i6 e0 H; B2 \
- {
7 U$ ?! P& q9 z4 ^9 ] - asm{
+ g+ I$ [( m5 c# P - pusha+ x" M% l0 i k2 r7 _+ O4 G( N
- in al, 92H
/ e, o: U' c4 w* V* o - or al, 0x027 l* I+ n2 ~8 b1 m. C3 q
- out 0x92, al
- a4 v! ^: F: \+ e- T) `# | - out 0xed, al" Q$ z/ `+ K4 {1 e
- popa% D4 x) S$ _8 a: R% ^( W# N' g
- }
/ f' _, U6 X7 V1 a3 H: D9 v' R: a - }
# ~8 k" j, w& R5 X! s - 6 X, v. t% {# M7 R& T9 Y
- /***********************************************( B& G8 O! X; m: _
- * 函数功能:进入DOS4G *
% {! r7 Q5 t" Y; A+ o4 c4 }& d - * ==================== *5 ~+ T8 Y( L" c0 H
- * *: d- x: i: ^2 ?3 }# S
- * GDT描述符界限计算方式:描述符个数*8-1 *" Y }* q8 n; y( M$ H* t. V. a# e
- * 如: *
6 Y6 Z8 @) v J/ ~ - * mov word ptr GDT_Addr[0], (2*8-1); *
4 V" E9 d& q( {; u" }/ Z - * 表示为 2个GTD *) m$ {6 k& h( f* Y! R
- * *
. ?8 A) |' u: l0 s3 x, ?4 R - * 选择子为所在描述符内的字节偏移。 *! K. w5 q& b! N7 a, X
- * *
: X4 v4 M9 }/ S& X: ^7 A* }" I" s - ***********************************************/
1 `3 \3 E6 U" q+ S - void set4gb(void) f7 U1 T* n; u, d. H
- {
5 l8 {: R4 |* h. s" b9 O. `2 J - asm{* q C+ [3 j) r) R b- t
- cli& H$ H# @) z7 n8 U% l; O
- /****************************************' ~" j! |5 ^8 F Y2 z w+ j
- * GDTR寄存器 *
$ l' ?, v; _5 V' k1 y9 \ - * +-------------------------------+ *& }8 }" y& Y4 \* q# B% m
- * | 32bit基地址 |16bit界限| *
) [- D3 O6 p& x, Y - * +-------------------------------+ *
1 R( F+ w4 d5 Q' Z' r% w$ Q - *****************************************/
' O9 A/ X+ `+ P# ^8 d7 O& u. P - /********************* h- P+ W0 T9 L5 ?; y0 s
- * 得出段界限 *
( P3 t* A4 t, y: m9 ]: }+ U+ ~ - *********************// J6 e+ m8 x3 a% e4 q- \6 t
- mov word ptr GDT_Addr[0], (2*8-1);0 I% v, E/ X8 W1 k6 C# d' k
- /********************************************
0 |! x0 ]# ?( i" z8 Q - * 计算GDT表的32位基地址,存入GDTR *
3 Q4 h1 A6 h; s& U( d6 O - ********************************************// r; L: F v- Q5 e1 {9 S
- mov eax, ds
- H+ F# T9 J% k5 G- o# k - shl eax, 4( ~- n7 W2 L$ o( K
- xor ebx, ebx( H1 R* C" \6 a' b' }
- mov bx, offset GDT_def% v6 ]5 g' {+ Q5 Y8 g
- add eax, ebx* u5 z# L' `, J$ u8 K2 @! [& A% s1 Y
- mov dword ptr GDT_Addr[2], eax9 Y" x( i- e: Y$ Q# y
- lgdt fword ptr GDT_Addr% f" {1 z5 n' N
- /********************. i' }% ^9 n6 I4 V. y
- * 选择子偏移 *
4 }4 h, V. r, F - ********************/, y- q# r' v4 e
- mov bx, 83 x% c/ U- R/ V0 ^
- mov eax, cr0
4 A( V! B/ k9 \/ ~1 p$ `+ u$ F) E - or al, 1
& @9 ?% p; G* O8 x - /**********************
A+ Q4 Y; J9 P$ ?# Q7 p - * 进入保护模式 *9 C8 ^8 O/ d' @7 c
- **********************/6 z' ?! F' ^" O% e, n' I8 q
- mov cr0, eax$ ]# }- ^* t, l: P0 L
- jmp pMod0 A4 t( l4 k4 Y6 v
- }. ^! p4 n$ x& s' |# y! }$ F
& q. B# C4 C' ^6 Z) ?- pMod: asm{
" ^5 \1 b3 S( {) W! P4 } - /************************************************************+ ~4 w3 D9 x `- u8 ?( ?
- * 让fs与gs加载选择子,使其能访问 0xFFFFF * 4K (4GB) 空间 *1 I- V( x. L4 ~# d+ i' A
- ************************************************************/# m$ B9 F" h" ^' ]1 w- A% o
- mov fs, bx, A9 d5 E: J6 a8 U! c! R
- mov gs, bx1 x; {0 u Y* H/ w
- and al, 0x0FE7 o+ t# u) W3 N- m3 W" S; W
- /******************2 L" \* `9 f' A3 C
- * 进入实模式 *# j" v! m6 G+ _" k0 w" D( D1 V
- ******************/7 @# |" G' f- s9 Z; J
- mov cr0, eax! j" I0 g- l4 _$ {& V
- jmp rMod7 D3 \$ u) i4 \ r5 ~ w
- }# ~3 m, f5 N& l; \6 u2 W3 P. z# u
- 7 |, i* U0 ~' r
- rMod: asm{
% j5 e5 G3 j( Z - /* ******************************************************************
& y+ ?9 C; |" |, o8 m3 Y2 u& v' K - * 退出,fs、gs清0,访问系统内存可用: gs[32位,相对于0的偏移地址] *
* z" x+ S, r6 G! E - ********************************************************************/: |, R. O* T- d0 W
- mov ax, 0
, b" B' w/ o0 N- t0 ?0 w! v - mov fs, ax. O% t9 H" ]% r: k$ e
- mov gs, ax# w3 G9 v: D) P0 J' y8 v6 D
- sti& Z4 U. n& i7 I* r
- }
: u( n( v) ?) | - }
复制代码 这是asm的- ;/********************************************************************1 ]5 ~1 V" D0 ~
- ;* File: DOS4G.asm *" w4 B: D% [! u' b; K6 }2 ]% u
- ;* Compile with masm ( Editor: Tab size = 4 ) *( ~: x" T: b& q) J. Q/ T, [# `& `
- ;* *5 p) C& r) v7 @) {4 Z
- ;* ========================Title=============================== *
1 m( E! n0 D" n) ?9 }" T4 r - ;* 这个demo是让系统进入DOS 4G模式,进行数据访问 *
; i N- [7 ~- B( q, } - ;* *6 y" W& y0 T" Z/ x# i- K5 x8 r& v
- ;* ===========================History========================== *
% r: l/ N6 f: ~8 e1 s$ J. r - ;* author: bini *
- p4 j1 }7 l# Q6 D8 H! f - ;* date: 2008-10-08 Frist version. *
' q% z- R5 \( z# x - ;********************************************************************/ . u. r* t/ y. E8 R5 k' I5 y0 g
- .model small @, p5 M1 }9 Y
- .586p+ ?% L! G! M) p6 s5 q+ t
-
- d. E) J5 C8 @1 Z- u2 p* K/ D$ K7 { - DSEG SEGMENT USE16 ;16位数据段' ^! J% x& D1 [
, _- f5 J _# |0 o- J7 D. c- DESC STRUC
9 e1 T7 x) D( q* V8 y5 i) w9 C - LimitL DW 0 ;段界限(BIT0-15)9 n. h3 g4 C( w3 ?" J8 Q
- BaseL DW 0 ;段基地址(BIT0-15)* }; k+ v3 g" y/ K: v4 [; l
- BaseM DB 0 ;段基地址(BIT16-23)
* ~. ^* V1 K7 b9 X0 S - Attributes DB 0 ;段属性
6 }, N8 v0 V$ }7 ` - LimitH DB 0 ;段界限(BIT16-19)(含段属性的高4位)
8 o; @) Z. h7 F - BaseH DB 0 ;段基地址(BIT24-31)
5 x! Z' J, V; N8 @ - DESC ENDS
3 M" L$ r$ F3 ?( M. q - n' P8 q( [" X$ N: f2 V1 {) b
- PDesc STRUC
8 b4 \% G& }! G4 M - Limit DW 0 ;16位界限 d" K3 P7 s& N9 ^
- Base DD 0 ;32位基地址
# b) e& X; H4 X G# A3 g8 N - PDesc ENDS
& x! w- `, }/ u. b2 ]" p - 0 Z' T% e! @2 i
- GDT_def Label Fword! [& {% v8 |8 I: Q8 W
- Null_Desc DESC < 0h, 0h, 00h, 00h, 000h, 0>8 T2 a7 l# C- Z& K2 l* k1 R$ A3 B
- Data_Desc DESC < 0FFFFh, 0h, 00h, 92h, 08Fh, 0>& E1 m' B, ~1 m. t7 W
- ) o2 h" \8 v/ d7 G. L7 z
- GDT_Addr PDesc <$-GDT_def-1, >
; D7 _3 ?* k$ H/ w! p9 o c - DSEG ENDS ;数据段定义结束
% g4 l5 e( Y# L N
& V; W9 _+ U) f% v W: l2 Z7 d, L- CSEG SEGMENT USE16 ;16位代码段1 x% v* E: Z6 f/ d A+ q( x0 s
- ASSUME CS:CSEG,DS:DSEG' F ^, o- T% C. t
- .Startup
' N& c4 |$ r, Y6 `3 Q( v2 @ - call Set4gb/ F- G' f; H# J' _' @7 p+ b
- ;: q) _+ K& Z: C5 f7 z% v# N' d
- ; fs, gs即能访问4GB空间0 M' N$ C+ Y- }+ q) j E
- ; write your code in here.
5 F- O$ Y( P( U4 ]- A0 D) r+ D - ;6 w- x4 O1 I3 z' I( W5 X8 d6 p
- .exit
# j% i2 B# x0 V; G+ [. \ - # [7 D5 x5 x% S3 E9 J
- Set4gb PROC NEAR# a. U4 @# a2 ?) H# g# p! b" B
- in al, 92h
? E" P, _! S5 H' O - or al, 0025 u! O, @: ~ S5 r& U
- out 092h, al1 M2 _6 m4 I" i' T2 C' x
- out 0edh, al! i, r! @: A" i7 G4 S% D# C
- 3 e' G) O2 r$ b* L( W# c
- cli: Y9 y8 u/ L5 u o
- 6 R# U9 D5 g3 v8 x% H. p
- ; mov word ptr GDT_Addr, (2*8-1);5 m. p2 X6 t7 f9 z) Z
- ) u3 c3 ~0 _7 z2 b' a
- mov eax, ds
2 ]8 j- u$ n! Y/ v2 k" R" i, S0 Z - shl eax, 4- E1 Q( M4 A& z! k. y
- xor ebx, ebx
2 z2 w `+ f ?! e - mov bx, offset GDT_def6 L% O* }8 s: J2 n" V0 l
- add eax, ebx
, Y% ]" n* d, l4 ~4 h/ {' k" E* Q! j6 X - mov dword ptr GDT_Addr.Base, eax
& ?0 o$ T) T$ s - lgdt fword ptr GDT_Addr
2 }, X7 }6 C# s9 \, V( K - + Q- a% w8 B; M+ ?
- mov bx, 86 S, j' ^" g+ \. c& \7 m
- mov eax, cr09 @9 P; |9 T" F0 b% P" I4 ~- V
- or al, 1; B! o$ v+ X$ i, q Q, g4 W" F
- mov cr0, eax3 x0 ~5 E. [+ n. E: {) C
: ~3 ]! G8 \! P+ P- jmp pMod& T. t* l) y' O. O: X
- pMod:" P6 @* m! ^# d" k# f- E3 B% X
/ f E, k% _$ J1 T- mov fs, bx
5 @" B6 k9 U7 q5 U - mov gs, bx
- D/ a k9 r7 X+ u: N - and al, 0FEh, k5 T' |% ]( L
- mov cr0, eax
2 W9 y; ?3 b( N; A; c -
2 m: ]& v) y$ h# k6 m9 ? - jmp rMod3 R, N! X$ f1 Q, T7 @
- rMod:
% Z+ e/ d* l1 ?' ^
( c1 W2 V) z# k, c5 ~/ P7 d2 y- mov ax, 05 o' R- k. M7 h# Q3 p2 e, B: v7 O
- mov fs, ax
" P( {4 T( k1 k1 _6 E) V# [ - mov gs, ax
% L% [% L6 u% @2 ] -
5 U% e$ W3 R# m/ c! q# @ - ; 在2M的位置测试写一下数据
0 J% x2 T% l* V/ k - mov esi, 200000h: B! I7 ~6 [- X9 }, j3 l+ W" ~+ o
- mov dword ptr fs:[esi], 055aa55aah9 [! W+ D; D9 H, I+ q
- ; 用RU去看看200000h的位置是否是此数据....
' t9 M. `9 H# x0 m4 k6 n9 Y - # s: D6 B- O2 T" K$ n4 f' _; k/ I/ y
- sti8 P9 J! ~" `/ a) y& e# z9 z: x
- ret: Z* J z0 f2 E6 o; R+ z
- Set4gb ENDP; r( V1 s% d: [ a2 ~
-
/ \4 g& x4 a2 _2 R - CSEG ENDS ;代码段定义结束& m) C0 X9 }2 t. G2 Y- Q E5 a
- end
复制代码 |
|