|
刚学习的同学,有些还不会,我这里贴点C和asm的代码。只供参考。$ P& N! l! t O! r4 K h& n
9 n& U8 n+ j& e! z4 K/ E
这是C的- /********************************************************************
+ W2 c2 h* T/ O0 A - * File: DOS4G.H *7 R2 D4 n; k s+ U
- * Compile with BC 3.1 ( Editor: Tab size = 4 ) *) S B e" u. q& i
- * * n3 |; s( _0 B0 P6 F& \
- * ========================Title=============================== *
! `6 e# E- o ?* |/ R - * 这个函数是让系统进入DOS 4G模式 *" A! P3 L+ V- N: k: ~
- * 程序参考了:陈家琪《DOS实方式下直接访问4GB》 *
& C; N, l" B! b% O - * *+ b# z8 A* I2 k( F W2 q
- * 使用: openA20(); set4gb(); *- D+ z! X M+ b7 i4 n3 u
- * *% e d, a" d+ r5 b% X6 f
- * ===========================History========================== *
1 u% B# U+ [& { - * author: bini *, O6 b8 {9 _' s) j8 y' F
- * date: 2004-11-30 Frist version. *
& h1 \+ O, D" p$ A' s' ]( F+ Q - ********************************************************************/
, h j; ]) m$ s1 \$ ^7 H$ A( Z* v
% l- w9 I& K# v; Q* m- #include <conio.h>
6 } a' s) D( _: j - #pragma inline4 s: A0 F7 [9 Q1 ?6 y! r0 v
0 h; x9 |: V1 y9 q g- /***********************************************) ^. j) O- D# K4 L. n
- * 两个GDT,第一个为系统使用,不管,默认为0 *3 Z# ?6 w5 {+ I7 y, Y
- * 第二个为一个数据段,没有代码段。 *8 r# ^1 H5 B! N9 }& ?
- ***********************************************/. I! \) e: i4 y9 e% ]2 {( k1 e
- unsigned long GDT_def[ ]={0,0, /*系统使用*/' [+ J( |$ M6 Y8 v& E
- 0x0000FFFF, /* hi16bit( 0~15 ) is base low=0, - h: v& y' m( |6 l+ s
- low16bit( 0~15 ) is limit low=0xFFFF
3 Z0 T! @/ D" c2 a - *// k* u: Z4 E+ y9 [# `9 j
- 0x008F9200};/* 最低字节为 base( bit 16~23 ), |& D# b& C k: d9 w
- 最高字节为 base( bit 24~31 )
( _1 p) i7 j( L -
, h, w) f1 g/ s! x* U8 i6 @ - 属性Attrib = 0x8F92
3 h, W0 x4 ~3 T+ |: h - 6 Q* A! @( T# F% w5 B! Y
- 属性位Hibyte低四位为 $ M* d d! u/ \3 U# l' M& [
- Limit( 16~19 )=F+ s! d' P7 C( o7 ]0 O: z/ {' F
- 属性位Hibyte bit7 为粒度
- U G5 n- Q* b, \; r: [) h - (值1=4KB粒度)
! g7 }2 y) S* _. G( O6 t - 8F & 0x80 = 1/ o: ~( _( y9 d+ d$ M
-
7 ~) u$ _! p0 e) \8 c+ ~5 i# Y1 O3 @9 g - 属性位Lowbyte低四位为段类型,值=2
) f+ |: ~. B- W+ J( p% u - 表示为可读/写段
1 r" y, Y* h a# k. @, x - 属性位Hibyte高四位=9,bit3=1表示:$ I e5 \# c" s+ P4 c! z
- 描述符对地址转换是有效的。- B* X) V& R% G6 ~ J% _2 N" ?& y# d
- bit0=1表示为:8 R* d5 K, F5 I
- 系统段描述符。而不是门描述符。- k# M! n) V* a+ D2 A3 i& E! H
-
" M5 }5 V" R m, z# L - */
C+ R! M3 t4 E. l1 h, v; r) T
/ a; h% }) w8 w- ~5 w8 n- /****************************************& l: B4 k( q& `/ L
- * GDTR寄存器, 48bit=6bytes *
8 ]# ]3 {" P; ]% B8 q( g. _ - * +-------------------------------+ *
, ~0 y/ X s; O a - * | 32bit基地址 |16bit界限| *" ]5 w% L* l7 k# W) w. O
- * +-------------------------------+ *
3 F' I. Q% j& _2 R& @- L" T& D& e - ****************************************/, O# T- ^( P0 s( y5 B& O8 g8 l
- unsigned char GDT_Addr[6]={0};
' m5 d2 O( N" q9 l - 5 N, i1 _3 d" A+ {2 A% {6 \. p* P
- /****************
+ [, K) ~( y) l( |7 W) l6 v - * 打开A20门 *
- i) @( }1 w* u6 T4 i. h - ****************/
+ L/ a0 a# x6 W7 t0 M - void openA20(void)
/ T( _/ {& v2 q2 J3 b1 P - {. s8 y3 V! C' \2 d; L+ [
- asm{
- A2 H2 w+ [# P ]9 f - pusha H3 D1 v, l/ Q, C
- in al, 92H9 j# f) @+ d3 V* `0 P' a
- or al, 0x02
' [; q( r4 j# l* Z, g9 q - out 0x92, al
$ V/ F8 e1 ]& Z8 k- `, ~ - out 0xed, al# W( V* a: X0 T& C; k" b' e7 X
- popa
3 t3 Q5 {1 _5 g! v& y - }- I4 D( b" k8 l+ m9 U4 o. e
- }/ J7 q s0 C: \; f+ v+ M
- & m6 H7 j( H. O. E1 w' S- U6 f4 y y
- /***********************************************( R3 p; H; J$ b# q- O! M' O! O2 A5 ^
- * 函数功能:进入DOS4G *3 z$ T. H: L; C! A
- * ==================== * s7 h, r4 d+ F- y5 f, U6 n
- * *
, F' e' m8 \; r. C) u - * GDT描述符界限计算方式:描述符个数*8-1 *8 p7 J6 ? f' W* Y
- * 如: *& I% g! Q1 x5 `# M% m
- * mov word ptr GDT_Addr[0], (2*8-1); *
5 F0 o: X6 E5 ~* I6 q1 n - * 表示为 2个GTD *) g, z2 q [5 g
- * *
+ t$ s, g" ~2 f/ c% D7 { - * 选择子为所在描述符内的字节偏移。 *- K' Y# _6 D! C) P! p; r5 f: v
- * *5 _% A% F5 B% |9 b. @
- ***********************************************/. G$ L/ [# m q/ Z5 O {
- void set4gb(void)
) J4 t2 _; q1 e/ K1 ^ - {
2 B: K, w/ I: V - asm{; p$ T1 y& c( ~, D! p% H
- cli2 m! Z% q) u4 h v
- /****************************************
0 S5 ?% h4 e) T' V% w - * GDTR寄存器 *7 h% O; H. f- d6 c8 S
- * +-------------------------------+ *
: F0 ^" x) h `6 w0 W4 E3 j# Z: o# m, } - * | 32bit基地址 |16bit界限| *
$ g2 T! E3 _% ?) t; G" q( ~ - * +-------------------------------+ *
! H: q; F1 l: ?. l* l, P - *****************************************/+ r0 s# G' g' z
- /*********************
9 M5 p5 t9 a- ?% Q5 B3 N - * 得出段界限 *
, i- M. ^6 K a, |7 B) j - *********************/
9 D+ f6 |* y" P7 B - mov word ptr GDT_Addr[0], (2*8-1);$ a' {. U9 y& P' f7 Y& g0 _
- /********************************************
, r- P8 [9 V9 E0 C - * 计算GDT表的32位基地址,存入GDTR *
" b/ U) K) ] [& W8 J - ********************************************/
% [2 t0 g1 `: X* d! M( V, Z - mov eax, ds
5 U- q# E0 E4 t - shl eax, 4
0 C8 o) S+ e3 W" e) N% o1 l0 R - xor ebx, ebx
8 B. y0 N9 ^) P$ B - mov bx, offset GDT_def
a) a+ }: t0 W8 h( a) G7 Y - add eax, ebx3 Z7 F2 k& }; I' g4 V8 M h r
- mov dword ptr GDT_Addr[2], eax9 j0 D9 Y" ]- p, ^. _- C6 G2 n
- lgdt fword ptr GDT_Addr$ d- Q2 X7 ?/ G0 f8 `6 z$ u, W
- /********************
( x1 @ o1 i/ c! a3 h0 [4 q [ - * 选择子偏移 *
9 C) |' k# T& ^+ {+ F: a& z+ K3 H, N& Y - ********************/
( t9 ~; x+ I4 c$ q - mov bx, 8- @! Z$ c( c! X* J
- mov eax, cr0( W o8 j# P7 L& G: y8 D
- or al, 1
R2 ~% }' n E6 } - /**********************
* a% y `3 `% _1 e( | - * 进入保护模式 *$ F$ h* T m& N$ A+ |3 E& `
- **********************/
2 J0 o9 ~$ k4 \$ ^/ u! |% {/ T2 X - mov cr0, eax! x+ K4 E' @- u* L6 h; V. \
- jmp pMod- _0 l2 j. Y9 r6 X! Z& D$ b
- }
. Q% u. p0 u% X/ K1 d9 a# ^
$ X! l: m- w/ E7 j: @" G/ _3 k- pMod: asm{: m* w" q Q- G; {0 g: s
- /************************************************************
/ T T: y. c0 w- ]/ T1 _ - * 让fs与gs加载选择子,使其能访问 0xFFFFF * 4K (4GB) 空间 *
" a( R2 Y. s4 G% c* b" f - ************************************************************/) ]: m% {) V6 `1 e$ |" M
- mov fs, bx# s% y6 {( `) w* W) N: Q" F
- mov gs, bx" {9 z6 c& `0 o# U; O
- and al, 0x0FE+ J5 _5 o3 V, _8 t
- /******************2 N; Z1 ~& j( b
- * 进入实模式 *
2 j0 P7 N2 X( S9 E - ******************/4 U! F$ |9 K6 l% E
- mov cr0, eax
+ S1 M$ R$ ~8 X - jmp rMod
: s+ S. x% O/ Q# H: O, E- T - }
7 L% `# Z( Y: Q' f/ a( x. t - $ a5 t( `- u @8 D1 i( f6 w& U; p
- rMod: asm{# u3 L$ E" k, |
- /* ******************************************************************' R9 Z( S+ L! h3 i' h: W* Z
- * 退出,fs、gs清0,访问系统内存可用: gs[32位,相对于0的偏移地址] *1 i+ z3 @/ `9 [' Z2 Y
- ********************************************************************/
- B! n3 \9 k' J7 U' f - mov ax, 0
; A) Q1 X5 [, b1 K0 M2 y: O - mov fs, ax0 y( y- N. M% \* z9 J
- mov gs, ax
2 R# S2 b" M0 c) ~ - sti e. h: p5 ?9 j7 O# `3 F5 b/ o
- }6 k, v# F3 t+ e6 h/ c, m5 S( W
- }
复制代码 这是asm的- ;/********************************************************************. A" X3 R& ]% S- J8 u' S) P: B; ^) z& v
- ;* File: DOS4G.asm *7 \8 v! r+ A+ j' V! V+ c$ z
- ;* Compile with masm ( Editor: Tab size = 4 ) *
4 O$ W( `" P4 x" s- H - ;* *( e6 g$ u% t" \
- ;* ========================Title=============================== *
0 }: J2 P' O) L3 @; a - ;* 这个demo是让系统进入DOS 4G模式,进行数据访问 *
" @6 t' w) N9 J# V' e - ;* *
) x" r& d% H5 [$ n! x$ h ~- ?# a - ;* ===========================History========================== *0 }+ H9 v. g7 ~) c J. w5 d0 |
- ;* author: bini *
0 j$ o8 {2 W9 U1 C. }1 K. q - ;* date: 2008-10-08 Frist version. *
5 J7 ~3 m1 l( Y: _- e' Q2 {# ] - ;********************************************************************/
( Q# C" L' h/ B - .model small
h5 o' L/ S" J - .586p a$ N( T) V( N8 |, e& g
- 0 \" {" x2 a$ ]( R9 h
- DSEG SEGMENT USE16 ;16位数据段
2 I6 I! p1 V- _ - 9 m- a$ N( H+ m: Y8 W6 D3 y
- DESC STRUC
2 {7 w# s- U9 w; M% z& G - LimitL DW 0 ;段界限(BIT0-15)
! q9 Y: D' e: O9 Q# L7 x - BaseL DW 0 ;段基地址(BIT0-15)
/ k U7 l2 u- Q4 I' @( h6 r - BaseM DB 0 ;段基地址(BIT16-23)! \% M- ^/ b1 o5 A) T! m
- Attributes DB 0 ;段属性
8 M) e3 Y6 `' p$ B w5 s - LimitH DB 0 ;段界限(BIT16-19)(含段属性的高4位)+ m5 |- k! G3 E2 i) J5 k
- BaseH DB 0 ;段基地址(BIT24-31), X8 R; y" A, a) ~6 ~
- DESC ENDS
9 P/ ?, t7 V1 r. k0 L0 ^& Y# K
( p2 X& W( P# D) Y1 `8 J1 n- PDesc STRUC6 O+ D4 [% P; e- N/ J
- Limit DW 0 ;16位界限! ^9 \* e( v& N3 ^7 a
- Base DD 0 ;32位基地址& c, p; w% q6 P ?4 [) M/ V
- PDesc ENDS& F0 A: ]" v' ~" E
- ! U5 r Y+ j# r6 j6 O' j" E
- GDT_def Label Fword) _% @6 ^. U% u+ U% ?8 i
- Null_Desc DESC < 0h, 0h, 00h, 00h, 000h, 0>
$ S% R, r) f5 q( F4 e - Data_Desc DESC < 0FFFFh, 0h, 00h, 92h, 08Fh, 0> ?4 y& _( \: J. a
- ( X% u" |; `6 m
- GDT_Addr PDesc <$-GDT_def-1, >
4 l/ w" t0 E# v% F3 F( _* s - DSEG ENDS ;数据段定义结束) d. Z- H: a! f" n4 g
; d& |( b, d- F* K- CSEG SEGMENT USE16 ;16位代码段
+ w& h; |9 b- p- ^5 p6 S; X# f - ASSUME CS:CSEG,DS:DSEG6 V% |/ \+ M2 k, H6 K6 f, k
- .Startup
& @! P1 E; b5 V: w: s, Y, o! d - call Set4gb
0 b/ W3 I8 t1 c* b& P' D - ;
4 _! X" _3 D5 T. T7 t& b# V( K; c: A - ; fs, gs即能访问4GB空间* w, G2 K( f; u5 A2 J: Z0 m
- ; write your code in here.0 C# q3 w G7 A: t5 F/ X- }" Q2 y
- ;
5 D& V7 z+ ^4 v - .exit
8 I% k/ }( V3 h$ }$ G9 a( ] - 7 H9 v5 b" c* z5 G# r
- Set4gb PROC NEAR
4 W0 \. m& @% Z5 f( X - in al, 92h
1 F% y5 G& y0 l - or al, 002' ]% J# b5 C: S; r4 X% F
- out 092h, al
! w) i# X: i1 `% I. _" o! j& J - out 0edh, al7 t2 W8 L5 s! y
5 c- p& m1 s6 v- cli
! e. v$ d" u- A
' d4 f, s* h. m# P0 ^- ; mov word ptr GDT_Addr, (2*8-1);" y( z- W" O* v
* N, b, A, g( S& ~- H5 U- mov eax, ds
1 q/ k+ s; w5 i* p/ N) Z - shl eax, 4
4 T/ i. b9 g$ F# }" d' c - xor ebx, ebx
) L8 C7 l1 n" l; E$ w$ c - mov bx, offset GDT_def
: n% v9 E I* }7 P - add eax, ebx8 w2 R4 c$ P( h3 @
- mov dword ptr GDT_Addr.Base, eax {! h y( v D# m) M" S; |1 B
- lgdt fword ptr GDT_Addr c$ w% e& l8 |6 H! U0 K
0 W; p$ `9 c" e* I# \7 m- mov bx, 8- T1 k# r* \' L! _# c f
- mov eax, cr0+ v/ V1 }& v% y
- or al, 15 Z+ p0 i# \* B0 z/ Y" l
- mov cr0, eax
9 i5 q) @! Q2 Q6 B8 |- w+ N - : B3 e! b5 E8 n5 r
- jmp pMod
$ j; C! g' W: U7 e, j2 ^4 k* S - pMod:
7 d' ~4 y: K+ v2 q
N$ l! @! c2 k5 T. ?+ I& b, @- mov fs, bx" y. Y: W8 A5 O/ a
- mov gs, bx
7 p h: B% b/ H - and al, 0FEh
2 J8 H( R r2 f9 t" } - mov cr0, eax; }$ ~8 ] L% z2 b$ h% J
- ! f8 s1 {+ U3 Q9 f) o; W" H
- jmp rMod
, Q3 p' u0 X; k3 A( w - rMod:
. l& N u \, l$ I
& G) |3 V6 M5 T' P. K- mov ax, 0$ l5 I& V6 T/ d& q Y4 R& ?
- mov fs, ax
2 ?' Q7 Y( K R: u4 c - mov gs, ax
2 @0 S/ M0 D* k8 p1 X' Z3 F( X - " g P1 H- |3 J4 X
- ; 在2M的位置测试写一下数据; y* {% W6 J) X$ c7 t) G
- mov esi, 200000h5 } o. o% U! X' d+ a. k
- mov dword ptr fs:[esi], 055aa55aah* ^/ T' {% ^; {- Q8 t
- ; 用RU去看看200000h的位置是否是此数据....; g" Y; r( Y; c5 J
- S" X5 m6 w8 G0 ^- sti4 {( ?% S/ U* U( N
- ret
+ {7 b8 @' h! v' l' |- M - Set4gb ENDP
- B* _9 o8 M/ u3 R4 {* t. [ -
! h% N0 J! k4 L9 E - CSEG ENDS ;代码段定义结束
( v2 p- C8 U% Y. M/ D4 l l - end
复制代码 |
|