|
刚学习的同学,有些还不会,我这里贴点C和asm的代码。只供参考。) [, r; E! A; p! n2 b/ e
4 W3 y& X$ m" F1 v, Z v& M, T
这是C的- /********************************************************************
7 x8 x! z6 ?, `. a - * File: DOS4G.H *
2 A, l1 s2 G0 y5 k6 u/ @# O ` d( ]) p& Y) V - * Compile with BC 3.1 ( Editor: Tab size = 4 ) *1 U; k7 o$ d1 O1 H- ]0 J
- * *
! K! A% q/ ~+ S) u7 a2 M0 n - * ========================Title=============================== *
5 k% F0 F e" t6 [ g6 j: z - * 这个函数是让系统进入DOS 4G模式 *3 ?: v9 y/ `& d
- * 程序参考了:陈家琪《DOS实方式下直接访问4GB》 *$ H) Q% v1 l, c
- * *4 A+ } D4 Y1 t
- * 使用: openA20(); set4gb(); *
- l( f4 e, P( w- K) X9 O4 U: P! x/ F3 N - * *
1 d. X1 D1 ? W - * ===========================History========================== *1 x" ]9 h/ ]' l$ h0 u( Z
- * author: bini *
7 D, @& Z& U5 S7 a% B+ ]2 N! b - * date: 2004-11-30 Frist version. *1 `. D3 D, v6 X( X8 A
- ********************************************************************/& `4 ^& F3 }% t
- # |- y# C: C, O7 N" l( H$ a y/ s5 }
- #include <conio.h>0 d& B- [$ y- H% F9 D5 I
- #pragma inline3 m! N* f2 Y6 q
1 ~( e4 q1 g4 G- d$ r! B- /***********************************************0 k e! F7 d* P
- * 两个GDT,第一个为系统使用,不管,默认为0 *
' l; H( L. W2 i - * 第二个为一个数据段,没有代码段。 ** m, N+ \3 l% N
- ***********************************************/
: e" P% U, }3 U- N$ t! V3 ~ - unsigned long GDT_def[ ]={0,0, /*系统使用*/' k, h- @# {- [1 S( n
- 0x0000FFFF, /* hi16bit( 0~15 ) is base low=0, $ `% B- _0 y5 c& V0 H- M7 h( U( T
- low16bit( 0~15 ) is limit low=0xFFFF $ Z' F6 {7 V" k2 m' b9 N' \" G' s
- */
% R" S8 T( _: g2 F& q - 0x008F9200};/* 最低字节为 base( bit 16~23 )
' ?4 _( X( T0 f - 最高字节为 base( bit 24~31 )7 B ^2 r+ R* e& s4 ]% k# E8 ]
- % O7 e, n/ c x( r, F' t* U( k' I" x5 o$ R
- 属性Attrib = 0x8F92
; f7 b! J$ l/ ]* e! m# R- ~ - & i+ M, [' K0 w6 O
- 属性位Hibyte低四位为 ' o9 h/ V* e* g
- Limit( 16~19 )=F
, F+ K# g7 ?4 L8 R2 Y1 T2 \& } - 属性位Hibyte bit7 为粒度5 y) i% P7 {6 i
- (值1=4KB粒度)
6 _: \) Q1 N* X1 H) \1 p' y9 j - 8F & 0x80 = 1% [: o/ J, k) @. r
- ) p! k% T. h( w0 r# h. a, u
- 属性位Lowbyte低四位为段类型,值=2& S( `2 Q! X1 s. n g
- 表示为可读/写段
; ~, f% g" ]; e6 E- q2 F {7 { - 属性位Hibyte高四位=9,bit3=1表示:
: X$ u6 B2 H, R1 J- _9 @/ Q - 描述符对地址转换是有效的。
9 `2 s* K. S! _$ @ - bit0=1表示为:
; g6 w; f) j. y, m - 系统段描述符。而不是门描述符。2 k% m; e1 x. r' K# M
- 7 K- t6 b9 J4 G: T
- */
1 C* v4 e0 d) E/ A+ ~* b% g) e( U - 6 q/ L0 D `3 T1 _. \9 b+ R% Z" L
- /****************************************0 M+ A; Z, U8 D! [ S
- * GDTR寄存器, 48bit=6bytes *2 Z! V9 \' k% w6 Q
- * +-------------------------------+ *2 O8 Y, b- H: ^' I5 O) A5 d
- * | 32bit基地址 |16bit界限| *5 G% A7 j# w4 n M, s. i
- * +-------------------------------+ ** K; k+ w* I. T8 u
- ****************************************/
7 K5 l$ `" p( f( x6 {' T - unsigned char GDT_Addr[6]={0};
7 `. d( v( T4 Z/ v- g - 1 ^2 J! I9 Y. r* }7 S# m
- /****************
f. ~, a. C5 L4 Z' j+ D - * 打开A20门 *6 c$ o+ ]+ z7 X6 m, E. l
- ****************/& U, ^1 k+ L* B7 C1 _
- void openA20(void)+ ]6 q' T) O" e3 [, j1 Z
- {
# K% D1 U5 p( w. M - asm{5 M2 c+ V. g1 p2 E- ` Y/ p# E
- pusha! [. E* O8 H0 ~6 J/ n( p
- in al, 92H' s5 Z% y% e) {6 b% l2 f/ E4 V
- or al, 0x02. ]" v, ~/ V7 g: q3 ~5 ^
- out 0x92, al9 n3 G# u* y" u) C+ g
- out 0xed, al
! E, J9 K, Y% c9 x - popa! H# E$ j- k0 q: [ `
- }
; L# }* |5 ?. D1 \- T: E - }' l: Q! {; l8 \2 l6 n. B
- . h* C( [3 X+ ~( e+ U+ j1 Y. t
- /***********************************************
4 J( U3 X% l0 X3 G9 R - * 函数功能:进入DOS4G *
8 y, `+ N3 h& v$ V% } L+ f, ?, R - * ==================== *
" L1 w( [ u; v! k - * *% n: Y% H$ L6 E1 c
- * GDT描述符界限计算方式:描述符个数*8-1 *
; k% f" \5 F: ? - * 如: *7 q+ V }7 S u: ^ X" a8 X3 _ ~
- * mov word ptr GDT_Addr[0], (2*8-1); *
7 K8 q* Q/ ^+ [5 N6 T - * 表示为 2个GTD *
7 x# u& G% j) l' Z- z; v - * *
9 X. Q" h& M" S) |) z - * 选择子为所在描述符内的字节偏移。 *1 r2 K( n& Y# C. I& Z
- * *) v) z( f3 D9 l# Q8 ^4 k" I+ Y% M
- ***********************************************/( J5 d1 b& Y7 J. F0 u+ r. e
- void set4gb(void)
: a9 @3 B3 h- B/ [/ \; o2 k - {
9 D" L& ]1 T5 T/ a& B' h( W. t - asm{
" l# O4 ?$ Z4 q$ N8 D) M& J9 B+ p3 L - cli/ [% R% {% J$ u
- /****************************************, C+ {0 }4 ~5 \8 \' H4 ~" j
- * GDTR寄存器 *
: A- H; w, [6 |1 s/ ] - * +-------------------------------+ *
1 p/ S& [; l1 Z0 h( ] - * | 32bit基地址 |16bit界限| *
7 q7 Q5 ~& e8 @ - * +-------------------------------+ */ F8 V' I9 C! L3 n
- *****************************************/* ~" n; G8 x0 t* ^, D
- /*********************
l; h) _1 y/ ~2 F+ M - * 得出段界限 *
, {% h6 \7 P3 m& o( a4 I! N - *********************/. f, @: ]/ d1 X; I; |
- mov word ptr GDT_Addr[0], (2*8-1);3 H% H. {! F1 ~% a& x1 V
- /********************************************
4 u u6 k6 H/ K" F r - * 计算GDT表的32位基地址,存入GDTR ** t4 H4 B+ b, u+ g$ V
- ********************************************/ r. `. ?3 q* U, \# P, y
- mov eax, ds
7 L5 }: i- W: O2 { - shl eax, 43 w3 t, [, J; i: }
- xor ebx, ebx
& ]1 s: D7 Q6 j4 K - mov bx, offset GDT_def
' r1 [7 A) x0 n. l5 s$ Q- i - add eax, ebx6 e5 N1 U- y) P# b q) `
- mov dword ptr GDT_Addr[2], eax
4 w% _/ ~7 @+ p - lgdt fword ptr GDT_Addr2 ^1 I( W5 C5 t# H0 N6 h+ u1 t8 I0 e
- /********************
0 l% ~' R j2 _+ h8 _/ h& B - * 选择子偏移 *
, G/ S6 ]; r: U* n# w - ********************/
5 y1 W0 Z% J2 N) x- s0 k, [ - mov bx, 8! Q- Z6 D& h8 x, S" h4 C0 {/ Z
- mov eax, cr00 m: L5 O+ A. f5 y
- or al, 1 m( u4 K: U5 ]+ ^' G
- /**********************
. n& H! @$ w9 D: v - * 进入保护模式 *
" h& j- j" t9 ] - **********************/
* w4 _+ v( x3 x - mov cr0, eax
- ^9 m* w: k" S3 E T- | - jmp pMod' g; ~# T. |2 D7 p) q- n- S: }4 N# }+ a
- }
( w E) t' q6 d6 A+ |6 S - , {& C' Y) } f# I' E# N
- pMod: asm{
: Y; y1 e: Y6 d ?) b" Z - /************************************************************* u+ E6 ^* B( X! I/ X1 v' f7 e
- * 让fs与gs加载选择子,使其能访问 0xFFFFF * 4K (4GB) 空间 *
% a! r3 D g$ S5 a. m - ************************************************************/
" u3 V8 l; ]! j+ j* u& J$ c; ~! O - mov fs, bx. ~- G I! V) o# {) U" b& R2 w
- mov gs, bx
, `& _2 J- g/ U - and al, 0x0FE) Y! K2 p" }' o7 z1 P
- /******************
; I& T+ E" g0 F8 t! k* x& i" ` - * 进入实模式 *# @! N5 H) p7 [% ]) G; ~
- ******************/
9 O* F0 ]. Z8 Z" \5 y/ w) }! G - mov cr0, eax& P1 \/ h5 p! h0 j* P# S) r
- jmp rMod
' a: I' S0 Q3 A' E - }
2 [8 U: Z7 \3 K. o! Y - $ ^ F( J6 I+ H! H! _" d9 E# S
- rMod: asm{5 R* G9 K% P. X2 n- m
- /* ******************************************************************
* x8 Q% N1 o% F" r* M - * 退出,fs、gs清0,访问系统内存可用: gs[32位,相对于0的偏移地址] *6 f# ^9 [7 I5 m3 [5 P
- ********************************************************************/, e! x& I) z7 u4 V8 @/ B
- mov ax, 0- }. o/ [) x9 r! D9 j# R
- mov fs, ax
8 f8 ? o3 @5 J2 N - mov gs, ax/ k; Q) F8 m7 o! j7 j
- sti
' j( m8 U" I2 H* k: G9 J1 N5 o4 i3 R - }
$ E# O/ F$ e. W' O - }
复制代码 这是asm的- ;/********************************************************************7 ]2 k; c4 J) I" f& c6 g4 G
- ;* File: DOS4G.asm *
9 m A5 T9 f7 P; W0 n" @5 t5 z, ?9 e1 F - ;* Compile with masm ( Editor: Tab size = 4 ) *
! b4 W c0 Y$ `( A( l- r! q - ;* *
; D& [% @. ~5 f# {4 g3 }, e$ F - ;* ========================Title=============================== *0 ^9 e1 a6 X4 A: J7 I1 l
- ;* 这个demo是让系统进入DOS 4G模式,进行数据访问 *
2 P- h8 i9 ]) y: n; _4 c- x - ;* *8 |5 t! l f8 o7 A, l
- ;* ===========================History========================== */ c7 u3 f+ D* K8 `/ G/ [
- ;* author: bini *
3 Y0 K3 E! a1 o/ h1 d9 N& r4 P - ;* date: 2008-10-08 Frist version. *
/ p6 ^/ p0 i! t% j* b# V" ? - ;********************************************************************/ 6 y. t+ U2 b: [ j9 Z6 F( R, P' y# {
- .model small$ f( d1 R$ z' K1 w# M
- .586p
* {0 b% S% @/ x4 w( a - 3 N) O) ]% [( s3 a* Y$ U \
- DSEG SEGMENT USE16 ;16位数据段5 e6 {% M0 K) S% O$ A9 l
2 {( l* H, h' J/ S0 K- DESC STRUC2 V% V" {0 C) u1 I! q6 [
- LimitL DW 0 ;段界限(BIT0-15)
4 g+ _3 j- U' e2 X5 |* U; D4 G - BaseL DW 0 ;段基地址(BIT0-15)
8 @% s) a5 ~+ j! n2 C$ R - BaseM DB 0 ;段基地址(BIT16-23): L$ x! {* k9 V' h5 [6 w
- Attributes DB 0 ;段属性
/ K0 e! u1 y$ y8 y7 r - LimitH DB 0 ;段界限(BIT16-19)(含段属性的高4位)
4 s3 P5 U' u' x0 ~, j - BaseH DB 0 ;段基地址(BIT24-31)$ C# Y& a2 ?9 Y, Y+ ~9 S
- DESC ENDS8 K0 x T" v0 t
5 F/ P/ G4 ? n/ H/ r! R, t X- PDesc STRUC2 _; w$ p5 ^( x6 m. @# z6 R. E
- Limit DW 0 ;16位界限( ?& j. j; }) y" s8 D- H* Y/ \" w) U
- Base DD 0 ;32位基地址$ l" f2 h- K2 a6 @( B
- PDesc ENDS! `7 L( T: @( A5 T( g7 x
- & u- H2 U8 L- I, @, W& a, ]
- GDT_def Label Fword' e9 l8 ^* _3 I% L' _, i- q6 O
- Null_Desc DESC < 0h, 0h, 00h, 00h, 000h, 0>
3 ]' i4 z- C1 V# s3 d, K - Data_Desc DESC < 0FFFFh, 0h, 00h, 92h, 08Fh, 0>4 y7 ]3 ]/ B3 q( r8 {
- $ W/ F4 G9 q% ]/ l" h. r/ _
- GDT_Addr PDesc <$-GDT_def-1, >
/ H1 R; v* F7 E" Q - DSEG ENDS ;数据段定义结束
+ U( T }) E t- A* g! }+ X1 K; e - 6 u0 C; k1 v' C2 _, r
- CSEG SEGMENT USE16 ;16位代码段
/ } i9 z4 g' o4 p- h, y - ASSUME CS:CSEG,DS:DSEG3 [2 W7 j9 m9 {: Q' k3 B! I" _
- .Startup
% V0 P3 @1 p- d - call Set4gb
* L- U1 n$ N! K+ m - ;
$ G3 T" a2 I$ x! e W9 v- q3 C3 k& z - ; fs, gs即能访问4GB空间
6 E4 Q* m" q& o# Y - ; write your code in here.
4 A2 [+ G, w2 e8 ?2 E% h2 K, u - ;6 E6 e6 l3 B" o% M2 g R- `% r
- .exit
3 R% c2 x9 T$ n# U2 Y% \ -
P% ]% d; G' k% W! A; K7 | - Set4gb PROC NEAR
- m% E+ C% q3 A6 e1 @$ B4 G* ~/ E0 X - in al, 92h
( v. C+ h7 F* g - or al, 002# `) ^, b, s' ^' p& j# A6 d. `0 Q; V
- out 092h, al+ |% j3 |( D1 s1 g* T( ~$ o, T
- out 0edh, al
9 W$ L7 I- A3 C- ], d
! v6 \, C, Y) q- cli
6 u. ]. [' Q& L
% y& k1 u6 \3 H7 P2 p6 A- ; mov word ptr GDT_Addr, (2*8-1);: {0 a! s+ |9 ?' t' D; g+ S, ]/ J) b, Q
8 Q4 _- K$ c$ i n- @; L: T6 Z* \- mov eax, ds
- ^7 j5 k# j7 k) l% o1 } - shl eax, 4* _( M5 q$ f/ x' D) j) E* z
- xor ebx, ebx
- H" }. i4 Q% P- b# e - mov bx, offset GDT_def. {! Y0 X& O& p x- R
- add eax, ebx$ a! r) z! G% \" j& I" G. A
- mov dword ptr GDT_Addr.Base, eax
g9 {8 m( b, a F5 t# [% s - lgdt fword ptr GDT_Addr
* k# I1 L0 k7 G4 e
2 |4 z K6 ~/ C2 A$ o- mov bx, 8
, W. N, E! I3 ~$ w - mov eax, cr0
& p9 A0 ~1 A+ a% U - or al, 1
1 L9 f* ^& @8 l! S L4 ]1 U% L - mov cr0, eax/ i! O7 G' Z1 M0 G5 J8 H! X5 l
6 h- L+ B# x) u( t- jmp pMod
5 _( U0 P7 e) n$ y' R( i4 V - pMod:5 T5 k& T- a: a0 P+ | d& Q- x
- ( u9 W/ g, j& E
- mov fs, bx7 C! c1 ?/ a/ G3 l- ~3 G
- mov gs, bx- h% d8 H5 C* h* |* ] \
- and al, 0FEh
( V6 U% x% e! w) V: Z. D. z: ? - mov cr0, eax7 e' W, N ?. h" f' L
- 1 w2 P( ]5 ^5 M$ Y. S
- jmp rMod! t, ~' T+ S2 _" k$ B, d( X# y
- rMod:
# i# [5 K9 @% K, W - 8 \1 v6 Y( b0 L
- mov ax, 0
7 c2 \ f$ d4 o# x \; ` - mov fs, ax
! N' i- L; M2 L6 k: ` - mov gs, ax+ s4 z$ S$ Z# J1 i
-
# |+ `/ r+ }; w% k+ E - ; 在2M的位置测试写一下数据
% K2 l3 O7 r& G" M - mov esi, 200000h9 l* p7 \9 R% D+ L+ c
- mov dword ptr fs:[esi], 055aa55aah
( W* ^2 Q0 K9 o: F; C% u! b9 R - ; 用RU去看看200000h的位置是否是此数据....
( r5 f: S1 t. a
; O t/ x8 a, A8 Q! e/ u- sti* ]* K! `- b# {# ^$ A, m9 {5 N. P9 |
- ret
% {4 B) |8 u: D6 o7 B* t7 A - Set4gb ENDP; ]/ `; H. d5 t" F$ X, G% x' w, g
- - i3 }* F& J" d5 B
- CSEG ENDS ;代码段定义结束
/ e5 f7 \/ O2 \8 p - end
复制代码 |
|