|
|
刚学习的同学,有些还不会,我这里贴点C和asm的代码。只供参考。8 O( h5 W" ]. u2 I) k. t2 t) M1 f
) g% e0 m- c5 W+ ?
这是C的- /********************************************************************8 i! n3 k; b+ C+ C7 m- ~
- * File: DOS4G.H *
: s2 K0 S4 P" T" P - * Compile with BC 3.1 ( Editor: Tab size = 4 ) *
; x2 p* Q1 p e2 s2 N& { - * *) c2 s3 p$ ^# f% A; Y1 ~
- * ========================Title=============================== *0 x# T; C1 y% a& [/ C! R
- * 这个函数是让系统进入DOS 4G模式 *
* G: u1 B" Z/ Y - * 程序参考了:陈家琪《DOS实方式下直接访问4GB》 *6 b; G( R! p5 u
- * *
: c0 ?; @/ w# q; y1 k' A - * 使用: openA20(); set4gb(); *
. N& a; U+ J4 N7 C* E - * *) B' h& e8 d: ^2 o. |5 ~
- * ===========================History========================== ** t8 P; k4 T, t' e: ?
- * author: bini *
2 z7 m! W& A% T) e: d - * date: 2004-11-30 Frist version. *
8 l: R1 f2 m1 [& a: x- t - ********************************************************************/
! s4 T2 V0 r" V7 Z" w' r - " F8 r+ C$ Z4 A6 |) o
- #include <conio.h>
2 ~# J6 J# g" q; ^% B - #pragma inline- P. n- ? L) h! _1 P/ C
/ b! [' H" c4 w' h" y, i( T- /***********************************************
1 M" j/ R* p* L' |1 R - * 两个GDT,第一个为系统使用,不管,默认为0 *
5 n6 V, r, I" | |- u. J - * 第二个为一个数据段,没有代码段。 *
3 y7 i' H! h0 q" E7 j1 V. k - ***********************************************/
3 O: z8 h; i" { u) m0 l7 M N - unsigned long GDT_def[ ]={0,0, /*系统使用*/) p' Y+ R' y) m/ p
- 0x0000FFFF, /* hi16bit( 0~15 ) is base low=0,
$ x Q$ l e# r$ r$ |' m, N - low16bit( 0~15 ) is limit low=0xFFFF ) R' j- W" A/ @* T; u0 v: f
- */
; ]( N$ e6 z& U* k' S) y1 g - 0x008F9200};/* 最低字节为 base( bit 16~23 )4 v' @1 z( S, o/ O. C
- 最高字节为 base( bit 24~31 ) m8 W% U0 L7 T/ X+ y, A! w
-
0 T7 j& f1 B, d# a, m - 属性Attrib = 0x8F92 O4 a' U7 X5 @2 O' f
-
. Z, u7 G1 W/ z2 N - 属性位Hibyte低四位为 / A1 `4 ?" d( V: A3 n: l) u
- Limit( 16~19 )=F
) n! {' i5 ~5 {" b' w - 属性位Hibyte bit7 为粒度0 b& f5 |# f/ S5 | K) {) N- U' }
- (值1=4KB粒度)
" t0 Y, C9 f) O. I - 8F & 0x80 = 1! Q* F( G* R( D Y3 b! }, R: \
- 4 J3 ^' M' F G J: j1 E
- 属性位Lowbyte低四位为段类型,值=24 _' `) e' k5 T) b
- 表示为可读/写段0 U3 L, ~* [# F; w/ n, t
- 属性位Hibyte高四位=9,bit3=1表示:7 s* N- b# Z- d5 T4 p
- 描述符对地址转换是有效的。3 e6 P" X% M/ M4 K: l
- bit0=1表示为:' M. l* M$ p$ r
- 系统段描述符。而不是门描述符。: Y5 r" ^ y: Z( ?3 h m2 V. T
- $ j! M6 z( D1 m
- */
: q8 B( j& N3 e( g, @- e
$ N" X, I3 F# O" B- /****************************************
$ g3 ]9 P) F0 i+ u' b1 Y- \' e9 k. { - * GDTR寄存器, 48bit=6bytes *
/ Z+ s& C$ I+ H# M ~7 c$ M1 R - * +-------------------------------+ *
' ?1 l6 F! N8 U5 @1 W( Q* r M - * | 32bit基地址 |16bit界限| *" R/ f: S9 I% O" t/ @, \0 `) W* w. B
- * +-------------------------------+ *
* G& F' C( Z2 o - ****************************************/
f9 r$ r+ m: T( c7 v; L* | - unsigned char GDT_Addr[6]={0};- F! U6 w! M. e8 v
- ( G9 @) J+ O) G5 N$ I; \) [) Z
- /****************
; A- `9 i) r7 \+ X. r8 B1 B7 U - * 打开A20门 *- P; m& f/ U6 a/ n- s: e8 a
- ****************/7 [/ r4 V( X8 h4 b$ k
- void openA20(void); ~( S* S+ N! p; {# I3 c
- {
+ x& z) i* X( R: V - asm{
) D" [8 c6 V7 {$ G- z& q P - pusha" M- x/ U: {$ b0 n2 ~: O! n) s; Y3 ]
- in al, 92H- {( U* R2 z: z/ p* }% N
- or al, 0x028 G, ^' z2 g% N$ P! a
- out 0x92, al
2 Z5 K/ Z g% e' V' k' c - out 0xed, al
! d- l: U( H* e& }8 ?% |3 W) s/ K- H - popa
: E F& }/ x" k - }
; T3 I% r) m5 R& [! m - }
! C' E# y1 ?" G( R& B f; s - , \& y/ x" R+ J+ i4 Y" w) U. p2 f
- /***********************************************
& p( \& S3 [, h4 w! G7 K, n - * 函数功能:进入DOS4G *
2 Q, U; S9 q! c C* Q5 b% B - * ==================== *
a1 N# E9 t- p, Q6 X - * *
3 w. c5 Y" T* }6 B/ ?0 i" J- u - * GDT描述符界限计算方式:描述符个数*8-1 *
S% z! ~6 [, L S - * 如: *9 k# k5 `" E, l7 g4 F, A2 X
- * mov word ptr GDT_Addr[0], (2*8-1); *& G0 K; r3 r% k2 A
- * 表示为 2个GTD *. @' ^& e6 k- J/ @% c
- * *( N1 f$ `+ x6 R( t6 G. d
- * 选择子为所在描述符内的字节偏移。 *
8 i) F+ ?% F5 c' G' a2 T# d; ]; S - * *% c& r+ n$ A4 a# W x- y. A$ ~
- ***********************************************/$ K6 Q3 S! y2 M4 l6 q [. {( s
- void set4gb(void)2 S0 t s& ~' ?; Y9 N3 C
- {
: @* r6 A) W( u5 H! v - asm{- ?$ t, |( g! [4 \0 I2 e
- cli
8 S, T, [) {9 t" K1 o - /****************************************/ n) K$ N5 c* ^0 R
- * GDTR寄存器 *
* J5 @5 v7 y2 V& S! h/ ` t - * +-------------------------------+ *3 y% A1 ?/ s. e
- * | 32bit基地址 |16bit界限| *
" ^ @. |5 A' Z e- E) U - * +-------------------------------+ *
) i3 B! [. X0 { - *****************************************/
0 R5 {. \; g) n* ^' p$ O - /*********************3 y6 T% t U, }
- * 得出段界限 *
) G" Q* i; Z& x3 q9 x - *********************/
7 w7 B0 z ?8 h* t. l - mov word ptr GDT_Addr[0], (2*8-1);: L$ a* J* ~# N$ K) {* q1 `- k
- /********************************************
2 _6 @) h+ |* H5 N: D* _ - * 计算GDT表的32位基地址,存入GDTR *
( E2 Y, h; V: w4 q1 f - ********************************************/
, I! j2 y* T1 L8 Q( S3 g) b1 Z - mov eax, ds
$ _2 R8 ~5 A( Y" g$ m - shl eax, 4' b' j! f& C; ?, @' V7 u/ Y1 X
- xor ebx, ebx
$ Z, G7 O( g3 W y" D- V - mov bx, offset GDT_def4 n5 |2 p+ {1 P4 Q- X" J @4 Q7 O
- add eax, ebx2 A0 t) y7 [' [3 c1 K( s6 j/ W
- mov dword ptr GDT_Addr[2], eax$ e4 B8 L! J" Q- G( o0 Q, |! t- `
- lgdt fword ptr GDT_Addr* M2 k+ g5 B" C* u" o
- /********************3 I+ M4 e6 |( k8 ?0 C
- * 选择子偏移 *
* _% ^8 E0 @) V# u6 F! H - ********************/- m) ?% X. W: n, H8 N
- mov bx, 8
; Q' ^+ @- O0 V; Y3 C - mov eax, cr0
" a; S7 R$ m) Q' t5 H+ c/ e - or al, 1
) V9 p* b( X; | - /**********************3 g: L- b' d3 I8 b: A; K% R3 Z
- * 进入保护模式 *
2 x( h; g( c7 Q/ k - **********************/; k; a0 E' Y+ l( v0 q( o9 T
- mov cr0, eax1 Q) N6 \/ S% O4 v0 q
- jmp pMod
# a5 `# k( G$ L' @- _4 ^ - }1 `( y- E. s9 J8 X! r& f' f
- \( N5 w+ ^6 \# t+ J* P
- pMod: asm{- D# S8 F4 P; |7 I1 A8 K
- /************************************************************) l# H0 y% Y* a4 j9 `# j4 p
- * 让fs与gs加载选择子,使其能访问 0xFFFFF * 4K (4GB) 空间 *
, Q- D+ v" ?+ y* K) E# G! d - ************************************************************/
5 ^5 R: h' A- r - mov fs, bx
9 W9 o7 L5 Y* c0 V - mov gs, bx8 E4 U: \3 j! A# U) U" P
- and al, 0x0FE9 p+ ^2 C, B5 t# g
- /******************
- @' Z f3 o% Y8 O1 S- r- F- y - * 进入实模式 *6 `# [( Q G$ d" K: H9 R
- ******************/
1 L: w7 G/ E6 }2 A0 V0 Y" ? - mov cr0, eax+ R* w5 s7 V9 v4 I9 f2 [& d
- jmp rMod) H4 d, i1 J) b. C0 U ^+ j
- }' P, [4 R H- C* j, y+ v/ N/ O
& T2 A/ o. {& R; p. G$ E- rMod: asm{6 I+ f8 M: s7 r5 w. m2 B0 v
- /* ******************************************************************
8 o; q3 I2 P9 t* c7 h - * 退出,fs、gs清0,访问系统内存可用: gs[32位,相对于0的偏移地址] *
0 D. V* ?2 H* j8 T - ********************************************************************/, b' ^+ i" J8 E+ ^
- mov ax, 0+ u6 ?6 O* @7 s4 d! }$ N% L
- mov fs, ax
8 k5 c# P. m3 ]( Z6 {( G9 k/ ^ - mov gs, ax d7 U; I B" J! J
- sti/ T' @: z6 @* [
- }; @$ C, U* y* j' }) o# Q
- }
复制代码 这是asm的- ;/********************************************************************/ O5 z& C- X8 w6 z4 o5 v
- ;* File: DOS4G.asm *5 E9 a4 `! F7 ]" E
- ;* Compile with masm ( Editor: Tab size = 4 ) *+ L4 @0 x3 y+ m' p* [
- ;* *
7 Y: a: f# k" U* A) W$ M0 T - ;* ========================Title=============================== *
R9 n; G4 I/ e) U5 u9 J: |1 |0 ^ - ;* 这个demo是让系统进入DOS 4G模式,进行数据访问 *
7 B- X% m' ]4 e j - ;* *
; {; Q: ^1 b, _( d2 C" c$ \+ u - ;* ===========================History========================== *+ Y4 D/ J* [1 |5 a ~
- ;* author: bini * C+ q# r: r u; F3 g
- ;* date: 2008-10-08 Frist version. *1 ]2 i! T% E O9 `7 Z
- ;********************************************************************/ / g- U+ u' n5 V
- .model small
" ^- V r, w5 T- u/ R/ T - .586p" X; H& ]/ K/ `+ I
-
( Z) T+ T- U# V# _ - DSEG SEGMENT USE16 ;16位数据段9 `* H) h8 G. e3 P
) J1 C* G+ r4 s% o6 O- DESC STRUC( q) _7 X, Q8 l6 I
- LimitL DW 0 ;段界限(BIT0-15)6 j7 \& c& m' d, X6 o7 S( {
- BaseL DW 0 ;段基地址(BIT0-15)
) V% c0 V( f8 z+ w1 _! Y8 s& w6 D - BaseM DB 0 ;段基地址(BIT16-23)! C* m* x8 J( {4 R' K5 p
- Attributes DB 0 ;段属性% N# U- O! |0 K" e1 j. O
- LimitH DB 0 ;段界限(BIT16-19)(含段属性的高4位)
9 |2 ~4 @8 ] D* l4 Q4 S" }) S - BaseH DB 0 ;段基地址(BIT24-31)+ _5 f S3 B5 v" |* a
- DESC ENDS
. d9 Z* W& h0 b1 I - + B/ x& x% F0 P- R8 q9 u6 ^0 f R& Q: z
- PDesc STRUC5 a# p7 s6 U* [# K# A5 I
- Limit DW 0 ;16位界限. i' M# U' G- t9 ?# P
- Base DD 0 ;32位基地址
9 G- m3 c. |/ _/ ~9 |" M9 \& I: @ - PDesc ENDS; z' l2 a1 M7 A8 f" j6 P
# @% _9 W4 l# ]# h9 j* d' g/ X- GDT_def Label Fword
; u& G8 x0 ^/ J S1 Q* d - Null_Desc DESC < 0h, 0h, 00h, 00h, 000h, 0>
1 N( _/ h9 r% l z - Data_Desc DESC < 0FFFFh, 0h, 00h, 92h, 08Fh, 0>0 |: L7 u" L9 `% U
8 @$ ?! z$ t) p- GDT_Addr PDesc <$-GDT_def-1, >, n5 T3 L( O9 u [+ Y
- DSEG ENDS ;数据段定义结束. F; g/ z$ A/ A6 o2 \0 n, O, g
7 w. ^% B2 B1 p4 J4 p% D8 G4 s9 b: r- CSEG SEGMENT USE16 ;16位代码段
: r, s1 A3 j2 c) v+ v6 h - ASSUME CS:CSEG,DS:DSEG
1 k/ b9 X! N# r6 `& G - .Startup
! Y% h" m+ T1 G0 X; M - call Set4gb
9 J. H3 N' V: w& B - ;1 F) d, [/ J% |7 n! ]
- ; fs, gs即能访问4GB空间1 \# y" ~6 C; j0 w: W- a, r
- ; write your code in here.
- c0 D1 }- B+ M - ;
$ e, z6 _3 j+ a" N( n- H" y - .exit- u+ I" z2 F! V- A8 v
- 6 v! a* N8 _% s8 d" F' \
- Set4gb PROC NEAR$ A5 r" y1 T# ]0 ~
- in al, 92h7 g1 U2 Q2 O; N7 U7 D) | P1 f8 W
- or al, 002
5 T" f, x: S1 n; L* c0 [ - out 092h, al
& c/ i9 o5 h7 t2 P& A - out 0edh, al @" v9 Z3 `' J# k L" w7 |
2 }) c% p. F- P, U" m- cli
7 ?6 Z% o( x! I; _2 ^ - ! C0 x x, G. F0 F2 {- _: U8 B8 `
- ; mov word ptr GDT_Addr, (2*8-1);
4 t- ~9 q5 A" _, @
4 [' c, ?$ A& u1 ]% l ^; ?- mov eax, ds
w6 ?) t5 c2 n/ |1 ^/ y7 q) q- Z - shl eax, 49 B8 P4 w0 }! d+ j& E; E" D/ X
- xor ebx, ebx8 B; l: m+ f# y& v$ H+ a0 d
- mov bx, offset GDT_def+ y) x$ I( D0 Q7 U
- add eax, ebx
2 v( X. { C/ ~- _/ G8 _ - mov dword ptr GDT_Addr.Base, eax3 T6 s( N" D X z, i& E7 x
- lgdt fword ptr GDT_Addr
+ \' b) u: u3 w1 r0 r/ L7 l: {
2 d+ Y9 M K8 t( L J; q1 f+ M- mov bx, 8
5 ?& L5 _% x% X' q7 D - mov eax, cr0
8 ]" S4 j! r3 Y9 f - or al, 1
9 i: P' x! F2 t+ t% U+ C0 F E - mov cr0, eax
. x# G0 e6 e: j+ U - / K/ M: T" E& N. _, q* T8 x
- jmp pMod
1 q5 B3 i2 z: G+ ~6 t9 ]4 r5 r - pMod:, E `3 p, [6 q
- , f2 \6 R9 _$ i% S
- mov fs, bx
% R+ l' \. }. F6 i) s- _0 P - mov gs, bx5 N: q# ]9 x' P
- and al, 0FEh
! T0 Y5 K7 ~" X, G& c+ C% _4 ? - mov cr0, eax
4 O9 f( a+ v' y+ f/ L* k) } - & P C' n: ?. A: r9 q
- jmp rMod7 h' F& Z1 j2 F8 ]* U: r w
- rMod:& w2 Q: E* {& M( P( \2 q4 k% Q
- 7 D; L, _/ [0 a! `/ b
- mov ax, 0
1 }. p' t! j7 \5 b& S - mov fs, ax! J9 p7 {6 `7 p" g! w
- mov gs, ax
( l; E: a* V: [, s- N" o8 _, k3 l" u, O -
0 W+ B; c: [. B9 q - ; 在2M的位置测试写一下数据
- G, [4 H+ g- G* b m - mov esi, 200000h- ^. P% a6 E& S/ D3 e& L
- mov dword ptr fs:[esi], 055aa55aah5 e% P$ v6 [2 M, w8 W6 R
- ; 用RU去看看200000h的位置是否是此数据....4 L7 @' I* R1 p3 ^5 m: j: `
- 8 Y) ^. j l p+ a9 ^
- sti
! e( u7 M: v. B2 D4 c# ] - ret
+ ]' Z3 ^1 Z' R - Set4gb ENDP' K- l7 a! S+ u+ @# H
- 6 E0 q. O8 g1 r; K" M, d% s. r
- CSEG ENDS ;代码段定义结束9 `& y6 @, `6 t) Q
- end
复制代码 |
|