|
|
刚学习的同学,有些还不会,我这里贴点C和asm的代码。只供参考。
; V9 O2 m, C: j- v% v
( @* s$ d Z0 Y' l这是C的- /********************************************************************
- ~9 I0 u* o L& Z* y - * File: DOS4G.H *
) @0 ~1 v% ^" r - * Compile with BC 3.1 ( Editor: Tab size = 4 ) *
; n' ?, a5 A, Y5 h: t) ^ - * *% ]+ F( A6 P7 w A: ~6 [
- * ========================Title=============================== *
+ \/ ?. n' A0 {% ^" i$ K! I' {! L - * 这个函数是让系统进入DOS 4G模式 *
+ H% |! u5 G& B$ _ - * 程序参考了:陈家琪《DOS实方式下直接访问4GB》 *9 w0 U8 V: i: N( ]$ x1 ~* M7 c
- * *. _* S# h/ S; E6 _- t5 B6 c
- * 使用: openA20(); set4gb(); * ~& k0 J8 d( @) d# I, B9 k
- * *
3 i% c ?# K x4 J0 Z5 f+ t3 d - * ===========================History========================== *& a/ \7 _9 e7 k" y
- * author: bini *2 b7 ]) z) F* F+ F0 I: @2 ~ Y
- * date: 2004-11-30 Frist version. *
; m, ~; w4 ]7 X" v; ]! R$ P - ********************************************************************/
! X3 O( B/ [; l, o" c% A' J
% [+ ] t' U# ]5 A# k, P- #include <conio.h>
+ N' k% z- f9 @/ d D - #pragma inline, |( c6 @% Q' ?) @& ]
# Q. n2 I* S1 v/ r- /************************************************ X: k, ]: A$ `5 Z
- * 两个GDT,第一个为系统使用,不管,默认为0 *: m7 h4 }, L7 O( i% I
- * 第二个为一个数据段,没有代码段。 *2 r8 V: y& G" \: R* Z* T. t
- ***********************************************/0 m: t1 j0 F1 H# {0 p/ N. T
- unsigned long GDT_def[ ]={0,0, /*系统使用*/
# P+ i* z/ l: Z# v - 0x0000FFFF, /* hi16bit( 0~15 ) is base low=0, 9 H8 R3 C8 W: c, L
- low16bit( 0~15 ) is limit low=0xFFFF
% P' p) U J) ?8 f/ { - */9 F& h; U- m1 U7 B
- 0x008F9200};/* 最低字节为 base( bit 16~23 )& L% \, x" P7 J' \4 ?
- 最高字节为 base( bit 24~31 )
1 f3 ]" }5 u+ {! z -
1 o% k* M, ?& O - 属性Attrib = 0x8F92" i2 r4 ^" S5 H' u
-
# n# w8 F2 Q. g- S - 属性位Hibyte低四位为 / y6 _, N$ R, B' v9 k* y, U" t
- Limit( 16~19 )=F: J! ]. x( s( h/ {; u
- 属性位Hibyte bit7 为粒度
" O* P) ] B; ^" J - (值1=4KB粒度)& x m @5 q: X2 L
- 8F & 0x80 = 13 Y( a1 ~, t1 ^' W
-
! Q9 Q3 I0 t; c* ? - 属性位Lowbyte低四位为段类型,值=28 j* |% J! w3 d' g2 t
- 表示为可读/写段3 e2 s& F. E2 |, _ b
- 属性位Hibyte高四位=9,bit3=1表示:' S# W" @% M" e, y+ r+ t
- 描述符对地址转换是有效的。4 n5 g! [# h' D2 ?
- bit0=1表示为:2 D5 D, Q5 B7 t- u L
- 系统段描述符。而不是门描述符。- }# E( e& h% c) N! l
-
" _8 k: o+ P/ u9 P! Y2 ~' g5 f - */4 H6 Q3 k! ^( z x/ `
5 Z8 w7 h A4 `. Z+ _& I- /****************************************
8 L; w0 w: H' Q; {2 O2 O - * GDTR寄存器, 48bit=6bytes *
& q1 Y/ m. L5 _+ ?" a0 h) g - * +-------------------------------+ */ z: H0 V0 e, F% m- t3 [# A( t
- * | 32bit基地址 |16bit界限| *0 z' J G9 Q, \8 ?: s+ E5 f) x$ _
- * +-------------------------------+ *$ W% u, b/ w7 p+ E# O; F
- ****************************************/9 ^3 E* C3 z1 v: N/ i
- unsigned char GDT_Addr[6]={0};
, [5 }. Y/ o6 G* V$ @' ?% _
" N F8 F( |/ }- E. G) |9 ~- /****************, G# O: G: e" y j/ l
- * 打开A20门 *
3 Z+ n, S& G6 \" \5 J0 z$ [ - ****************/
7 m8 t) O. ?; m7 e7 d - void openA20(void)' S" U. r F' I+ d! J
- {4 A, P% E0 q( G4 Q& M
- asm{) l* n8 i/ Q( m" l7 L
- pusha8 \( K/ p$ t+ u
- in al, 92H# `' V* Q, M1 J: ~9 [$ N; F% ?! Q
- or al, 0x02% w p* l2 j% u, [" d5 f! J' G
- out 0x92, al
, X. V1 t8 N/ X0 ~ - out 0xed, al3 K! F' H7 n: V0 U# O
- popa5 i$ b% R9 X8 I
- }
8 V3 T4 a: A4 W- |$ k" O - }
, y& M' ^) p5 H" _ - & i# S" Y, f: E3 L. [/ d1 d& c
- /***********************************************
7 w4 W" O8 Y2 I1 y6 {/ A - * 函数功能:进入DOS4G *; ~. J8 l' O( o" p0 z
- * ==================== *# m0 U& }. x; D0 Q
- * *
4 D4 [: r7 `5 j3 R1 D7 K2 ] - * GDT描述符界限计算方式:描述符个数*8-1 *& H, V, B) b0 m* L
- * 如: *
7 T7 A# Y9 S8 E - * mov word ptr GDT_Addr[0], (2*8-1); *3 F' R5 r! b) o
- * 表示为 2个GTD *+ _7 Q# H3 X5 d2 L+ Q, P- Q
- * *, g* a$ `8 q' o/ H1 ^ ^" Z$ N& b
- * 选择子为所在描述符内的字节偏移。 *
3 [' \. P! Q/ j. e1 { - * *
! O$ ~/ S% q5 k% Y% ~* x+ y! x - ***********************************************/( n0 a5 o3 t, ~8 s
- void set4gb(void)
. N1 t# l1 e5 d/ M: U# E* e - {2 j8 d( O3 j4 d/ J' |* L
- asm{. n2 c$ M. y E0 h
- cli% H9 G( P0 s, s/ f, v% G* m4 h6 U1 I
- /****************************************
. m5 T8 X6 T; K - * GDTR寄存器 *7 g% W% [! z9 o* b2 n
- * +-------------------------------+ *) L1 _0 l6 w2 {: A- }1 N
- * | 32bit基地址 |16bit界限| *
+ [1 A. m, x3 Q7 S& G) V6 I h1 X - * +-------------------------------+ *
) b7 X, c, g2 V9 C - *****************************************/
9 @# w. V7 X8 X, K+ [2 Z' Q - /*********************- I8 Y6 i- {' h1 ]1 U+ d5 O& ]. B
- * 得出段界限 *+ h1 W9 F+ g+ F( n C
- *********************/
* m$ k# a8 i. F7 N - mov word ptr GDT_Addr[0], (2*8-1);8 W% n$ P0 u) i+ ~- g1 k
- /********************************************
+ d) ^ C5 {9 [$ {2 x/ { - * 计算GDT表的32位基地址,存入GDTR *$ q% v+ u1 y: j* q$ J f* F3 O
- ********************************************/
1 _$ @# i. {+ r* L - mov eax, ds
W! Y% V% X! S& W0 { - shl eax, 4
: |. ~( {. X* i9 ]& H: |* i2 O - xor ebx, ebx4 t+ Z) Q, \1 b9 F
- mov bx, offset GDT_def" v2 a* I$ U D% ~
- add eax, ebx
5 C" I. H" l; l& y3 Z* C. `2 f - mov dword ptr GDT_Addr[2], eax
# F/ G% P1 f, V! r - lgdt fword ptr GDT_Addr" q3 ~ t) D( U( k- Z
- /********************% p5 L1 a: |/ l1 K
- * 选择子偏移 *
6 ? x+ n0 r n% U6 w: l - ********************/, |8 `1 K& I- b/ ]
- mov bx, 8
! V5 h* o4 u4 U% x# v) M. N S - mov eax, cr0' A4 b0 V( l: ~* A2 E6 s& v
- or al, 1
! |5 t; D: a0 V; l - /**********************
j: p& g: ]( z/ Y! f+ K - * 进入保护模式 *, P/ L: A9 R* V7 c
- **********************/ f1 p: O$ x' H1 m) z
- mov cr0, eax" B" b H4 z* w4 O' p. i
- jmp pMod( s% y8 T( m+ D5 [( k' u7 i( _0 T* ?
- }
5 h6 B9 D1 ?& S1 s+ L, I4 H - 8 V1 N8 x v( ?
- pMod: asm{
' d& `+ @/ N4 T - /************************************************************/ D( z* L6 E% L3 F2 T% R1 z
- * 让fs与gs加载选择子,使其能访问 0xFFFFF * 4K (4GB) 空间 *8 P3 F! Z1 V7 n6 n7 ?2 \2 A) k! Q
- ************************************************************/
1 p) E" ~- c. D. M5 J4 i - mov fs, bx
@ R& i5 B( l' L) t0 l - mov gs, bx
/ T1 D; o+ K/ I& u9 @ - and al, 0x0FE6 J. @' A u2 `- d1 N+ |9 d
- /******************' F8 Q! K) x4 z6 {( T' ?
- * 进入实模式 *
# ^: t6 y1 C! m$ [! S - ******************/
/ o9 T% d0 ~1 S: p3 u, t7 e - mov cr0, eax8 W4 n# y! A1 ]1 |' @0 ^1 ]
- jmp rMod
& U4 C5 S( m3 `) _9 E& ^ J4 W - } w9 r8 D* `3 q- B
- . r- Q) { k1 S% M
- rMod: asm{* r8 |8 ~1 ^* \3 l9 ?
- /* ******************************************************************
. X3 I) z. {+ S* [( H - * 退出,fs、gs清0,访问系统内存可用: gs[32位,相对于0的偏移地址] *9 x- f* W7 a; g; Q/ u- ]% {
- ********************************************************************/. F5 [2 h: O) f; `8 o" V [2 i* y5 `
- mov ax, 01 v8 E ~& P* j
- mov fs, ax
. z/ ` N5 G2 r4 t - mov gs, ax
9 `$ c+ K1 o) ]2 @9 D' Z5 ? - sti b0 j# _! ^0 W' S
- }2 @5 g' C2 F6 p( {( Q7 e8 s% e
- }
复制代码 这是asm的- ;/********************************************************************. v- \: }" y: i& y. }+ v3 p* f
- ;* File: DOS4G.asm *( Q2 v6 `% J' ]
- ;* Compile with masm ( Editor: Tab size = 4 ) *
7 }' s# }* z1 O* f, ~$ F1 y: R& l - ;* */ S( K" t t' x5 ?" y! W2 G3 X
- ;* ========================Title=============================== *7 @& _% j }4 F( r' ~! k
- ;* 这个demo是让系统进入DOS 4G模式,进行数据访问 *
8 C+ B- j: d: Y - ;* *
I& B+ ^# Z7 t& P/ I - ;* ===========================History========================== *! k- k5 x% x% \: ~9 M
- ;* author: bini *
% Z& D0 h5 m1 z: c, ?4 [, N. _ - ;* date: 2008-10-08 Frist version. *" \- g/ \! G+ C3 J" {
- ;********************************************************************/
7 J+ a7 }' |; \ - .model small
$ G! i8 D6 b; }! |# [ - .586p5 ? t: z8 j& _! b6 H+ Y
- 3 z$ q3 X, @0 y9 P
- DSEG SEGMENT USE16 ;16位数据段9 i; O# ^( G# b
! U% ^; `- U; J. e7 b- DESC STRUC
# `" W2 o, l+ K. ^5 _( f - LimitL DW 0 ;段界限(BIT0-15)
& j, p9 e4 E6 x$ m4 Q P - BaseL DW 0 ;段基地址(BIT0-15)6 o/ Z5 ^( N3 g
- BaseM DB 0 ;段基地址(BIT16-23)5 F& x4 U, Z1 h" C- B5 I' `
- Attributes DB 0 ;段属性
4 d+ |9 p s/ \ ^. i - LimitH DB 0 ;段界限(BIT16-19)(含段属性的高4位)
- E4 ?$ d5 J+ b - BaseH DB 0 ;段基地址(BIT24-31), J3 O I' E+ t. m3 a
- DESC ENDS" n" L4 p c! t& ]$ Y0 P; ]' W
+ O1 Q, m' `5 B: W- PDesc STRUC
/ a: L' P, x: \3 W5 K - Limit DW 0 ;16位界限
4 W2 {# r# g2 i$ B - Base DD 0 ;32位基地址4 M( X' V6 V% q
- PDesc ENDS
; F' M( \1 F6 F, C4 `: r - : b3 n2 Y2 x7 B9 Y- g
- GDT_def Label Fword) I0 ^3 Z. {" i8 c' ~0 [
- Null_Desc DESC < 0h, 0h, 00h, 00h, 000h, 0>' R. `; i" E: t3 V0 T
- Data_Desc DESC < 0FFFFh, 0h, 00h, 92h, 08Fh, 0>
2 c4 E' \7 R6 \; L: m5 [, Z - / P$ o% e/ W. O
- GDT_Addr PDesc <$-GDT_def-1, >
" g- m5 t- I3 T - DSEG ENDS ;数据段定义结束
: m: P4 j: P" R* Y8 x
2 h9 x- t" b* j) H0 n- CSEG SEGMENT USE16 ;16位代码段1 p4 q" R( C# F( C7 z
- ASSUME CS:CSEG,DS:DSEG" x2 I! t6 H" g6 ]1 @
- .Startup) v/ D/ g' R% M1 l4 K) l
- call Set4gb8 D( I- c. r5 }0 k% }
- ;7 s& w" |4 J9 Y6 Y5 J2 F
- ; fs, gs即能访问4GB空间3 e: S+ J/ i3 J9 c
- ; write your code in here.
4 w) W6 }7 H3 s9 ]- x5 Y0 ?' J2 x - ;
9 [0 j5 Z5 H# B: Z4 E0 @/ n4 X5 C - .exit( `6 X" {1 D/ u' M3 _/ s7 `
-
% |# l- W8 u! Y# i# q - Set4gb PROC NEAR
. ~$ z0 g8 |: [% \2 y4 ^6 o - in al, 92h+ ~- n: F1 Z" f& F e& [
- or al, 0028 `* n/ D# V9 H3 N! s5 H5 M
- out 092h, al
7 S0 f! V! _ [ - out 0edh, al
" w0 H+ Q& R1 D
. p- y# m4 ]% Y: W" G: i- cli+ B' V9 ^' m3 S% W c9 L
$ r0 F+ Q- A1 Q- ; mov word ptr GDT_Addr, (2*8-1);
* z H% _' ?% ?6 m* o5 x
% @2 a9 a' H7 x- k+ I A k+ p6 G4 A- mov eax, ds0 j+ V, K0 f7 e1 J% h" X/ d; `
- shl eax, 45 ?5 H/ \* A0 @1 @, Q
- xor ebx, ebx
/ j% ~8 a0 F7 o% [2 t, R, l - mov bx, offset GDT_def: b0 h6 o) ]7 G
- add eax, ebx
) s3 c' ?: [+ O' D - mov dword ptr GDT_Addr.Base, eax
. V: s, y* r6 K. A6 b) q' a - lgdt fword ptr GDT_Addr
7 N8 L; Y) G6 S! Z* _ - 8 M" F9 I) J2 \+ j( e
- mov bx, 88 P- G g# t2 R" [8 ~( Q6 m/ I
- mov eax, cr05 Y9 ~2 C' X0 Q) B( o1 l
- or al, 11 u7 F; o! \9 N, P# A
- mov cr0, eax
' i6 D) t, j% {8 i9 }
5 |5 I6 \. Y0 u. T7 V! C- jmp pMod& Z4 F& p0 Y# }2 O$ w
- pMod:
0 }! g, \+ h4 N9 g4 m' Z. A; A( t - t% a0 }& e# ?4 w7 k& X
- mov fs, bx
) u* W' J7 g3 o+ N7 r3 o - mov gs, bx
" x3 T6 _& R: i$ M+ C. g/ ?1 V; | - and al, 0FEh
0 H) z, a. S7 [+ a* N; s - mov cr0, eax
2 J7 H/ Q+ f: s/ g b5 e% E -
" m6 G3 K. z) o" [ - jmp rMod- K a2 y. N/ _: A
- rMod:5 B: A( ]9 q' ?' r( R
- ; r' T. o+ F) O4 h, s$ q
- mov ax, 0
6 M& p! t% f1 Y - mov fs, ax
5 i5 P7 g/ I' d( I - mov gs, ax; P& U; g! ]% ]
-
: B$ y5 p& Z8 C3 J) T$ O - ; 在2M的位置测试写一下数据
- w) W5 D4 X h; g - mov esi, 200000h
& M& ~& f7 u- N6 K2 v# H& r3 s - mov dword ptr fs:[esi], 055aa55aah" Y$ J, S _' D$ s9 ]# s; F
- ; 用RU去看看200000h的位置是否是此数据....- b" @% B8 i( M" e& [, Z! k1 ]6 Z
- 7 [0 C+ V8 f5 ]
- sti
- E: w' I( f7 Q# b! g/ A5 l - ret
1 X9 c1 G8 x& N% |) {$ L, o - Set4gb ENDP5 H& {# z- P& e
-
. U) M8 C, ?1 T5 x - CSEG ENDS ;代码段定义结束
6 F8 V% @# K; R - end
复制代码 |
|