|
刚学习的同学,有些还不会,我这里贴点C和asm的代码。只供参考。
1 E0 l/ f8 v$ d$ h+ x% Y4 a$ m! x: q: Y
这是C的- /********************************************************************- Y# O$ k/ n1 P4 K% _: O# k7 \$ T% p
- * File: DOS4G.H *1 `& j4 n, f& m) R: d4 I$ V0 ?! Y
- * Compile with BC 3.1 ( Editor: Tab size = 4 ) *
- D+ g3 ^; M+ g9 f( h3 C# Q - * *
8 y+ {& O3 m5 M I9 g5 u/ g - * ========================Title=============================== *
" E3 ` f s0 i - * 这个函数是让系统进入DOS 4G模式 *
! I {, V S2 H# {2 e - * 程序参考了:陈家琪《DOS实方式下直接访问4GB》 *# j0 t1 r9 a. O, M
- * *, j# f0 v2 h2 z' j$ w
- * 使用: openA20(); set4gb(); *4 X j3 L8 Z! A& S
- * *# m- g6 ]; ~+ ?; E) q% s! ^% M
- * ===========================History========================== *6 {6 H2 a1 }$ _
- * author: bini *- V9 s2 l1 A& T O1 [
- * date: 2004-11-30 Frist version. *
# d7 d( X5 w/ v0 o( Z - ********************************************************************/& T# Z" c3 g& I; N2 r5 @2 x1 g
) G( f+ J+ r* Q0 o1 ^0 [- #include <conio.h>
8 g* a' `; _) u7 g s) g - #pragma inline( m% M+ U# l/ ~ B X% P8 t! J/ q3 _
* T I# s, D( a1 V; i- /***********************************************0 n. `; ^# q# r9 i* p
- * 两个GDT,第一个为系统使用,不管,默认为0 *
% C9 s3 p, ~7 @ ? o4 v2 N% |/ s - * 第二个为一个数据段,没有代码段。 *
9 l0 s- z0 \ ?6 E, i; k+ \ - ***********************************************/: u( |* e3 }/ w! i) G; o
- unsigned long GDT_def[ ]={0,0, /*系统使用*/
1 [1 f" {8 x; ^: W" S1 ]4 }6 I2 m" c5 r - 0x0000FFFF, /* hi16bit( 0~15 ) is base low=0, , U* E: S2 W; E" N8 `. M: I7 f- ]
- low16bit( 0~15 ) is limit low=0xFFFF ( ^# `2 A$ F5 g7 H2 k0 O5 O$ _
- */6 ~. a# D4 m8 Y- J. e$ f# Z
- 0x008F9200};/* 最低字节为 base( bit 16~23 )
# j$ l- ^' V: T) p. Q; T( \ - 最高字节为 base( bit 24~31 )
( N: S+ f+ a3 D: o - , ?: V7 C: f G
- 属性Attrib = 0x8F92( I/ Y; g: r: S. H* K; ?, F% k+ y
- 5 h, q7 r8 D/ i0 t9 [- k# ?
- 属性位Hibyte低四位为 8 |) c$ C w4 o9 Z, k+ P7 b; H7 t4 ~
- Limit( 16~19 )=F/ u- a- [3 M8 Y, S3 t
- 属性位Hibyte bit7 为粒度
8 h& q& k3 R/ n# z8 f - (值1=4KB粒度)* I. \3 {) S" [( w
- 8F & 0x80 = 1
. x- Z/ C5 _2 }& Y# Y( W- t0 H" J -
+ d; G9 r/ u: h. F: \9 V; t - 属性位Lowbyte低四位为段类型,值=21 m& c8 Y& x; z i
- 表示为可读/写段
: ^. E2 _ a5 d. I# D0 z; E - 属性位Hibyte高四位=9,bit3=1表示:
! i3 x; T' C' {5 k: P# F0 z2 V - 描述符对地址转换是有效的。
& }, M- G/ V! y0 J! `. k1 } - bit0=1表示为:
* }7 @! h! G" U* y* U - 系统段描述符。而不是门描述符。
; N1 I G2 J S -
- H. ^% B- M4 h - */7 _+ n$ A' e( w Q
" k E {& O0 J" m- /****************************************
/ ` i* G8 h8 h - * GDTR寄存器, 48bit=6bytes *" Y+ M% F; H4 a6 N
- * +-------------------------------+ *
9 {( T, Z m, ?1 G - * | 32bit基地址 |16bit界限| *# D, G7 F1 q- x1 ~9 G% V
- * +-------------------------------+ *) d# j) E7 m( L( g% A
- ****************************************/
, Z1 g1 E$ G5 T! j9 u4 u, ~. K - unsigned char GDT_Addr[6]={0};0 A& @0 k5 i( k$ V) q/ P# M5 C0 J
' M* b+ A7 r! T) P4 B- /****************4 X; ~; f# l' b
- * 打开A20门 *
- A# ?) C- [4 ?! x8 r- d5 N - ****************/# r7 F1 d7 z; I, _/ B; i& Y, p
- void openA20(void)# s0 c* o f8 c# D/ w) q
- {' U6 f4 z- ?* V( ?
- asm{$ f/ K8 L$ w9 g- M l/ E
- pusha1 t1 Q7 ?3 K' F) I
- in al, 92H
, W! U% \' p Q! N, R. P* ~ - or al, 0x02
/ G5 E% p/ p; C: W9 A - out 0x92, al
4 l4 ^; T& [ Y) C2 k# \ - out 0xed, al9 [! d L2 [, ~/ i/ x, R1 `. a' }
- popa
/ d$ i/ I: P* O+ X* p' n - }8 @$ @. ~- q V
- }
7 A R7 I) G: t, d1 G4 K - . u2 K' K7 I4 {/ U& T
- /***********************************************) l% Q/ o# K3 b/ {4 @
- * 函数功能:进入DOS4G *' P1 O0 V0 v: J, @) L4 w; G i5 d/ D
- * ==================== *0 Q1 P% X. s$ |9 Q$ A- `
- * *
& j1 h6 R/ V! Z - * GDT描述符界限计算方式:描述符个数*8-1 *
! r8 H6 G2 ?; L3 M1 _0 ` - * 如: *
) {, ~3 o2 z8 }5 B) x1 s1 i* Z - * mov word ptr GDT_Addr[0], (2*8-1); *
8 D. q, I8 u9 J. n) u0 u- g - * 表示为 2个GTD *- P( q; |( ]6 I, s c( \
- * *( |' {2 \0 N7 T* y1 T! B5 O$ I
- * 选择子为所在描述符内的字节偏移。 *
: h3 Q2 o( _! W& }+ {: T - * *; O( E6 A( T6 c8 A9 V0 T) U. ]6 y
- ***********************************************/
, S. `& Z z0 J# H - void set4gb(void)6 b1 Y k. [, k D
- {
; I/ H; V, d- x3 J4 [6 n - asm{4 V4 W) f8 P2 |: X2 s
- cli1 @" x( U8 {& d: g- D3 e3 N
- /****************************************
6 U/ g" i. M4 U' V5 u" i - * GDTR寄存器 *
% M, V% n0 V6 c% S( L8 ]5 C - * +-------------------------------+ * ^5 u% Z4 |) k" ]- \2 I# Z
- * | 32bit基地址 |16bit界限| *( Y+ J9 i2 f. m5 u2 e# S {
- * +-------------------------------+ *
Z' e% U/ L3 D" G7 g, T( | - *****************************************/
8 b7 Z/ L$ E# D; G - /*********************
! Y- F" j& I! V$ O0 c - * 得出段界限 *
{- `2 f' M4 r7 K3 E$ p0 _3 J - *********************/
7 V+ D9 C+ t) d5 E# h4 O& Y - mov word ptr GDT_Addr[0], (2*8-1);
" b* V0 ?6 S; ?, L9 j) M! w/ B - /********************************************
7 p: {6 f) v( f" y2 z7 h& A - * 计算GDT表的32位基地址,存入GDTR *
3 |9 l5 a7 u) S6 p - ********************************************/
: O8 V. _4 n6 ]9 a5 b- [! I - mov eax, ds7 d( ^2 Q* m3 [7 X6 C
- shl eax, 44 f0 i* n' s8 C0 s/ _+ L6 n
- xor ebx, ebx
/ ?+ a, Z- c( t) |4 H - mov bx, offset GDT_def8 d4 D! M& C& N3 x
- add eax, ebx
' i( R( d' F! K+ G - mov dword ptr GDT_Addr[2], eax
9 h7 a/ B1 M/ Y% [ - lgdt fword ptr GDT_Addr
; u8 k, H4 }! k7 K - /********************/ u, ]) p6 X: Z! U
- * 选择子偏移 *
/ n6 Z. P& S6 y, W - ********************/
# Q7 C. U3 P/ o' V - mov bx, 8
. E: X1 U1 D9 l8 M - mov eax, cr0
" }6 L. h" Z7 N. V1 F' e, ?+ x - or al, 18 K' m2 S& U- x% g" m
- /**********************, T" L' |0 h& P' y. N, K ?, u3 a" C
- * 进入保护模式 *
( B: T# T$ D0 M. n, X# h n - **********************/& `. t# ^! l/ K O
- mov cr0, eax8 d, t$ j$ M: M6 J D
- jmp pMod; M* M W+ l& ~+ z: ], M k
- }
7 K. {( z/ ^& m) N, u F3 u# R
% o( n6 ]& q) D+ d4 \" B- pMod: asm{. ^8 v7 H! [9 \7 E- l% c1 G
- /************************************************************6 z/ X% ~8 {/ Y2 m) i" J% m
- * 让fs与gs加载选择子,使其能访问 0xFFFFF * 4K (4GB) 空间 *+ W% Y/ G8 q% ~& z
- ************************************************************/6 x5 L G! X- z7 W. z2 b: d+ W
- mov fs, bx; B/ {9 W& S6 m6 l/ V" C4 I0 v
- mov gs, bx" h) r G' I% i5 W2 [6 p
- and al, 0x0FE, ^7 y6 _% h& j: K4 i$ v7 O
- /******************
; b9 g' i) r8 D0 D - * 进入实模式 *
: t. {( N8 u" d2 P1 L0 G \ - ******************/" P$ {. w5 x4 f0 }) d; p7 E7 P" q
- mov cr0, eax( A1 f7 ^) u; w+ O
- jmp rMod2 P1 m- q9 `- y# V
- }$ }+ i" Y) ~7 l2 c! z
6 G$ ~6 L$ D9 g% i* R+ ]- rMod: asm{
$ o8 C& k d' J2 b1 d0 t2 Z$ ~- | - /* ******************************************************************; U+ b, L/ `3 t4 ]* F. C
- * 退出,fs、gs清0,访问系统内存可用: gs[32位,相对于0的偏移地址] *
& w3 K, Q; A% v0 h9 @ - ********************************************************************/
+ h7 \) `8 w6 v, l5 E! m: \$ h - mov ax, 0
$ X' W4 z1 X# T - mov fs, ax
( e7 H6 }% E5 r/ a! j- n8 ` - mov gs, ax
0 g. s$ u2 p) S5 y% I. m' i. R- U - sti
- H- t4 d6 F3 |+ x - }
: F7 s. V' g2 m - }
复制代码 这是asm的- ;/********************************************************************
" e$ b$ z, k; }4 x9 o2 o |/ V - ;* File: DOS4G.asm *
# {; u7 _# e, ?* c, G - ;* Compile with masm ( Editor: Tab size = 4 ) *
' H j3 W' V5 V4 p, j - ;* *% Q9 ^7 [- t: e9 |* S
- ;* ========================Title=============================== *$ g6 ]" j9 z6 l+ N T7 S
- ;* 这个demo是让系统进入DOS 4G模式,进行数据访问 *
0 O& j) ?0 V9 p - ;* *$ o* ]! ~. [. d6 Q9 G6 S2 P
- ;* ===========================History========================== *; _* g4 R Z! Z, c4 n+ p8 C1 Z" s9 @# V
- ;* author: bini *
; _7 b/ g9 A5 \4 T3 }; r& G! T - ;* date: 2008-10-08 Frist version. *
) M2 p/ C k# W. b2 F - ;********************************************************************/
4 l- _# Y, |/ D7 {/ c - .model small
- Z! j9 j" I1 P - .586p1 ^4 X- h/ Y o2 `( K7 Z
-
, [9 Z t8 B+ n' K - DSEG SEGMENT USE16 ;16位数据段
$ ^. y/ s- ^& G5 H5 `
, M, F9 V" |$ ~/ J! g- DESC STRUC
6 F; y& ?4 a' O: a& @( M# q - LimitL DW 0 ;段界限(BIT0-15)3 p$ z ?$ D/ [; N- z# v Z% Y9 k. j# ~7 b
- BaseL DW 0 ;段基地址(BIT0-15)
! S* W8 B2 p6 }6 t - BaseM DB 0 ;段基地址(BIT16-23)) z |6 i$ m7 h* o/ w5 I. K" E
- Attributes DB 0 ;段属性
1 w4 D- D# s& S% u - LimitH DB 0 ;段界限(BIT16-19)(含段属性的高4位)& q6 \% [, e- L5 V8 F2 l @9 R; I
- BaseH DB 0 ;段基地址(BIT24-31)% ]7 H$ s! q; q1 S% ?# X5 Y2 u
- DESC ENDS
. e( S3 w+ \3 e* L, B - : s4 }$ s: \: g( O, }
- PDesc STRUC
4 Q& X" d$ G K# Y$ { - Limit DW 0 ;16位界限
' t1 m& t. \/ i; L; h - Base DD 0 ;32位基地址
2 o) @* c7 ^1 K/ `3 H# \( D - PDesc ENDS
, Y L# y9 A) L( n4 L7 J - ; B6 K. K, s1 {' h5 i: R8 o: B7 ~
- GDT_def Label Fword
% m1 s3 F$ ?5 Q7 F - Null_Desc DESC < 0h, 0h, 00h, 00h, 000h, 0>
9 j9 Y6 i; j( m7 w) l - Data_Desc DESC < 0FFFFh, 0h, 00h, 92h, 08Fh, 0>
, s$ u2 M: @6 t7 G7 C( O - 0 M1 g4 D6 Y; X# u
- GDT_Addr PDesc <$-GDT_def-1, >) t) q0 ^; K; I0 m
- DSEG ENDS ;数据段定义结束
9 F! S9 q9 }2 Y; G1 M5 Q- m4 E
- C: A8 [: z' g9 J, |+ R" I1 {( E7 f- CSEG SEGMENT USE16 ;16位代码段
p% g* |9 ^. o% n6 D - ASSUME CS:CSEG,DS:DSEG
/ y0 n0 O- ?) {. Z) z* r5 c - .Startup
$ Z$ ^; W$ h4 l& T - call Set4gb
, H9 \" n& |' V1 X* _" v3 i - ;
$ H8 S, `2 c6 X1 d6 j3 _8 e - ; fs, gs即能访问4GB空间0 }/ l3 r# y% v& C
- ; write your code in here.& ~# X! } Y* F# M ^
- ;
8 X. x3 W9 A: ?, t% k! s4 w* F - .exit
4 q; D0 u. T- N - 5 E& d. l; Z$ J: Z4 f
- Set4gb PROC NEAR
b6 j3 c, I7 m3 i$ R& P - in al, 92h1 @! P7 U' P! K7 ?3 `+ }# X
- or al, 002
3 y1 ^! I4 Z% l - out 092h, al
" I7 U% K" s6 g7 e+ x: c3 a - out 0edh, al! V! P! Z, r! O: O3 ~4 X( k3 B
+ X/ A/ z4 n) B- cli+ C1 y5 I" z6 V/ U& A- w
3 ?0 J' A$ U# P- ; mov word ptr GDT_Addr, (2*8-1);$ H7 H5 D, E0 r
9 u% m G/ J. |- mov eax, ds Z3 d `" T+ O" `8 c
- shl eax, 4% K& u7 Q7 p1 {7 B0 L, h' Z
- xor ebx, ebx L0 m9 v2 o% T& [: f9 H
- mov bx, offset GDT_def% u, x0 E: i( I: O
- add eax, ebx
- T f2 S, X# y( p# \% P - mov dword ptr GDT_Addr.Base, eax! I) A* q" O7 E$ A) j7 j- c
- lgdt fword ptr GDT_Addr+ b& R* ?8 h1 b6 I
- 0 t7 x- L8 p9 l5 Q, t ^
- mov bx, 8
# [! ]5 ^0 G d& ?, l - mov eax, cr06 ]; ]9 r2 Y# D3 A
- or al, 1
* g6 [5 s* }! w4 E! z b - mov cr0, eax
9 A" h: c3 l4 y; z - & E! W& ~7 S, e. J
- jmp pMod1 q) x, k- S) f/ ^& g. U
- pMod:8 I8 I+ Y1 f$ N* h5 _' @
- @' a- v$ x( c. M8 J( s- mov fs, bx
8 i* t+ i! f; M1 H# N - mov gs, bx
. Y4 B' J( ^( u% o4 X" k5 y, X - and al, 0FEh
0 ~) k7 H8 _; s) Y- o3 r, `0 N n. P - mov cr0, eax9 s2 Z% t" T% ?% M
- ( B# P2 h2 e& M7 o, F9 y
- jmp rMod+ |3 B' I K( p- J" I- }. M
- rMod:
( P2 r' Q$ @' x$ ^3 J
|: X- c4 \+ z- mov ax, 0
' z% e( f5 {8 j f2 o - mov fs, ax3 ^' l7 {4 s5 M% g6 q
- mov gs, ax2 x6 \3 @" _( \3 p7 {
- + M7 k# j) h( L0 j7 Z
- ; 在2M的位置测试写一下数据
& e" @& \6 }) Y' q" i1 d& p - mov esi, 200000h
8 s2 k2 o) e" `! ^ t: ?( | - mov dword ptr fs:[esi], 055aa55aah
u# s# @1 p b0 i; P& V - ; 用RU去看看200000h的位置是否是此数据....
2 t0 p/ d0 g" V( W% u- L1 x. b B - 9 ~1 n' b0 ]% \$ v. `
- sti' W3 Z7 D# ]/ W2 z2 M
- ret
/ G; @9 p4 [ |7 o) {! ^# f - Set4gb ENDP" ]6 n5 g# p, S$ `0 k& Y
-
2 i7 T" Q# B0 x" V - CSEG ENDS ;代码段定义结束1 I2 s' }- z& `/ Z, H
- end
复制代码 |
|