|
刚学习的同学,有些还不会,我这里贴点C和asm的代码。只供参考。0 { T+ S( T& a+ i4 s$ {7 T2 W9 B
+ e& ?+ T+ r! l* s t这是C的- /********************************************************************* g! I3 }" F9 }( G+ Z1 Y1 D5 B9 `
- * File: DOS4G.H *8 [( f, o7 ^3 f6 P: S
- * Compile with BC 3.1 ( Editor: Tab size = 4 ) *
: W2 z# z3 N+ n0 \0 M, }& K - * *
; A) b- v9 W% d7 [3 c# ~. I' x - * ========================Title=============================== *
; Q, R4 _7 E" T* ~8 E* k3 V - * 这个函数是让系统进入DOS 4G模式 *8 Y0 h2 z" P3 I6 i* u
- * 程序参考了:陈家琪《DOS实方式下直接访问4GB》 *
1 W+ f0 b5 M- z( G8 A - * *
6 v( v# @) H" _# r - * 使用: openA20(); set4gb(); *
& P) { U; P% Y- h) P - * *
5 `" X$ q" I: q" K u4 w - * ===========================History========================== *
: O3 u: T: T, E$ a# b( z$ H/ f - * author: bini *7 f4 Q% o' b$ g) X8 Y" D8 y5 X# ~
- * date: 2004-11-30 Frist version. *
7 v9 l" m9 t, f/ H* h! K- j" m - ********************************************************************/
( B& k; n# B. Q* W/ m' \: r3 n/ j2 N
4 Y2 B/ t$ F- r' a- #include <conio.h>
0 e o: w* ]7 s - #pragma inline
) t- @' e, L$ K
: x7 q' i6 L8 t7 n( G- /***********************************************
) C1 `' u+ X+ I6 x. y& R& u. R - * 两个GDT,第一个为系统使用,不管,默认为0 *) q9 V% d. e/ u" N+ t# F
- * 第二个为一个数据段,没有代码段。 *1 A* F! W. i! s4 T
- ***********************************************/
7 ^ J* w; P4 K. y% }+ H8 D) u - unsigned long GDT_def[ ]={0,0, /*系统使用*/
0 [" m& k- \; A - 0x0000FFFF, /* hi16bit( 0~15 ) is base low=0,
+ k) r$ j: i* A - low16bit( 0~15 ) is limit low=0xFFFF & F/ K% s- ^5 c7 r& E0 a4 c
- *// E$ c3 H3 z ]$ n) b3 p
- 0x008F9200};/* 最低字节为 base( bit 16~23 )9 P; y, _. V2 A. `. P- ]( S+ P
- 最高字节为 base( bit 24~31 )
6 G+ ^& b* y/ } -
) l; p. @- B9 `% ?* ], o1 q/ i6 D - 属性Attrib = 0x8F929 p# m2 f" L! y- i1 S- p
- 3 U$ j2 T. r- Z' I2 {% Y
- 属性位Hibyte低四位为 % [ x' t+ [$ d5 ^; g
- Limit( 16~19 )=F7 T7 s. O# o. g$ |) }
- 属性位Hibyte bit7 为粒度
* a* G8 r; w/ n, D5 h - (值1=4KB粒度)% `$ A, g! P! p1 [
- 8F & 0x80 = 18 o1 e8 s$ O3 o
-
9 N9 r0 [' Y9 Q4 O e% C( N - 属性位Lowbyte低四位为段类型,值=2- @( T/ G, `, B6 p9 n
- 表示为可读/写段* s( q4 K1 V5 h: `9 T% u
- 属性位Hibyte高四位=9,bit3=1表示:0 {% g) S. x |) ~$ T1 w) I
- 描述符对地址转换是有效的。3 |2 l/ U8 X K8 j% D! n' @# A
- bit0=1表示为:
/ u: f2 S* G) k* a f( @ - 系统段描述符。而不是门描述符。% `" `: c3 L" o
- 5 u- r/ N5 w! p/ \6 t
- */
( v, M; @: K' s9 U
6 n! s/ Q2 c5 s. H8 r- /****************************************
7 q9 p- u; `8 h: Y+ i; M6 r - * GDTR寄存器, 48bit=6bytes *
* h3 ~, }, V1 C/ @6 t - * +-------------------------------+ * h4 I# v$ K. C9 x/ T7 W- s+ s
- * | 32bit基地址 |16bit界限| *% @. j) u! `( X; U/ o! J
- * +-------------------------------+ *1 ]+ L- d& X8 ?1 b! a
- ****************************************/
# h8 y0 {! W* k u& f+ W - unsigned char GDT_Addr[6]={0};* f: W8 ^0 X' u) E
- - q0 m% b% O* _7 b+ _
- /****************
7 l! s3 E# B9 t. b1 o - * 打开A20门 *$ I- V( ]+ |* a4 [% E/ r
- ****************/
6 {' {, T b. [- y/ Q - void openA20(void)
9 A1 ^ G! D$ Y r - {
* N1 {) |) q& C$ A0 p - asm{
4 f6 A2 [- b! h/ m- f - pusha
0 k; M$ A7 k5 [' J3 x - in al, 92H
5 E6 C7 x0 E Z4 n - or al, 0x02
/ ]; m" u0 {6 A8 X& ~3 E1 \* M - out 0x92, al
' u6 {' s4 o- m7 N5 i - out 0xed, al3 Q0 Z7 o3 s6 r. L7 D" p
- popa i4 i; z% P$ x1 j. P
- }1 A$ V, i- \. C2 ?/ \
- }4 P# i& E2 z$ M/ H
7 s* z. c( ^" `$ a- /***********************************************" P( ?. @7 N8 M) \ S3 u
- * 函数功能:进入DOS4G *
1 l. s6 t0 t: D - * ==================== *
, L- Z+ Q r W: ~; E- @ - * *
- P) S+ X; c0 f, i g - * GDT描述符界限计算方式:描述符个数*8-1 *
9 _! W; r( B9 t8 l) R5 ]* N. `% F - * 如: *
- u% d. S+ S' S. ]5 P2 W' h - * mov word ptr GDT_Addr[0], (2*8-1); *; Y" M/ { H y9 {) Y+ } q9 b, w: l
- * 表示为 2个GTD *
* t! C5 _: @% U6 \ - * *
2 c/ V1 k* ^" N& m$ H/ T - * 选择子为所在描述符内的字节偏移。 *- P5 K9 |9 G* o
- * *
6 W( o1 V! ?& G R) }1 J - ***********************************************/
+ X& N# x/ Y' F - void set4gb(void)
" J# @+ d! b8 D- X - {1 f/ N$ C" u- |, z3 L2 K
- asm{) P8 S* b6 P' d. a6 Y8 O
- cli7 Z y- N9 W0 j) \4 v& a% v
- /****************************************& h R! M4 w# `, P" z
- * GDTR寄存器 *6 [! r' \5 i" X! i1 T# t
- * +-------------------------------+ *; y. z u2 W k1 Y
- * | 32bit基地址 |16bit界限| *
; k9 r5 `% {5 S - * +-------------------------------+ *! p" F l+ J$ X" i, O
- *****************************************/5 ]2 A2 X2 a) M5 j
- /*********************
; L X2 o. \1 z - * 得出段界限 *9 w3 i; x7 @6 W' }" o
- *********************/) y* q; U( D2 F* J& ]7 }
- mov word ptr GDT_Addr[0], (2*8-1);
0 x5 W% j2 j } - /********************************************3 I! k' y6 l0 f& { K1 C* D; j
- * 计算GDT表的32位基地址,存入GDTR *; O& u3 V/ i! i
- ********************************************/
$ t; K; y3 m" H4 c5 h1 G/ g - mov eax, ds: ~3 ?. x1 d+ O( b$ l
- shl eax, 42 d' F' k* U* W* d+ X d
- xor ebx, ebx
+ Z* G# W, @6 a; l - mov bx, offset GDT_def
1 t* [" i: R( c" X5 }( K# q - add eax, ebx% N, _+ W T# W" L1 r$ I: U
- mov dword ptr GDT_Addr[2], eax
- t; c f$ @; L# y& G$ H( P8 A5 X - lgdt fword ptr GDT_Addr" J% F4 B; w$ ]0 u( M
- /********************% p. C# D4 y" E% K8 b
- * 选择子偏移 *" g+ W7 C) @$ O' i' V3 [7 G4 i
- ********************/
0 o5 K) e$ g6 w0 @2 a( e - mov bx, 85 J% g! b, r0 m! a
- mov eax, cr0
7 x( x. {1 c8 b! d) n - or al, 17 a0 k/ t/ B4 ^4 N
- /**********************0 @; |* `; i/ K$ J- y& L, j* E
- * 进入保护模式 *0 f. O# U0 m1 O, ?
- **********************/
+ k; a4 t" Q6 U! Y3 H - mov cr0, eax
1 }9 K* t" w6 R$ l( g - jmp pMod3 V2 ^0 T' ]8 q+ B s
- }$ A' V R) z/ o& F
1 ~) X& R# A9 ^! b- pMod: asm{: r, t {; p+ [( l
- /************************************************************
3 ]6 q/ d( u; f - * 让fs与gs加载选择子,使其能访问 0xFFFFF * 4K (4GB) 空间 *; P% i3 _0 P2 F: ]( b% T) c
- ************************************************************/& Y" |4 |( L" [/ v( b
- mov fs, bx; g; A1 r. g; y+ I' q
- mov gs, bx [5 Q; U3 q0 r7 s
- and al, 0x0FE
4 h" G* h. e, c! d$ O - /******************/ A- F- F5 C2 H. P
- * 进入实模式 *
1 U1 z1 d& Q8 i% A* h7 V - ******************/
/ ]1 E- X3 }* _/ d - mov cr0, eax X% n7 P4 T( V9 x8 q
- jmp rMod
( n( I- ]; F+ F- | - }
0 l9 {# Y5 r. f; s/ O - 4 t8 J( k2 {! V# G% H% M& x
- rMod: asm{3 P0 a. r$ x; ` [
- /* ******************************************************************5 O3 U+ g$ p! R, S& N
- * 退出,fs、gs清0,访问系统内存可用: gs[32位,相对于0的偏移地址] *
! H l4 v0 _+ G* g3 Y - ********************************************************************/
: ]( @1 P6 M- j& z' z& V; U - mov ax, 0
0 j! s$ g! k, a) P9 w0 ^) n! y - mov fs, ax
! l6 H8 A1 d, T% ^+ n9 m7 F: { - mov gs, ax- R, A- Z# Z# ^0 Q
- sti4 C: Q9 I0 j; V, E8 ^
- }' {1 L- B. r% y/ M8 J. j- [7 \# v
- }
复制代码 这是asm的- ;/********************************************************************
, I+ I/ r7 N- R) j/ n - ;* File: DOS4G.asm *' P; W* K( R2 @6 s- w
- ;* Compile with masm ( Editor: Tab size = 4 ) *
" R, I' K" |" ^8 D! f) I! d3 Z5 q - ;* *
% n w' P+ ~# u0 w; W - ;* ========================Title=============================== *
: t6 \( h* \! ^/ _ - ;* 这个demo是让系统进入DOS 4G模式,进行数据访问 *
" |% M2 c4 q# S4 m3 r - ;* *
& ?0 v. f6 u0 t, W0 l. [* o - ;* ===========================History========================== *
% u# Q* i9 t5 v) H4 I/ h - ;* author: bini *
, T, H6 F1 B _9 _" x4 Z# x - ;* date: 2008-10-08 Frist version. *
: B+ [- r2 D# n* q8 l! t, ? - ;********************************************************************/
8 e: P" |$ }; {+ i5 P8 L" q - .model small
' U8 p9 E5 k8 R; A/ j, D6 J - .586p
& r8 y$ j$ B: D3 m- ^3 ]/ P -
. O* U2 Y- X1 A1 J9 Z* g$ h7 H - DSEG SEGMENT USE16 ;16位数据段
* t. |2 {, b4 L0 F - 0 U3 |1 o) ~6 u# W0 t9 E
- DESC STRUC& ]- |4 E; x7 D
- LimitL DW 0 ;段界限(BIT0-15)2 E+ s( _) J0 E" w; O
- BaseL DW 0 ;段基地址(BIT0-15)
; y3 J& O* J# Q- a2 e+ _" t - BaseM DB 0 ;段基地址(BIT16-23)
5 h2 R' R# n' {0 R - Attributes DB 0 ;段属性
" W( f( U6 \- O5 c4 T9 z7 W: y3 T, H - LimitH DB 0 ;段界限(BIT16-19)(含段属性的高4位)
* l1 z% ]* W; t1 V - BaseH DB 0 ;段基地址(BIT24-31)
8 h# r# g$ \4 t- D# l' }+ t - DESC ENDS' l: `3 _& J: m
1 T# T4 ~: S* o# a; u- PDesc STRUC; q, @' \% ~- l* P# G
- Limit DW 0 ;16位界限
! ]$ Q, H* O u% k' _1 q - Base DD 0 ;32位基地址
3 Z: {& h4 D' a; Z2 z4 G% b T - PDesc ENDS
5 F0 J' d8 R# x9 t5 H- d) ]2 f - 8 P- }) A. b4 \! _' V) |
- GDT_def Label Fword$ j* v9 j1 \4 a0 @( Y
- Null_Desc DESC < 0h, 0h, 00h, 00h, 000h, 0>* I, [% h% r" ]: O8 `* l
- Data_Desc DESC < 0FFFFh, 0h, 00h, 92h, 08Fh, 0>
1 ^$ d* O E D1 V* W% A - / E0 U. T i5 U! @
- GDT_Addr PDesc <$-GDT_def-1, >8 _# \7 Y# X2 z4 K6 q7 X! a
- DSEG ENDS ;数据段定义结束! l0 l+ i1 y$ W' b
- * ^$ \* `2 \! O# [
- CSEG SEGMENT USE16 ;16位代码段
5 e8 {; x4 q+ M. V4 Z* E9 @; ~9 y - ASSUME CS:CSEG,DS:DSEG8 |8 q( R7 y7 ^. O3 }( `
- .Startup: x/ d; c* q! e+ s& U
- call Set4gb9 U2 Y6 L) Q- @' g8 S/ S3 t
- ;, o% M. Z) B c( ]# R t
- ; fs, gs即能访问4GB空间, _; e# ]+ L/ y, a( x( i* ?" C
- ; write your code in here.
5 o. O' I" `' M2 z( I - ;
; a* F. Y% I" t0 x) P* j - .exit
5 B, o7 I9 O% B/ L* E6 z5 `; t6 _ - 6 M4 n0 R6 \- ^! l l
- Set4gb PROC NEAR- o# Y+ t/ O' [+ q4 h: |
- in al, 92h
5 x$ P1 ?% i5 O7 I4 }* H - or al, 002
- L2 W2 M+ N: [1 v# K$ i8 H - out 092h, al
: ]8 o: |" H$ z# @% t - out 0edh, al
0 I N# a1 m8 c- q: f& @ - ' I/ o; `8 x$ E: }5 |9 K3 S6 J
- cli* m, x. |$ t, z" u( W
( k" u; k+ W! I" B6 [8 k; T- ; mov word ptr GDT_Addr, (2*8-1);8 a7 v* B$ K ]4 ~
- % H2 j5 Y/ X3 z, a% O
- mov eax, ds9 c2 Q, P; z r: E: w& d+ `
- shl eax, 4
! R' a0 j( Z& v$ A& i( U* X) t - xor ebx, ebx
: u F# J' n1 }0 o a, | - mov bx, offset GDT_def% R E2 m5 H0 [9 ^! |
- add eax, ebx
: r# @# h" I1 j% F. ], M - mov dword ptr GDT_Addr.Base, eax* J' l: y" B, y% q( [4 {
- lgdt fword ptr GDT_Addr
8 s5 ~' K: `/ z( b# ]0 v - ; y9 P$ }$ m, [3 Q8 N) `/ r
- mov bx, 8
. H: V4 x% k5 g$ l5 `+ q - mov eax, cr0
" A) D [$ L7 ]' T( X - or al, 1
3 C2 ?( K1 |' A; y; Z - mov cr0, eax- ]) u" {) v7 H' U4 T, v0 m6 G" @
- 1 M3 ~% R( T5 J3 r! u- t
- jmp pMod8 |( B+ E! |, U, Q7 q# c1 N
- pMod:$ k1 u- R. K; X7 y
' b2 u- s) o: \4 d. a" |- mov fs, bx4 n0 K# H/ z' Y% [$ ]
- mov gs, bx- l% K7 G9 L2 o( Q( k% M0 n
- and al, 0FEh
/ k( O- v1 p" ]- M( | b8 t - mov cr0, eax/ H: g, ?. g& s: T
- ' ^, C9 i$ N1 d8 W/ O0 Y: B8 p- T5 U
- jmp rMod! h8 z4 a3 V; O6 j# J1 p' d
- rMod:
$ r6 V/ w9 [; R. d2 Y0 O - 7 R2 x: G$ U$ z) u
- mov ax, 02 o$ T. k& t- N6 C1 m: s
- mov fs, ax$ ~( ~4 \$ e& F
- mov gs, ax
! Y* u$ M; d6 S& z5 P% P - 2 U; G3 V3 \" ^0 O' l2 a! X
- ; 在2M的位置测试写一下数据
: I; n- {' r/ t" j. ]/ w$ ` - mov esi, 200000h7 x0 e$ t& l7 G6 P8 C6 ^
- mov dword ptr fs:[esi], 055aa55aah
h+ Z/ g$ m/ {8 u; A - ; 用RU去看看200000h的位置是否是此数据....( s' v+ q, F0 g4 l
- & V; }/ y" i7 K
- sti
7 I' u. o9 U/ @& U T4 U2 \ - ret7 g: L8 M9 s/ b" j
- Set4gb ENDP3 K1 D* \0 S" n+ K
- / T- m0 c& V) [: i
- CSEG ENDS ;代码段定义结束8 F! j$ m5 r3 W) }1 W/ e
- end
复制代码 |
|