|
|
刚学习的同学,有些还不会,我这里贴点C和asm的代码。只供参考。
. u9 |: l: X; D# B, d6 R
: C2 D: O; C7 |# i这是C的- /********************************************************************: J, t3 a* g8 F# H
- * File: DOS4G.H *8 {) E9 d3 L% Z
- * Compile with BC 3.1 ( Editor: Tab size = 4 ) *0 z1 b+ r) y- a; v2 g1 W
- * *
8 ]8 h$ \& S. H2 N" p* g - * ========================Title=============================== *
( Q( @: v$ u0 ^# ^ - * 这个函数是让系统进入DOS 4G模式 *
/ j2 h# i; I/ d2 T" N. q; _% L - * 程序参考了:陈家琪《DOS实方式下直接访问4GB》 *
, K; d; O }8 j2 [" ^# W - * *7 k; Q+ s: z& o; b, B" k# v
- * 使用: openA20(); set4gb(); ** z9 p, F9 I6 U, ^ v# q. H8 L% B% X
- * *
" W. P% d% R" _: ?- S - * ===========================History========================== *: p; o) l- P. `. t
- * author: bini *
+ h! n+ D8 y+ @+ E7 K6 Q- H - * date: 2004-11-30 Frist version. */ _- H. l0 f2 [1 L" c+ {; x
- ********************************************************************/1 \6 X. ~) j g$ A
9 T5 o( v1 f+ d! ]( G6 z+ C- #include <conio.h>
" g1 D* Y0 j) J) @5 C2 N - #pragma inline
4 d% z, J3 m. J4 [4 ?. \: w - 2 A) E& W$ b* l3 t6 O$ R
- /************************************************ P U, Q1 O+ U
- * 两个GDT,第一个为系统使用,不管,默认为0 *8 J- u8 z- c% {* n. J4 j; Q7 U
- * 第二个为一个数据段,没有代码段。 *
$ t& S( g& x7 e2 I8 ?& W - ***********************************************/
, Z9 A/ ?2 k7 i: j - unsigned long GDT_def[ ]={0,0, /*系统使用*/& x3 I" q! h+ v' ?6 `
- 0x0000FFFF, /* hi16bit( 0~15 ) is base low=0, $ {$ F' `4 C- R# {% k2 g( ]
- low16bit( 0~15 ) is limit low=0xFFFF
2 f: v5 K8 i; b/ l# k0 [. [ - */1 j( N9 U j0 e
- 0x008F9200};/* 最低字节为 base( bit 16~23 )! w& P7 B" ]# J4 ]
- 最高字节为 base( bit 24~31 )! V _/ j4 C0 ~- J5 q' b
- 7 H& w3 {9 U9 y, D- p$ o! \
- 属性Attrib = 0x8F92
9 Z0 ~" e+ b0 \2 l6 d2 z -
& N' ]7 W) s5 \; q% ` - 属性位Hibyte低四位为
1 K& R1 y" u8 R% _7 P9 X) `* D( d - Limit( 16~19 )=F C. P7 E$ j, U
- 属性位Hibyte bit7 为粒度+ H: {0 r% m `
- (值1=4KB粒度)! h6 \, A/ [5 x' x. X
- 8F & 0x80 = 13 r. g2 O- i8 Z5 t
-
8 c$ m( P+ H1 q9 F- n, @ - 属性位Lowbyte低四位为段类型,值=2# j- T3 a# E- m1 S( Z; y# Y
- 表示为可读/写段
# n: }; E! k' A - 属性位Hibyte高四位=9,bit3=1表示:
- V- J1 L$ f0 p+ N - 描述符对地址转换是有效的。/ U( W1 v' n7 l% W
- bit0=1表示为:
6 G1 A. x+ P3 T* G! o5 ` - 系统段描述符。而不是门描述符。+ A$ \/ ~& f- s Q9 Q: H
- 0 Q! b" L; I! S9 Y4 X8 S8 _+ E3 o* u7 F" a
- */$ w) o4 Q1 K, o/ t$ _
( a- H; e* |+ _* Q8 p) d- /****************************************
- X( V5 `, t& Q' T8 J) w' g - * GDTR寄存器, 48bit=6bytes *! R% l: G. g4 @+ @" a8 H
- * +-------------------------------+ *
9 i9 ^0 ]7 U- q( k; e0 T r7 C - * | 32bit基地址 |16bit界限| *6 |& G& M6 Y+ ~
- * +-------------------------------+ *0 ^$ w( Q" b# N p/ H
- ****************************************/( ? E& ~- N4 S+ q4 E Z
- unsigned char GDT_Addr[6]={0};1 s3 p1 f Q& p* F
- + L# f+ h) Z. ~# ^
- /****************
; w9 G3 \- c6 {3 h9 ?6 E6 j - * 打开A20门 *
6 q5 _! @) v1 J4 F L - ****************/
* M5 l7 g" G v0 M+ p4 q6 Y - void openA20(void)0 F9 v; C$ S' l4 u! ?& [
- {
9 b s7 x! {. |. @: r - asm{
! D: R1 i# S; m9 M - pusha
- c/ Q5 d6 l6 U6 ]- l' v - in al, 92H
* o/ R) {1 [1 M; v1 k. q z' E [ - or al, 0x02* l$ O( o, \- k5 v% _
- out 0x92, al: M0 D6 u+ m( K! P0 ?
- out 0xed, al! S: h1 r! h q
- popa! {0 o5 M {6 l% E) A* y/ r; l
- }
3 \; K$ k: Q9 r1 u - }
. I- ]! r$ e7 B( y( F) X5 |; B
8 T; q: @0 y) |% K7 @- /***********************************************
p8 D3 b! B, l! b D, n" T# r* K - * 函数功能:进入DOS4G *
7 g0 R2 D* z) U4 P! [; d B$ Z - * ==================== *
; [- F) }4 E, _6 `3 H6 M& ~* m$ O - * *7 h9 g/ a9 g+ N# o+ o5 z2 _! E$ W9 P
- * GDT描述符界限计算方式:描述符个数*8-1 *
$ z$ `) k( L% T4 d6 n - * 如: *
9 S% q" y' k$ |! K$ k - * mov word ptr GDT_Addr[0], (2*8-1); *
$ O- J( g+ Q* P; m9 B - * 表示为 2个GTD *5 j! }) m. q7 n. `$ f
- * *! @: F+ U6 e! B% I4 w
- * 选择子为所在描述符内的字节偏移。 *
9 x; s5 @) d" f2 u$ J- c" P6 ~ - * *9 F: z" {7 }3 j! [- `* J
- ***********************************************/: W0 L* d5 t1 V0 j4 x. O/ w- r
- void set4gb(void)* t+ c: q) p( y) f" m* N5 X+ R
- {
. V) C! K! ~1 K6 {3 m3 E4 }; @2 S+ U - asm{' @7 H# N3 v- y6 f
- cli" R6 U/ H- m6 P
- /****************************************
6 V7 d& ^; m* E - * GDTR寄存器 *
, N; R2 r; _& D2 e& g4 ] - * +-------------------------------+ *- Z3 V# d$ Y4 y- M
- * | 32bit基地址 |16bit界限| *
5 z" I/ s6 ?2 L. b1 T - * +-------------------------------+ *& v7 E1 f* e5 y! s8 V5 {
- *****************************************/
8 y4 {; D) p9 a( v* k& u2 }9 |7 s - /*********************, x3 z/ t! A% o% B; ]4 @% X
- * 得出段界限 *
9 t/ k" D0 F+ D! ]/ H# C4 l. ?0 w - *********************/
$ X: r; j6 `* f) S$ H7 H - mov word ptr GDT_Addr[0], (2*8-1);) j7 l; u+ b6 x8 n e/ b
- /********************************************
9 F6 c+ `$ B+ y4 r; o9 p9 Y5 P/ \1 L - * 计算GDT表的32位基地址,存入GDTR *1 g# ^5 ~% c; m9 A R8 l
- ********************************************/* ~0 Q0 f' N$ `( b3 N
- mov eax, ds
- i1 E7 x7 ] P - shl eax, 4
! A, G8 x }5 W* a- i% r - xor ebx, ebx
- ?( X* s" {5 k$ b - mov bx, offset GDT_def. k) ~6 q7 ~3 u! @2 k& D
- add eax, ebx
S8 D Q3 D5 O! Q - mov dword ptr GDT_Addr[2], eax5 P, G0 ?! W$ |; h7 ^6 O+ h
- lgdt fword ptr GDT_Addr
: M0 E4 u! N! X7 F/ ` - /********************& o( f: t1 P) h6 ?8 N/ X P$ C
- * 选择子偏移 *
6 `5 H8 s* ?" ~1 R6 G7 p - ********************/7 y7 j1 m& t) i# ?" k# @8 j3 u
- mov bx, 8& M: z& [7 w2 B9 S
- mov eax, cr0# ]: M$ c; U. K6 @, D: W! U
- or al, 1' O8 {4 Z, b, u# [' K/ |
- /**********************5 \/ a9 E' h$ j/ Q9 V8 A0 B$ [
- * 进入保护模式 *
' M& D( u" F3 N8 B% |& K - **********************/
6 c. E" E" W/ Q - mov cr0, eax
* [% D- q. B3 ` - jmp pMod
p" }& A9 e3 h - }
% t6 ?0 v1 U# C5 h9 `5 u8 C
# P0 |3 r% t- W/ O* q% X& s- pMod: asm{3 [5 |6 p U7 ~) o
- /************************************************************
3 S% H) @. K* r - * 让fs与gs加载选择子,使其能访问 0xFFFFF * 4K (4GB) 空间 *
& T" h% [) `- C* Y# d% ` - ************************************************************/3 ^6 k; l2 B* U2 D0 j( `
- mov fs, bx
3 T( j# Q) z& C# r5 z! L& B - mov gs, bx
+ B. J4 O2 ~ \ - and al, 0x0FE' g" j* ?" p) X( ?7 P) t+ g
- /******************. L! E0 N* m) V5 {+ v/ P% `1 q( R# C
- * 进入实模式 *- f P m/ ]) k8 p6 S
- ******************/& y- V/ G. D/ ?
- mov cr0, eax
* r0 H, \: n' n2 M - jmp rMod' Q) D4 i( n* o% y) E
- }
2 k* K% T6 u& d* b* N$ z4 J
$ V9 m* T) q; d% T% A- rMod: asm{
$ M# O6 |7 M6 a) m - /* ******************************************************************0 M: [ r% `8 n, ]1 b- P/ A" W
- * 退出,fs、gs清0,访问系统内存可用: gs[32位,相对于0的偏移地址] *
4 s1 L0 F' o$ H6 c4 ~7 N - ********************************************************************/
1 e0 D7 F/ q x - mov ax, 0) E' o. I- T: l* Q0 a0 T. G' G* K
- mov fs, ax1 z) D+ d* X7 @+ `6 G
- mov gs, ax
k. u1 ^9 G* L* u' [3 J4 ~ - sti2 ?+ M$ g) Z% ~& B" n9 G
- }2 T2 [. [* h' b5 E4 Q% y9 q! ?
- }
复制代码 这是asm的- ;/********************************************************************
6 q9 N7 f, g/ I- J2 X" P( P- F - ;* File: DOS4G.asm *
/ O+ W7 }' c& p) R. o - ;* Compile with masm ( Editor: Tab size = 4 ) *; x! Q& }9 w7 O2 P$ P6 @1 I
- ;* *; a. d/ R8 @* o4 ]* n
- ;* ========================Title=============================== *( n: h: T d3 T" H F& d- O
- ;* 这个demo是让系统进入DOS 4G模式,进行数据访问 *
' P9 H4 X) X7 u, F) k$ u- x - ;* *
, N [9 G7 g4 T) a - ;* ===========================History========================== *" r4 e- M0 m0 ?9 u* N' L
- ;* author: bini *" x s i7 s) d& ]2 ~
- ;* date: 2008-10-08 Frist version. *
5 u) ?" C+ v; [ U/ X8 m3 n - ;********************************************************************/ " A, S) j+ d& W5 i9 f
- .model small
- @: Q9 C1 R! _; W8 q& L$ B9 }* Z - .586p
5 U* o" P* z ]: R+ c# ~ - 6 @- Q+ w/ N$ Q5 G! k1 w: p
- DSEG SEGMENT USE16 ;16位数据段
: z% [( y6 r4 V7 ~' ?0 x, X5 z6 c1 q - " D! Z0 K+ o' P2 L5 ^
- DESC STRUC% E+ z: X3 w) {( d4 q; ]
- LimitL DW 0 ;段界限(BIT0-15)
) Y4 I5 R2 p9 ~9 \5 X - BaseL DW 0 ;段基地址(BIT0-15)0 i$ C/ @3 V; O( h
- BaseM DB 0 ;段基地址(BIT16-23)& u/ H; Q9 V' d1 g
- Attributes DB 0 ;段属性
9 v3 O8 ~$ D* n7 ?% R# ^ - LimitH DB 0 ;段界限(BIT16-19)(含段属性的高4位)5 k7 r1 x# L3 Y# l: ~
- BaseH DB 0 ;段基地址(BIT24-31)
2 K% M1 u3 \' r) j- a1 L" w o - DESC ENDS% G8 |) k/ k9 m: S% j$ q: Y
0 e: A! ], M$ |5 {* g. F4 y# V- PDesc STRUC5 A/ [+ F9 U: X! B9 O1 }& V6 m3 e6 ^: [
- Limit DW 0 ;16位界限
7 _9 |0 u5 n9 E8 _ - Base DD 0 ;32位基地址
7 k' Q! y" ~. Q2 _ - PDesc ENDS
9 E8 V0 _. ?$ k# k# y
0 { L, T7 S* _7 `$ G$ R6 N3 K6 g- GDT_def Label Fword
7 `* o) m# t1 w8 z2 U5 H7 z6 c. u - Null_Desc DESC < 0h, 0h, 00h, 00h, 000h, 0>4 R( b6 L6 K" W& e$ p8 o4 s
- Data_Desc DESC < 0FFFFh, 0h, 00h, 92h, 08Fh, 0>
( m; f" S. f% [# _) ? - ' k" @- Z! X: n9 z. A E. i
- GDT_Addr PDesc <$-GDT_def-1, >9 M* h" r! X4 {- ?2 U
- DSEG ENDS ;数据段定义结束
5 f+ a+ e' _" E4 P3 g* h% P. e - 8 q7 G' w! s1 ?7 M) T# ]. O4 `
- CSEG SEGMENT USE16 ;16位代码段
6 E0 S! S3 N* M9 f5 ?8 |' u1 a - ASSUME CS:CSEG,DS:DSEG
: v2 ~. L7 q& @/ \. {+ U" x" X$ Q: S - .Startup
# M& J4 x* G1 Y, a8 A4 r# Q - call Set4gb
k8 O* V4 p0 \* R$ Y# C - ;
, N- G" f! l! p3 D - ; fs, gs即能访问4GB空间8 W3 y" q, v! c! e7 C# x8 q
- ; write your code in here.9 e! w* S- r( Q' f) v3 j! q. B2 b, e
- ;
! y$ i" W! G# }- N. v4 R - .exit
, R8 _/ F: X, Q' R" _* J -
7 w' T( R. E) p" J1 s( ]7 r5 H$ ` - Set4gb PROC NEAR" b5 W* D7 c7 `6 x H" }$ s
- in al, 92h7 o4 _9 U6 h) C% c5 T* D
- or al, 002; l) I2 Q0 c" y( x1 Z) l
- out 092h, al
0 L8 q# J" f; o6 q K) ]' ` - out 0edh, al, h+ ~% o3 x5 U- ]
! W g- r |0 O, N% n6 M: z. W- cli6 G- p2 P h/ \6 s* N% \* m5 V
0 R. J8 J$ I' \0 e) u o0 J- ; mov word ptr GDT_Addr, (2*8-1);! G3 {2 {% T. @- o* j {- h
- / H& o5 t8 e7 }8 M# b
- mov eax, ds; }5 |9 x- k" f8 C V
- shl eax, 4. [; K% R0 ?4 N& n& F% q
- xor ebx, ebx
8 X9 n! _. g# Z( ^ - mov bx, offset GDT_def
* e5 Q+ e+ e* f* Y7 k - add eax, ebx9 w* l$ k$ T% w6 y$ L
- mov dword ptr GDT_Addr.Base, eax, h% o8 u/ a% O- _3 f. @; \) S9 p
- lgdt fword ptr GDT_Addr
4 C9 }7 A% D4 `! X7 D( T6 L L0 { - - v# h6 R, H! U" H' Y5 ]% G
- mov bx, 81 X" m3 ]# X3 ~4 Y* T. p o4 f
- mov eax, cr0
# w: T: U2 i8 r; Q1 W - or al, 1
) e: _- ]% j7 s0 F% I# D# G5 a. q1 z - mov cr0, eax9 c j2 x1 j* V) A
- , f) o. Q2 L& D7 r6 \1 S+ p
- jmp pMod
. ^/ C8 ^8 {! u: i6 J: U - pMod:
" ^; G s- p* t& w4 Q
5 t& J4 I/ u# {: u! Q! C' R' q- mov fs, bx
6 l% [8 `- `* u# B3 D4 ? - mov gs, bx L0 z. Z4 Y" v2 n+ a [
- and al, 0FEh
8 Y8 u; \9 x: \& _ - mov cr0, eax
$ B6 o9 t4 L: b6 J! Z! @. N* m - $ i, U, d- ?% S& g' n8 |
- jmp rMod4 s; I4 e# @8 i* x4 Q
- rMod:! E+ p$ Z0 {/ y- O1 ?; I {5 R
E8 `. x# v- @1 p/ n- mov ax, 0" R: q7 n1 v5 M+ F( c! E/ P
- mov fs, ax
/ u0 ?# A" O9 R# T' `" @ - mov gs, ax
. p- O8 t7 y1 P% |) y- M -
7 C1 z3 @1 g( q1 k - ; 在2M的位置测试写一下数据
$ _, t) A7 t! L# X: ^1 X - mov esi, 200000h, Z: q3 p! K7 h. i
- mov dword ptr fs:[esi], 055aa55aah
+ T; l- M& o' m1 q# V - ; 用RU去看看200000h的位置是否是此数据....( A' d6 g9 Q: k1 N; z* n
- " A# p& ]6 j# J N. @6 r* M
- sti% J6 _% }* S( I$ J0 t3 F
- ret9 Z w' p. [9 H& \, f* D
- Set4gb ENDP
0 m2 ?# b; z& V& J# c - : B1 t0 L) ?& j2 B& E1 P* p! N5 Y& W
- CSEG ENDS ;代码段定义结束
" p4 C$ J7 y3 @9 z( X* v - end
复制代码 |
|