|
|
刚学习的同学,有些还不会,我这里贴点C和asm的代码。只供参考。
5 j: l$ a3 z7 s
0 }2 q* ~' F- T: D0 g. a& \这是C的- /********************************************************************
; f" u" ?& H2 v7 Q - * File: DOS4G.H *
8 J1 c# q b0 _: A( \: Y0 a. E5 i - * Compile with BC 3.1 ( Editor: Tab size = 4 ) */ c, I) S. a4 v f/ D( |
- * *
1 ?; {& T$ e( w* B0 U4 V - * ========================Title=============================== ** W) M( D' B) D, z) W6 F5 E6 Z
- * 这个函数是让系统进入DOS 4G模式 *+ R; x3 Z& {; L4 R2 j7 v
- * 程序参考了:陈家琪《DOS实方式下直接访问4GB》 *4 E9 O5 y: N2 C F# z
- * *7 N8 W" Y6 X: J @' ~
- * 使用: openA20(); set4gb(); *9 f/ |! v+ H7 Z% [
- * *
% G* Q, ]) H8 G$ ~7 S - * ===========================History========================== *! l3 ~3 W8 r; d! X
- * author: bini *
O: A4 Y" z- ^ - * date: 2004-11-30 Frist version. *( n4 H5 e) ]' x2 Y1 Q9 m
- ********************************************************************/
* ?: R& ^3 {& V; `2 x
! g, R. `( K7 x, f) V+ k: O% w/ ] i- #include <conio.h>
% N4 U- a- g M1 r - #pragma inline, c3 }; h4 b" d% p
- , ^9 }- M( t# \) a/ v7 [1 h) d
- /***********************************************
$ J. E% h* I5 f% a8 l - * 两个GDT,第一个为系统使用,不管,默认为0 *
F }6 R2 E+ ?8 S - * 第二个为一个数据段,没有代码段。 *
3 C! U; e+ s1 T1 a/ M, O6 z+ y# _+ d - ***********************************************/
8 N# }; a3 \8 Q- O) F4 z1 c. W& r6 K - unsigned long GDT_def[ ]={0,0, /*系统使用*/+ B6 f( g% n( c* R+ x! f* P+ c
- 0x0000FFFF, /* hi16bit( 0~15 ) is base low=0,
4 I% ~; S/ R# E/ j1 a8 U6 c9 A& t2 T - low16bit( 0~15 ) is limit low=0xFFFF
( g: w2 j4 Q; b$ }7 c, ] - */
- s" C3 u9 E( e - 0x008F9200};/* 最低字节为 base( bit 16~23 )7 K! r$ |/ _ Y
- 最高字节为 base( bit 24~31 )/ j+ _" x8 b; ^
-
, O1 P `$ u2 @1 j- A - 属性Attrib = 0x8F924 Z1 ^7 h( \6 r
-
( J0 e4 X8 l6 m4 V* u - 属性位Hibyte低四位为 0 u. f* R$ \6 T+ e
- Limit( 16~19 )=F! q# g8 Q- m8 d, J3 _
- 属性位Hibyte bit7 为粒度
" z3 B7 x/ H z, U5 J - (值1=4KB粒度)
! i2 a. y6 ]7 v - 8F & 0x80 = 17 ^0 P9 G: ~, ~6 C/ S0 l8 t
- ! _, Q( \0 w0 P! S Z
- 属性位Lowbyte低四位为段类型,值=22 o9 q1 {$ |( L" Q
- 表示为可读/写段
1 t' k' n4 t& [) B2 c# h. o - 属性位Hibyte高四位=9,bit3=1表示:1 g4 a0 i1 k$ B( ]
- 描述符对地址转换是有效的。
2 Z! v0 m4 e/ N1 j/ E L - bit0=1表示为:
8 j2 b5 e! R8 k - 系统段描述符。而不是门描述符。) `* G6 B3 n" H5 U" F4 T: J
- 8 E7 A3 Q" a' s( y
- */& p- P! ` a7 O; m" u4 m
8 H1 B' q' F" j7 U# a: i2 k- /****************************************6 S( I! C5 w) C
- * GDTR寄存器, 48bit=6bytes *: E5 Z; t9 j* W& f8 L
- * +-------------------------------+ *
' A" a9 ~- K1 |' T - * | 32bit基地址 |16bit界限| *
, f- I$ c# S" W/ x( [ - * +-------------------------------+ *
$ \, j0 |2 [5 [8 w6 e - ****************************************/
8 l" e, p( @6 G# r2 R - unsigned char GDT_Addr[6]={0};. [( c2 R, B) j' E6 ]
) c: z' E" H6 _& V3 z- /****************
" O4 P5 E! \8 o - * 打开A20门 *6 I& T/ Q. p- X1 t8 Q' q% n3 x8 {
- ****************/
+ y0 V" `, j6 V. G4 o' R - void openA20(void)# J/ T5 W' y* |5 j
- {$ x( s7 j- n" o1 J, x, t( e
- asm{) S& W' h4 O8 I" y( D! G
- pusha
; i& N( _0 P" t/ o+ G9 G - in al, 92H
( @/ Z# o) a( f/ D - or al, 0x029 d# |+ i: T1 l) U! O
- out 0x92, al6 Q' j- B7 H' r$ _& ^/ E
- out 0xed, al
/ R( p& x- }$ t; f - popa
% M S# C" u; `- O0 S - }
# M, e# u# j& Z+ h! \) {. d$ t- T' c8 _ - }4 y# P- E$ z+ X) I; t
6 O- ~2 P8 s* J g- /***********************************************
" h) t/ ?( H8 w) N L" t P4 R - * 函数功能:进入DOS4G *
6 I# H4 A2 g3 D; v - * ==================== *' a$ F9 H. x A k
- * *
8 f) o/ ?- U& K8 T - * GDT描述符界限计算方式:描述符个数*8-1 *. [0 p( e. g7 X2 m
- * 如: *
: g+ o# v* a& w3 E - * mov word ptr GDT_Addr[0], (2*8-1); *; w) D& }) p4 M& U: ?% g* U
- * 表示为 2个GTD *9 ]! X3 W6 W, }1 S& C
- * *! E; l( H' }3 A, q( B
- * 选择子为所在描述符内的字节偏移。 *
9 S/ e9 A5 p3 I5 L - * *
! \$ v% E8 C, L7 P& D - ***********************************************/ c( P( {$ n7 Z) X- H3 R
- void set4gb(void) S4 s. p- f5 U# e* F9 L* G$ I" Y
- {
# F0 [( E! ~/ V4 T! D% ~ - asm{, ^+ {$ l% R8 y9 j
- cli2 a; |. r: z3 p3 g' a
- /****************************************
2 b. R; l) Q) t. }! _" [% H - * GDTR寄存器 *" F2 P4 a9 F1 p; F, J# B
- * +-------------------------------+ *$ v }: A1 j$ m3 j
- * | 32bit基地址 |16bit界限| *
1 k( K/ G" _- R+ p - * +-------------------------------+ *
; P% |: Y) c0 R+ p9 t - *****************************************/1 o4 C9 C1 d4 Z* {. w
- /*********************1 O, v' D. y( o$ [7 c1 j1 m
- * 得出段界限 */ H' \7 O9 i! \5 l( R6 m
- *********************/9 `2 L8 P( o0 i, ^5 j
- mov word ptr GDT_Addr[0], (2*8-1);
5 j5 n3 D; ^' P/ ~% v% X# b - /********************************************3 _1 S1 o2 b6 _, P6 `( A4 J0 }
- * 计算GDT表的32位基地址,存入GDTR *, A6 e9 |0 M6 T y) G
- ********************************************/
! R4 w9 k2 d. c# l+ { - mov eax, ds
( F. O, ^' ]4 F' ^; E. E - shl eax, 47 c3 f9 ^6 d$ P; M1 j& i
- xor ebx, ebx0 _, q1 y! X3 o
- mov bx, offset GDT_def
2 R4 O9 b$ d9 E3 r3 n3 q - add eax, ebx
! L! [% {+ }7 @; \$ I# i - mov dword ptr GDT_Addr[2], eax
+ C0 I/ W! L2 g - lgdt fword ptr GDT_Addr
5 ^' J1 u3 B- b4 w - /********************
9 o( R/ S4 }2 E" S# p - * 选择子偏移 *6 U! W7 o+ |8 G8 p3 }2 i2 c# C
- ********************/
8 }$ ?% j. G8 P& l$ M - mov bx, 8
7 n& K c7 f/ k$ M9 O" n5 g, h - mov eax, cr03 m/ {; {1 v) o* b/ Q
- or al, 1, F% v$ ^2 P; ?! y2 k
- /**********************
" H l" x7 [! C& P$ H' f - * 进入保护模式 *) Y) ~) l D0 v: x L: i
- **********************/
4 |1 V; g+ |( j& Y+ o' h - mov cr0, eax
, O: ^+ V; h1 u5 O - jmp pMod4 B4 |0 b- C* u; y# ]
- }" v' J) S H+ E/ \: _/ w" i: d
- 6 j, E1 m& l4 G. n# I% t
- pMod: asm{# F; j x0 R5 B* Q$ M
- /************************************************************# d/ |% z6 z/ u6 ~& E7 o7 ?
- * 让fs与gs加载选择子,使其能访问 0xFFFFF * 4K (4GB) 空间 *1 @! C' v9 @9 o+ M+ F. V1 |
- ************************************************************/
: i& i9 _, }: L. B - mov fs, bx
" L; o& v+ j3 h. e4 c - mov gs, bx
3 P% ?% z* L5 h2 N) ^ - and al, 0x0FE# y8 U4 f5 L. d2 I6 W' e% @
- /******************$ p* J) H- M4 n2 A
- * 进入实模式 *- T7 B' m& F r/ u
- ******************/$ t: {4 C2 i4 Q' F
- mov cr0, eax ^) ~+ g, v9 w& n! F
- jmp rMod& l- _6 O {# L+ A
- }
2 N8 V h' n) u* _, }4 x* O - & S' e3 g* u/ r; Z' R
- rMod: asm{# A& w6 ^0 j3 J" x$ P
- /* ******************************************************************
1 i2 V3 ], @& K+ _; w4 v- l( d - * 退出,fs、gs清0,访问系统内存可用: gs[32位,相对于0的偏移地址] ** m% f- e V; Z) L' `
- ********************************************************************/
, t" |* p8 J% P2 x4 v" Z- y! t - mov ax, 0
! }% D# I/ s, j1 K( S: \0 B4 B% N - mov fs, ax5 \) u3 z( ^) V' q
- mov gs, ax+ k/ Y6 z( Q/ |; N7 X
- sti
f' [) _% d' i. ~! l; l9 l3 r& Y8 z - }
: u$ [( t6 E! a0 L) i- ]' W1 x - }
复制代码 这是asm的- ;/********************************************************************$ g( h- {3 y( W3 T* k% K
- ;* File: DOS4G.asm *
1 U- E G% Z) ~0 f/ I - ;* Compile with masm ( Editor: Tab size = 4 ) *: ]6 k: X: f+ t+ q @: W& M( s
- ;* *
7 ~9 i2 c& }9 C, | - ;* ========================Title=============================== *
0 S3 i. [: s) N2 \9 B - ;* 这个demo是让系统进入DOS 4G模式,进行数据访问 * S; x+ r/ p# H4 i3 h6 S
- ;* *
. K+ j9 l1 a' B4 M4 g' T0 u! O - ;* ===========================History========================== *
9 E7 V9 v& y; x5 J0 x - ;* author: bini *% }9 ? L2 j. B2 u7 p
- ;* date: 2008-10-08 Frist version. ** A, w* n. w2 P% O
- ;********************************************************************/ ) h2 |$ V( |2 ?4 \" ~2 w
- .model small
" c8 T! N! S- A; {7 w4 G _ `8 P - .586p' C# D- n6 S" c, X8 |0 e7 I
-
Y4 z+ P7 \2 n2 a9 B' o - DSEG SEGMENT USE16 ;16位数据段/ ^# _8 w, ]- q6 D: p$ P+ S- Y! Y
# o; y7 ]$ b6 `) e( K6 y- DESC STRUC
6 @7 ], Q; ^7 f8 k - LimitL DW 0 ;段界限(BIT0-15)
6 X+ E3 U3 f3 S& m - BaseL DW 0 ;段基地址(BIT0-15)
6 O: m% Z9 s4 ^ - BaseM DB 0 ;段基地址(BIT16-23)
7 V1 N9 j2 c% g* v3 v/ a - Attributes DB 0 ;段属性# q, b1 w/ Z4 f3 W) o
- LimitH DB 0 ;段界限(BIT16-19)(含段属性的高4位)
- U6 R6 j. |2 I. v) [+ ?$ m - BaseH DB 0 ;段基地址(BIT24-31)
% F4 t4 ~# Y4 p1 L. y - DESC ENDS2 S- x" T- C" e: R' _
- ' J$ M3 @# P: i
- PDesc STRUC2 i3 |0 t/ H _
- Limit DW 0 ;16位界限
8 T% r8 ^+ |1 D9 f1 B/ F/ q - Base DD 0 ;32位基地址
' G% G4 C( i3 H+ ^/ I; ?) ]4 M7 \' t - PDesc ENDS
; J* A X) l* v; T4 i8 a; x h - 6 ?- \. B! Y d* g' B" x
- GDT_def Label Fword+ \0 g' Q- _$ {1 M/ Z) l% @
- Null_Desc DESC < 0h, 0h, 00h, 00h, 000h, 0>
( J1 c& _9 V! B( Q - Data_Desc DESC < 0FFFFh, 0h, 00h, 92h, 08Fh, 0>
3 i) @' B% y) I) I - # c; B M/ B0 ^2 n. d, Q: @$ \# d
- GDT_Addr PDesc <$-GDT_def-1, >/ b) F6 F4 Z; O2 ~9 @. R* {
- DSEG ENDS ;数据段定义结束; n) v- a8 b3 o' L$ O( l
- $ ]3 l* [( k9 H
- CSEG SEGMENT USE16 ;16位代码段
( W) g8 y3 y0 V3 ~/ g- s+ E" L- | - ASSUME CS:CSEG,DS:DSEG+ B+ H7 i: |9 P+ k$ N7 B
- .Startup
& `" {0 w% |) |. a4 r9 V - call Set4gb
( e$ o0 x+ [( _ - ;% t C0 u4 h7 `. y
- ; fs, gs即能访问4GB空间& a) {4 s7 f: y& ?7 j' K8 E% `& M
- ; write your code in here.- Y: O: A8 n0 f- K1 [
- ; M( L( H. @. m- x; b1 [$ c
- .exit2 l; r3 y# p( U7 [# J
-
9 w7 X7 [; Y, m& [1 A! O - Set4gb PROC NEAR
: i- g9 a4 x/ j7 @ - in al, 92h
8 I2 j4 [- J6 H7 M! M8 h3 e: { - or al, 002 C+ F7 H. F& X1 ~% q
- out 092h, al
! a; I. }. Y+ }' J$ K, G - out 0edh, al
0 z0 c/ d; m5 M# y" C; \ - 9 Z% b0 }: J2 y7 \! i1 ~6 f
- cli: y6 |! u% t+ \, b8 q: C2 w/ n
; R, A$ l$ B$ n% p8 n9 r- ; mov word ptr GDT_Addr, (2*8-1);
3 [$ F6 ]& U6 K- m. C: }, e! }. C - 1 u7 w! |4 t2 D" a& R/ T( d
- mov eax, ds
6 M% t6 L0 R8 x+ c* F# k3 c - shl eax, 46 a2 ?: _0 O* I3 U7 h1 R% E
- xor ebx, ebx
, W8 A' l9 m% a8 Y - mov bx, offset GDT_def
+ b& @, L. w* {6 w4 f" c' s - add eax, ebx
: l/ E* `3 Y9 o2 A8 U - mov dword ptr GDT_Addr.Base, eax
' G& }4 s# R; i* k - lgdt fword ptr GDT_Addr
7 x% d! c& N; d" S# h- n S" V - 6 c# G+ d* Z+ b: C' v1 X
- mov bx, 8; V6 f6 S7 l# `' c" w+ Q5 Y
- mov eax, cr0
, S6 t' e8 `! L+ D - or al, 1
+ n( ?# t* ` @1 ^" k6 B) d# b _ - mov cr0, eax5 J \% O4 M( T5 R9 Z
" ^ l8 f# u4 L! t- jmp pMod
$ N& E( G+ W6 U G - pMod:
# A; d, e1 z7 d0 }
% o- X' Q, Q2 ]! X! \( X( h5 \- mov fs, bx
2 ?' `. d h! ]6 y H3 B5 F ~ - mov gs, bx
7 E* d4 e2 |0 Y% v* x - and al, 0FEh
! W/ v/ Q& z1 g: d9 J$ T - mov cr0, eax1 s4 U" O d+ P* G
- " B; N/ i [; x0 d8 i
- jmp rMod
! T# d, T& b$ D8 \ - rMod:
, J( f8 p. f0 \! C
( o( ?' k% s' ~8 b+ z- Z- mov ax, 0
& K. L3 R* X4 U( F/ e - mov fs, ax! l& c5 H7 | k6 X6 E% V
- mov gs, ax
- t( @ m9 A/ A - 5 r) [ n S9 q7 G1 \
- ; 在2M的位置测试写一下数据
& H$ q2 G' h+ L, l, ?; w - mov esi, 200000h
- d6 @! _( L- x8 a - mov dword ptr fs:[esi], 055aa55aah& _/ v/ @; f! a" s
- ; 用RU去看看200000h的位置是否是此数据....
/ ~; D. M' H6 T, k* r' f- g+ b
/ f1 i1 J2 K) q& K9 z. I- sti- U3 C' ]' F4 w- \% _: L$ p
- ret
1 V* T" Z0 a" {) x6 _ - Set4gb ENDP2 n) O8 q! w& ?3 K6 m# I: w
- 7 Y2 o5 [! Z, A) s+ g
- CSEG ENDS ;代码段定义结束
8 o$ s- T+ H4 O2 A. G - end
复制代码 |
|