|
刚学习的同学,有些还不会,我这里贴点C和asm的代码。只供参考。
* g+ c D7 Z$ Z% _; A- U3 @/ `3 Z8 |0 F
这是C的- /********************************************************************6 s; H; t" o+ Y, ]. \0 l
- * File: DOS4G.H *+ T: g( z( Z+ w
- * Compile with BC 3.1 ( Editor: Tab size = 4 ) *
/ K; f: i. U. q9 l+ R - * *
: @: T* v3 @+ Z. _ U# _- ^ - * ========================Title=============================== *3 S6 W# f) @" B
- * 这个函数是让系统进入DOS 4G模式 *
4 m: ^% a; E8 B* N - * 程序参考了:陈家琪《DOS实方式下直接访问4GB》 *
9 R: P2 [# Q J) K - * *
, i+ o/ ^+ x) y) r O* Z - * 使用: openA20(); set4gb(); ** r& Q9 i7 k- c4 y
- * *
. x! c S) S7 G - * ===========================History========================== *
/ m" [* E- b0 Q - * author: bini *
* Z' t- m2 t3 z( ] - * date: 2004-11-30 Frist version. *+ ?$ v2 D$ q( D. l
- ********************************************************************/
/ x3 `7 k7 x3 c7 d+ L5 ]8 P" R
" N7 }8 k7 m/ b+ e! g- #include <conio.h>% p& H- ?8 M) J7 J5 `; S) S
- #pragma inline. i2 L, L8 X" o2 Z1 ^
9 P0 e8 ~# p% i7 x" [- /***********************************************, k$ q. R2 @3 c; |
- * 两个GDT,第一个为系统使用,不管,默认为0 *
3 `, B2 t0 x1 K& ` - * 第二个为一个数据段,没有代码段。 *% e* E6 q$ M, ~/ f' K9 G
- ***********************************************/4 v2 |3 S& h F+ \6 b u1 f
- unsigned long GDT_def[ ]={0,0, /*系统使用*/# j7 ?: j9 J; b, ?- V0 Y
- 0x0000FFFF, /* hi16bit( 0~15 ) is base low=0,
2 E6 @. q7 S* @8 _4 _ - low16bit( 0~15 ) is limit low=0xFFFF & t5 Q1 x5 L3 [
- */
- g6 l9 \- ~1 P# b - 0x008F9200};/* 最低字节为 base( bit 16~23 )$ a) @( H- t: j b$ C# ?9 x7 n# f
- 最高字节为 base( bit 24~31 )% c7 I' E, ~2 i2 ~
- 9 a, w6 q: Q8 D
- 属性Attrib = 0x8F92
& [6 g3 v! J3 K! V* Y -
; A% `+ Z# R |/ L - 属性位Hibyte低四位为 7 Z8 [8 O( D0 J' P1 ^( c6 p3 a
- Limit( 16~19 )=F
. n0 F" O U9 s; v' n* C - 属性位Hibyte bit7 为粒度) g# E. k V" X, d# u0 q+ j
- (值1=4KB粒度)
+ R* u/ S( O! l: d- J/ q+ } - 8F & 0x80 = 17 t( X" Z. s. g* P ^
- , b. g. L2 X) N- J6 p+ ]: z
- 属性位Lowbyte低四位为段类型,值=2( H; l) C6 x; A, B6 s3 `
- 表示为可读/写段7 P7 p% t, P1 z
- 属性位Hibyte高四位=9,bit3=1表示:
* h! t! D. o" W1 o0 e9 q. x8 B) F - 描述符对地址转换是有效的。7 g- y3 E4 Q( M" j. x8 i
- bit0=1表示为:
( D( y' T9 t4 B- o7 @2 d/ h - 系统段描述符。而不是门描述符。& C/ D, V( L! M/ Z
-
* K7 `$ |% B# H2 w% I - */' n/ k& [$ Q/ k: q
- - f& G( V4 ]' x% K; h) A
- /****************************************
) t! P- E$ M, D- B9 k% q3 ?0 x7 B, o2 ` - * GDTR寄存器, 48bit=6bytes *- [% a/ x- q+ C% F
- * +-------------------------------+ *
# {# R) _$ |: B. r - * | 32bit基地址 |16bit界限| *
( {3 z8 F. V* p) s7 Z( O4 _! o - * +-------------------------------+ *
2 o* W% ^1 W2 J1 e$ T - ****************************************/, |& \; }8 E0 l: Z
- unsigned char GDT_Addr[6]={0};" _* d/ }) ]% ~, y i2 ?
- ) B) A% u4 r" @- E0 |& e
- /****************
/ U" c. D3 D E% R) u6 D - * 打开A20门 ** P5 e6 \( m/ u I3 c" |
- ****************/
" O6 n4 ~# S! X - void openA20(void)
* a) K" Z% ~" X* G4 L - {4 V6 m# c! [- v9 ^; O2 U
- asm{- k. h2 h9 j! x4 s! Z
- pusha, y. o0 O: v3 r) {) E! P
- in al, 92H
: o$ F& h7 X0 K$ w - or al, 0x02
0 B: I/ N$ _% R6 |" H9 [# [% k' m. E - out 0x92, al
* @# l- Q) N8 x8 y4 i - out 0xed, al
0 v1 |5 N9 z/ d - popa4 b: ]7 Q# U5 M# L* c$ i' W# n
- }. b$ p# r" l2 b" Y3 y$ y. o
- }5 S$ I' J! k& k
: r) M9 i& y3 r# ^* V- /*********************************************** J+ a4 Z* Z% V$ s$ N
- * 函数功能:进入DOS4G *4 N6 t1 Q8 }" e+ q( m W# w
- * ==================== *
+ D1 ]( e! ]2 H- v& n! V# M" N - * *5 t4 C& A4 [- x- z+ Z5 Z
- * GDT描述符界限计算方式:描述符个数*8-1 *
/ `4 P9 h( p. `. b0 z - * 如: *; _, j B7 T% [ K$ ^
- * mov word ptr GDT_Addr[0], (2*8-1); *
/ H* J, E, [4 y. w* f - * 表示为 2个GTD * O- f; {: E2 B1 d1 D
- * */ v* q B+ q5 P% M# q
- * 选择子为所在描述符内的字节偏移。 *$ h- U( l: w" l& F0 {1 M
- * ** X/ K& v& ]# q# u
- ***********************************************/
$ O% y# U, n/ t& R/ j S- l! |. s - void set4gb(void)
; t. Z: \9 J5 K - {
& r/ p7 a/ {$ ?, x% J$ q5 a - asm{* h% A+ O$ P$ X. K
- cli
2 G" x h8 J/ u0 d6 r - /****************************************" E+ u h$ _3 K9 ~8 ?, o
- * GDTR寄存器 *+ t0 Z' Q+ a2 _# T0 O
- * +-------------------------------+ *
( n& y _; f, F/ F$ m3 E - * | 32bit基地址 |16bit界限| *
" A7 |/ F* \+ ]* b0 ?% I7 e* w+ B - * +-------------------------------+ *
. j6 Z" V5 a( b+ I- p - *****************************************/
! Y% L# j8 b" { - /*********************
# g: M# U. a) N+ v - * 得出段界限 *
9 A$ a+ `* p* V+ d' G8 W - *********************/
- A9 N2 k; t5 q" d! i, d - mov word ptr GDT_Addr[0], (2*8-1);4 ]; W/ G) c) { N( Y0 `% X
- /********************************************5 j2 X: p l X3 {5 Y# b& l/ P
- * 计算GDT表的32位基地址,存入GDTR *. W3 v4 ?4 x" q) A1 Y0 I/ z( V
- ********************************************/+ g* i* O+ i! h9 J! u% W! N- c
- mov eax, ds m. M& N9 [4 F2 E; j
- shl eax, 4
6 k/ ]# N. d' r5 a) b - xor ebx, ebx
7 L$ v# ~" i- V6 K; q0 S - mov bx, offset GDT_def
8 W1 _9 |/ d/ ?" E - add eax, ebx
@# Q1 m0 |( H - mov dword ptr GDT_Addr[2], eax, f: b- \/ u# M$ e, ]
- lgdt fword ptr GDT_Addr
' m i' n B1 P9 r: w8 A - /********************
3 a! K) i7 T$ o+ v0 u - * 选择子偏移 *
' I4 h& c; D! x3 I" C O - ********************/
; a8 ~% w& s5 v - mov bx, 8 ]4 x4 u6 J2 N
- mov eax, cr03 o, ]! Z6 V- @: S q
- or al, 1
1 k2 I' F: V7 P - /**********************/ f K1 R0 F% p/ a, W1 A% `' J
- * 进入保护模式 *
/ Z+ N: R4 S( D/ H. |- e3 \' Y. ^ r0 Z - **********************/8 S9 C0 f3 Z: W5 A
- mov cr0, eax
7 S1 \ E& n- M2 g/ y/ v - jmp pMod
?, c6 T1 B5 ?( {' h5 C - }
4 F& ~9 P! K. o- s- R( b, ?
. M! z$ B% D- _$ c4 E9 ]2 P- pMod: asm{
' Y# d5 j W' A" ^ - /************************************************************
. ]# P9 V" [6 d) ]$ r( } - * 让fs与gs加载选择子,使其能访问 0xFFFFF * 4K (4GB) 空间 *
7 K; C. n2 G6 }) M# i+ m% w' L$ X - ************************************************************/
9 i0 M8 _* u1 ~+ \2 t - mov fs, bx! w; R6 f( o6 `* e5 n4 R
- mov gs, bx7 j+ J. H4 x+ R$ i7 F! I) x% W- \
- and al, 0x0FE7 |( ]& \, X' v8 s$ U/ Y# v9 A& q
- /******************6 d- s6 G- g" c
- * 进入实模式 *
& a# o: |* P* { - ******************/
" q% V5 V% f' h7 u - mov cr0, eax
% N! k/ p- K) ]6 [8 T. ^. H - jmp rMod
. ^9 a' a% Q l& H0 _9 n' U - }, p) B' r8 R- x8 v" E' k
- # O( B. M0 R4 G) c5 Z P
- rMod: asm{0 u! H& y& ~, P! _! F& b
- /* ******************************************************************- A% j5 e/ B& c ^" ? m. U/ x4 B
- * 退出,fs、gs清0,访问系统内存可用: gs[32位,相对于0的偏移地址] *
/ f ^2 q$ u" r0 F$ x! E - ********************************************************************/, ?8 Q) I4 h6 M+ i: A
- mov ax, 0
5 S9 e7 e8 ]0 T; A( l4 @$ l# D - mov fs, ax
7 H& }7 x" C9 S# M# H) y - mov gs, ax
0 @) p0 I% R( D3 @6 O. W# _ a' I - sti
# D% @! ~% @" j8 y- q - }$ z I- z( ]2 ^1 q$ R( y
- }
复制代码 这是asm的- ;/********************************************************************
' [, m0 j3 e: J7 j. D ] - ;* File: DOS4G.asm * @9 B- ?' n6 W8 ?3 y# |+ X9 ~, n
- ;* Compile with masm ( Editor: Tab size = 4 ) *
- N4 ]4 w8 g1 I! } - ;* *6 Y& ?7 g6 F+ g- d% B
- ;* ========================Title=============================== *4 j& q9 P/ g5 D8 b1 p
- ;* 这个demo是让系统进入DOS 4G模式,进行数据访问 *
' S& h0 x3 X: @8 O, f8 e! R - ;* *( K/ M$ A4 V. @7 z
- ;* ===========================History========================== *
5 U: b# y) q0 r" \ - ;* author: bini *9 V9 h" i ~3 F
- ;* date: 2008-10-08 Frist version. *1 E4 X, X; H- M2 i6 ^/ I% |7 \1 f
- ;********************************************************************/
/ }" B% f5 A0 [$ ?1 G' e7 W, X - .model small
; @. ~. N0 T2 R8 B. x7 X( i) | - .586p5 v0 T/ u0 N% j5 G/ @ x r6 ^
-
: m, K. r1 p" S4 n; b - DSEG SEGMENT USE16 ;16位数据段
( j; P9 ?& s% x
. o+ T& [1 J( R3 U! }2 `' c- DESC STRUC% I- \+ w% x6 o, u5 m
- LimitL DW 0 ;段界限(BIT0-15)
; f* k& D: j; M i. O! ] - BaseL DW 0 ;段基地址(BIT0-15)
/ E) v/ q! M$ m - BaseM DB 0 ;段基地址(BIT16-23)" `) o0 s9 Z; Z' `
- Attributes DB 0 ;段属性8 Z! f; \1 L5 M, R& |% {; d7 I
- LimitH DB 0 ;段界限(BIT16-19)(含段属性的高4位)
; Q S4 o& L/ F# g - BaseH DB 0 ;段基地址(BIT24-31)
$ Q5 v/ Q, o5 k5 v9 D - DESC ENDS
6 n$ N0 v! i" B: j$ |& `
8 H9 L* E4 C% l v- PDesc STRUC' m. G$ Y8 \4 q# s4 w
- Limit DW 0 ;16位界限5 t, d Q5 r# E. X' w, G
- Base DD 0 ;32位基地址
! W% A ]3 A( ~5 _; _$ V! g8 x5 e - PDesc ENDS" N8 D( k; |$ X( g
7 v4 q9 R z$ g1 w0 n3 w# X- GDT_def Label Fword8 p- O5 M$ _) z/ s+ k
- Null_Desc DESC < 0h, 0h, 00h, 00h, 000h, 0>' B/ Z q6 l: K; b, A# s( f1 j* q
- Data_Desc DESC < 0FFFFh, 0h, 00h, 92h, 08Fh, 0>
& U9 \# w, R: o" I# h7 v
+ a+ \3 q4 B! f- GDT_Addr PDesc <$-GDT_def-1, >
; K: a: h* m, p1 ?: b T - DSEG ENDS ;数据段定义结束
" L) U' [" e; X, v! Q& ?( } - 2 F0 j n2 c3 A& U# }
- CSEG SEGMENT USE16 ;16位代码段
' {& n ~+ t1 N# J; T' X, i - ASSUME CS:CSEG,DS:DSEG
; @! a! K' ?4 I9 o. w+ \& @7 _6 o - .Startup$ b/ a3 X* l) c' w; p
- call Set4gb9 f- }- ^( ]9 e6 w8 Q0 g* w
- ;
2 i S( i, I, T0 }+ b; E( U - ; fs, gs即能访问4GB空间3 a3 R) Q& x" R2 V F
- ; write your code in here.* {' o$ Y+ |" F4 {; N, r2 J! F
- ;
8 v1 s3 {. @! G3 A- S' e - .exit
- O1 N9 X2 K/ [ - ~0 ~0 B. T4 k3 e' T$ c
- Set4gb PROC NEAR. A" F6 r: Z* f, z% t6 k
- in al, 92h
; J$ o4 ~1 t8 } - or al, 002/ s O5 `+ x+ f" M" Z5 w9 P' W
- out 092h, al
5 L& u* ^1 [, A9 w - out 0edh, al* B; |# W7 v: m
- 7 f! e% d, p% ?. e
- cli
* u( j9 d, h% t1 D+ r
# l: { E( @' m2 [- ; mov word ptr GDT_Addr, (2*8-1);: G. O, g# [: }* P- t
- " Y3 c1 o A$ A* n6 C
- mov eax, ds* x# W2 Z H$ M |
- shl eax, 4" N! z1 D" X H& G7 O+ E# l, M! b
- xor ebx, ebx* x# Z' x% ]& | k$ m. k
- mov bx, offset GDT_def I$ d& U2 y" M# d. @
- add eax, ebx
) p; q$ W, [2 t) i) ? - mov dword ptr GDT_Addr.Base, eax2 A7 |' s+ H* w4 n0 d5 e
- lgdt fword ptr GDT_Addr
# E: q+ r, t8 Z1 H7 A
& o9 x9 U# X& b. G8 {6 p6 B1 W( N7 j- mov bx, 83 X% g1 c8 D( t! z5 n8 P0 i
- mov eax, cr0
8 e8 A, E1 X/ [- Z2 N* U - or al, 1 u2 b% c- P" L# \2 n* F7 \
- mov cr0, eax
( x/ f, K* u) ]6 Q- E
) u! a" F+ I9 c# ~- jmp pMod2 }6 y& z# K( i+ w8 F' X$ u' c
- pMod:
- m, e7 f" k8 E5 { f' O
U& J2 n/ Y+ L% W6 m- mov fs, bx
D' Z( l& N) M- C3 b( _ - mov gs, bx( b" T' h }& U. J4 y
- and al, 0FEh. n* o- a C4 u! m; Z
- mov cr0, eax$ P1 s( A1 g8 z6 s' W
- 4 O5 o7 v5 u# O4 l, L
- jmp rMod
( s- [8 T8 { `6 N0 e - rMod:
* a p/ l! z. e1 V! J' `! r - & [* S1 |, ~6 T" \4 S
- mov ax, 0
- q5 b% _' v# L4 b. T4 z$ N - mov fs, ax
+ N9 q3 e d* l- _6 a2 P/ C2 ` - mov gs, ax
c5 l6 f; l" H# C" {! w -
; x4 v3 G \: B0 W4 G - ; 在2M的位置测试写一下数据, e% K+ j0 {5 ]7 b& H
- mov esi, 200000h9 {' i3 ^. w- E
- mov dword ptr fs:[esi], 055aa55aah
V; t. y. M4 S# C' H: Y - ; 用RU去看看200000h的位置是否是此数据...." \2 r" |- X0 e6 ]- p
- ( }; E3 u* ]% U
- sti
0 e) t ^0 J; J* d, x - ret% i8 m$ V x7 O" X+ m% d
- Set4gb ENDP% W0 v+ y' l& w! P5 I7 t
- / [0 Q# V5 @0 D1 L$ ~4 d0 H7 q( ]
- CSEG ENDS ;代码段定义结束6 z; C3 R' q5 Y, `' Z* Y
- end
复制代码 |
|