|
|
刚学习的同学,有些还不会,我这里贴点C和asm的代码。只供参考。! d* l. f6 x% B% b) t2 h4 F8 o
' h. _0 d' z4 l- d h7 B
这是C的- /********************************************************************. {7 t8 h# m" K
- * File: DOS4G.H *( Q. s Z' E7 ~ d$ V) R h. o! n
- * Compile with BC 3.1 ( Editor: Tab size = 4 ) *
6 c/ b! g) h# r2 T; E3 j$ g- Q; { - * *# y3 W' ?# a7 l1 r' E' f S
- * ========================Title=============================== *! B1 _5 D( S: d
- * 这个函数是让系统进入DOS 4G模式 *
1 W l- q8 a8 U$ `5 a/ P# G4 t - * 程序参考了:陈家琪《DOS实方式下直接访问4GB》 *5 B% n# j6 S# G! B( y
- * *! ?/ w, E5 L) K b
- * 使用: openA20(); set4gb(); *
! D% |- \1 F3 }/ L2 D8 _ - * *" P J% u; L4 E
- * ===========================History========================== *
$ \. M Z9 G$ @ - * author: bini *
2 Q* X3 n" I4 t- b P% v9 C: Q7 v - * date: 2004-11-30 Frist version. *
" h2 c4 c) m9 S+ ?+ Z - ********************************************************************/
1 l! P8 I1 r$ ?% ?- f - : |6 U, a6 b' Q$ _3 [$ ~$ O+ P
- #include <conio.h>( X/ R- ^2 {% ]1 c* a$ Y
- #pragma inline. J2 w( {/ z" Z+ N( l6 e$ d
3 ]; l" ~/ p6 X7 L+ C' d* v# v* O- /***********************************************5 x" q' x" R7 W! [0 H
- * 两个GDT,第一个为系统使用,不管,默认为0 *
4 l, {9 `9 k- k6 |9 Z - * 第二个为一个数据段,没有代码段。 *
% r+ {$ A1 H$ n - ***********************************************/4 }5 L3 T) P; b- R' W7 U
- unsigned long GDT_def[ ]={0,0, /*系统使用*// j" I8 u7 d3 i) Z/ U- X4 W1 P0 I
- 0x0000FFFF, /* hi16bit( 0~15 ) is base low=0, 8 G0 I: _# g1 V2 M
- low16bit( 0~15 ) is limit low=0xFFFF 0 x0 j0 b, L4 V+ ^) C
- */3 `5 |/ ^" b: c, Y: a
- 0x008F9200};/* 最低字节为 base( bit 16~23 )' S+ G7 \$ ?) M! g
- 最高字节为 base( bit 24~31 )
) A9 O# r+ ^$ M* e. h- u) X3 E( S3 R - : t! m) H9 c2 S' W# c; |
- 属性Attrib = 0x8F92" I5 }; o" I- v7 U) l* f
-
2 u- ?$ y' h3 D6 {4 f1 D0 d% J& o - 属性位Hibyte低四位为
- h( r3 C r0 W9 B$ W5 P, A - Limit( 16~19 )=F! b5 S3 c# N) F# l5 V% v/ N. R: O
- 属性位Hibyte bit7 为粒度
$ \3 u0 U. w/ _/ U - (值1=4KB粒度)
( z: P; K" Y* Z1 c) x' a7 V - 8F & 0x80 = 1+ G1 k3 W% V! ~! r1 s9 ^
-
5 m! t8 l' f( Z4 v! h* C - 属性位Lowbyte低四位为段类型,值=2& _; L0 i$ q1 o
- 表示为可读/写段
7 T0 ]. `% W' |7 J- Z; } - 属性位Hibyte高四位=9,bit3=1表示:+ R* z* ^* K* D, b) y+ Q% T0 y% @
- 描述符对地址转换是有效的。
: T4 {/ _& Q) a: {5 r$ x7 y% D - bit0=1表示为:# K) }! {% g* ? g3 W4 c6 z
- 系统段描述符。而不是门描述符。4 K9 r$ R9 ]+ y0 B! z! I+ w
-
; ~) Q6 j- M% B+ T - */
( \+ [+ u0 l) K/ P- N+ G% X6 |
6 p' N# ]/ u' S- /****************************************
% J+ }7 ^9 r3 G) {4 ?8 @ - * GDTR寄存器, 48bit=6bytes *
5 ?/ z" {. ?; s$ o# W% T) H - * +-------------------------------+ *, |4 L% f9 p1 D3 O) q. [
- * | 32bit基地址 |16bit界限| ** @. P2 i- q) ]% O; v2 `# `6 Z
- * +-------------------------------+ *
6 E" c! e- D+ |! Z7 y) [: s - ****************************************/6 n; Y0 g2 V: f) T* k
- unsigned char GDT_Addr[6]={0};$ k7 a4 x9 I9 Z/ Z0 C
- # C5 u2 H* M( X0 \9 `2 @0 S9 N/ h
- /****************
4 ~6 S& [. W" ~3 ?* U- {! N - * 打开A20门 *
( r% }! t9 H9 T6 g: `, V - ****************/
" X% f& s/ c; V6 j% O! I4 H - void openA20(void)
7 T }( }$ d6 w# H/ H0 v - { \+ K! V3 `2 G8 c
- asm{" G& t, Q8 u$ z3 K- {! i! Q
- pusha
4 P& U5 J* K" Z, q- g; ? - in al, 92H: C X' ?6 ?$ K9 I
- or al, 0x02" v. Q* B& f; O2 a! G
- out 0x92, al
5 g- H+ P5 `; h& }5 r - out 0xed, al* @" N/ B' C( g# o
- popa
4 h7 _9 l7 L( t8 g1 r7 ]- J* H - }
! ?1 j- G. r8 }: _6 b7 J - }" T* ^( n8 f" j3 l8 P
+ E, x1 `! `3 E0 \5 C. U- /***********************************************, I2 C6 E: o0 Y) H1 d. v
- * 函数功能:进入DOS4G * |( s2 H* M d( G
- * ==================== * r* ^8 _; B2 [5 k( D9 w0 V
- * *
8 x4 X( E; i) `4 k3 V' M. x4 O g - * GDT描述符界限计算方式:描述符个数*8-1 *
9 R1 x) V9 v+ n4 { - * 如: *# u b2 ?7 m/ S
- * mov word ptr GDT_Addr[0], (2*8-1); *
K" z) ] Z8 m* b' U4 { - * 表示为 2个GTD *
2 t) J! `9 \' O4 a6 Z0 C - * *# }" @' E& R: d9 U" Y5 R6 V
- * 选择子为所在描述符内的字节偏移。 *
5 E; Y- B9 K/ s% f& `4 ?+ V0 y - * *
5 y6 c1 h' n: R$ x E+ B3 R) j% R - ***********************************************/* g9 \% A; _- J! m
- void set4gb(void)
- l) D' x' c/ w - {* N7 a: r- {8 F3 h0 G6 o
- asm{
2 R" }' w. Y: | - cli$ V E9 s4 ^, H _4 e) v
- /****************************************1 \ I& t# m' R" G2 a) R+ u
- * GDTR寄存器 *( ^0 A# ^- \$ |: j; R: W" c0 V
- * +-------------------------------+ *" X9 X' j. ?5 j9 o) z* P: \# C
- * | 32bit基地址 |16bit界限| *
2 k x8 S; W1 e1 C3 s" z - * +-------------------------------+ *
- ]% S0 X( R4 c5 ^ - *****************************************/2 S4 g' v- o" r
- /*********************
' }% [; |8 @5 a% S7 v - * 得出段界限 *
$ b3 G9 @) _* J M# f - *********************/
: Q' Z6 U4 t, p1 ]6 Q" s - mov word ptr GDT_Addr[0], (2*8-1);6 C% [. k& h! ~# M' h5 }5 R
- /********************************************/ _8 u6 A5 r; o8 Y
- * 计算GDT表的32位基地址,存入GDTR *2 m" Y- D( {7 t& I+ [
- ********************************************/* c$ P' S( a0 W4 V; q( W" z
- mov eax, ds2 `* B* n6 x+ d) u6 @
- shl eax, 4
6 T* V( @+ C' N u$ f+ g - xor ebx, ebx: p. G' ]. ^( ^+ w$ ~% p6 [
- mov bx, offset GDT_def
' [2 o# m4 Y$ z2 C' u - add eax, ebx3 A; l1 I, i9 x2 @6 p0 X
- mov dword ptr GDT_Addr[2], eax- b+ N7 L3 q, ?! U
- lgdt fword ptr GDT_Addr
$ u, U$ E0 S# L T* A! Z - /********************# N- K' m3 X" C* s. ?! D* x/ C
- * 选择子偏移 *
: V U4 I$ P7 i' s$ ?3 H2 Z - ********************/
- r% W* O4 Z) N+ k+ `: S - mov bx, 8# P G0 ^, p* `' Y. I
- mov eax, cr0
' ?, m3 W1 `" P5 J4 K - or al, 1
p4 W2 W; `. E - /**********************
8 k/ |4 }# {) u `* \ - * 进入保护模式 *
3 G) a& m/ t. L1 Q' F: V - **********************/
3 d- W( A2 W, o: L/ B) I - mov cr0, eax1 d) S" Z- G8 ^* O2 m7 b- f
- jmp pMod
1 r2 ^2 ]: h( k1 b* C9 c& M - }4 n. e& a% L2 e0 T
6 I6 X: u" O5 Q" B \- pMod: asm{" z8 a1 i1 O/ S }; t2 |
- /************************************************************, l ~* B% ^+ |- ^- V
- * 让fs与gs加载选择子,使其能访问 0xFFFFF * 4K (4GB) 空间 *$ P6 e7 e# }# j6 ?( w. Y" e
- ************************************************************// O. z0 c& h9 u. l, x; K/ P- m
- mov fs, bx/ z/ L# I. K# h( @! H
- mov gs, bx# [0 q* L Z( W
- and al, 0x0FE$ o) `; a* [5 x& s k" G
- /******************# j8 h0 V0 b! c* v0 L8 S
- * 进入实模式 *, N% R6 J4 }6 k/ s5 O& N- g
- ******************/
6 U, ^- V! x! V0 b1 m - mov cr0, eax4 w" `- b# H. k3 q8 }$ c- ~
- jmp rMod
, Q6 ]/ q# W6 x - }0 ]* Y# n0 t+ P: `5 r
- E9 b1 {" O7 q" r4 X1 ^- rMod: asm{
* c# k* {* a1 c! v9 [' } - /* ******************************************************************; V9 G& y# |" K% F, H7 D( \0 E, J& I
- * 退出,fs、gs清0,访问系统内存可用: gs[32位,相对于0的偏移地址] *# B" c) e! ]2 P# c( Z: }6 T/ G
- ********************************************************************/( K/ Z* b. I y; o+ x
- mov ax, 0
% i* A- o( M2 u, w) _ - mov fs, ax
$ [% h8 ^% X$ k# T - mov gs, ax- e6 j$ V2 N- D! P3 \. |- X
- sti
, n5 S* P4 m3 ~- e5 ?; o - }
! \! J/ Y& I$ [0 f9 u3 n - }
复制代码 这是asm的- ;/********************************************************************
7 B. X( o" Y; b. b2 y - ;* File: DOS4G.asm *% @* L8 Y( K! u ]+ x; Z# b
- ;* Compile with masm ( Editor: Tab size = 4 ) *" [4 \2 Y! O& U2 f
- ;* *
5 `4 Q" f% r& [6 J" b- w3 g - ;* ========================Title=============================== *
4 T7 _5 {: `) ?4 k1 l - ;* 这个demo是让系统进入DOS 4G模式,进行数据访问 *& G5 U2 \# J4 H1 _8 f3 u! _. t
- ;* *
4 K o/ T% X/ X- v4 Z* c - ;* ===========================History========================== *! ?2 M7 l2 c5 ~0 M8 ]
- ;* author: bini *
$ W8 A3 t& r6 E! l3 J8 L5 h+ H* r - ;* date: 2008-10-08 Frist version. *6 H% O8 p% u/ i
- ;********************************************************************/
; d, ?6 t9 u# V3 c5 `! o$ u" @ - .model small+ x% s1 T( p- |9 Y$ f3 h5 p8 \; U
- .586p
* N4 L0 ]' ~' m: j' A } - . u& F1 z3 \9 ]6 T" e6 Y
- DSEG SEGMENT USE16 ;16位数据段8 \* G* d: P4 o8 j4 D2 U
, d/ w% E+ z" m+ q) b1 n- DESC STRUC
* I5 e, E5 k* Z9 G. {8 L - LimitL DW 0 ;段界限(BIT0-15)& o9 i' V; l; b0 Q* ^1 E) e
- BaseL DW 0 ;段基地址(BIT0-15)+ q- p1 ] q$ e& x
- BaseM DB 0 ;段基地址(BIT16-23)! e% t4 |& X$ @1 r1 j% Q
- Attributes DB 0 ;段属性& Y, e3 Q A: l, y
- LimitH DB 0 ;段界限(BIT16-19)(含段属性的高4位)& Z; g6 I0 C* J: }
- BaseH DB 0 ;段基地址(BIT24-31)
- O' n! w7 d- ?5 _* `8 y - DESC ENDS; X, ~# ^* t9 n0 _+ X
- * T. g! T- b% T1 v
- PDesc STRUC1 g& E; X2 }2 e2 q2 a' g
- Limit DW 0 ;16位界限
3 a3 V" r8 ]) Q% |4 _9 H$ _ - Base DD 0 ;32位基地址* m7 e f5 V) D! E- u) w x
- PDesc ENDS
1 J1 D1 J. X( h" h) C$ B$ q - 2 C, k. | l- H$ B2 w/ b6 Y+ j! {! c/ G
- GDT_def Label Fword
7 i) ^; L; W: F0 J - Null_Desc DESC < 0h, 0h, 00h, 00h, 000h, 0>
@ f" y# M9 A A& R" z2 e - Data_Desc DESC < 0FFFFh, 0h, 00h, 92h, 08Fh, 0>9 Z* j+ f. d9 @
- 0 q4 u' h7 \5 }0 a6 l v; Z8 m* w
- GDT_Addr PDesc <$-GDT_def-1, >
( _1 z" @1 `" z+ |* a - DSEG ENDS ;数据段定义结束0 V. u2 m/ V1 s6 R ~6 w7 q2 w; a
- 1 q9 | P4 A" {% k0 d
- CSEG SEGMENT USE16 ;16位代码段
' x- B, R4 R# ^3 r - ASSUME CS:CSEG,DS:DSEG
7 ^+ V0 Y/ z" `' V0 h. P- h - .Startup
3 G7 j. ]" k5 x6 Z - call Set4gb
! J0 d* ?3 {4 k% c+ T/ ]9 [ - ;" w& H1 s, x1 z A0 |/ p' F4 a5 A* l D
- ; fs, gs即能访问4GB空间" f' @8 e m( G t& [4 M# o
- ; write your code in here.8 r# ~9 M% T3 G
- ;1 | N8 O! Y9 p$ G
- .exit
0 h* r4 j' T; V8 T) X: d -
: \% J& x Y: R& A8 ` - Set4gb PROC NEAR' A5 d. e7 k& {4 y; G/ z" N
- in al, 92h
- u0 u1 M6 m: n% m7 O8 n) i* n - or al, 002
! H0 W. Q( U5 y% T8 @2 V, Z8 `" u5 @) } - out 092h, al
) m. i5 h" m7 e6 r8 a! D; {4 I - out 0edh, al
: _2 r; d M# u- A9 M
5 {) Q0 @4 t3 f/ ~+ \! L- cli D- N8 k4 Q* L! I
- ! U' s3 h# s0 Z z" n! C
- ; mov word ptr GDT_Addr, (2*8-1);
- s% Q* \9 n: _
/ c2 [6 ~9 M# ^- mov eax, ds
5 j, M; v: M: q" V) P - shl eax, 4
/ J7 Y4 s; j' y+ C - xor ebx, ebx3 [# y' X& B3 [/ d. N
- mov bx, offset GDT_def
& C" C+ e- b. Y+ g! c, S1 m - add eax, ebx" l/ Y$ R: V0 J4 O# _* `6 G) M4 K
- mov dword ptr GDT_Addr.Base, eax2 d; o3 w( [( X) X1 @
- lgdt fword ptr GDT_Addr/ V8 U* P# B( @$ E4 R5 L
0 _( D0 R$ o# E. W6 I( s% c' `- mov bx, 8! {' \% B A4 Y4 e% C. e
- mov eax, cr01 T3 U" B3 w& B% u {3 ^( b! G- r
- or al, 1+ b. X( t1 Z: x
- mov cr0, eax
0 S" ^% u9 _2 B& D - $ |6 N: V3 j+ B4 N) H
- jmp pMod6 L8 N' r: ?) a5 h
- pMod:" v; Y5 E9 Q6 I/ y
" L8 S7 K5 n% y2 ?- mov fs, bx6 w G: n& b! g3 u2 m+ j% E5 ?
- mov gs, bx* Z+ E1 G8 _, [" c! j
- and al, 0FEh* H1 {$ Q- F( ~2 F6 |9 ?
- mov cr0, eax
7 I+ G9 Q q; A7 T, |& Q3 y -
' Q% o, D; J: T5 r& z2 m$ E d' y - jmp rMod
! U- ~: f& h+ i - rMod:
8 M; d+ O2 ~- [2 f& [, I
1 \* ]9 |9 m9 O+ \ d- O- mov ax, 0
" Y( A( j( g" N& R ]3 D) b - mov fs, ax
; @0 m; w- O3 k' x' a3 b" M - mov gs, ax
8 B" K: w+ t, H! i- ]! F6 l -
, C% x4 R. @ r- X1 K. D - ; 在2M的位置测试写一下数据
5 [0 l" j" ~; f/ q, r - mov esi, 200000h
+ o' X( `8 p- {7 x5 K - mov dword ptr fs:[esi], 055aa55aah7 @9 b: H" f4 M5 K5 z
- ; 用RU去看看200000h的位置是否是此数据....- t! G& k# ~8 `% e$ O s. X
- 1 R7 e# q% B! S% _( V; ~
- sti, }% u( Z- e- H0 L
- ret
* a; ~. a+ E% }) L6 `" C - Set4gb ENDP
4 g, m1 f, u. _4 a8 A0 @6 y/ y -
6 f- s8 D# w! X& M - CSEG ENDS ;代码段定义结束
U. d3 |4 C' k/ j$ \ - end
复制代码 |
|