|
刚学习的同学,有些还不会,我这里贴点C和asm的代码。只供参考。
3 X7 f' x. b9 H# D% ^- R: d1 O- i7 q3 N" g1 j
这是C的- /********************************************************************
* l4 I! ^4 ~4 y& Q$ k - * File: DOS4G.H *6 `6 V$ e8 l" \% P4 N! F9 f! Q
- * Compile with BC 3.1 ( Editor: Tab size = 4 ) *
3 S" N5 o. a3 H7 q. V - * */ Y3 e# A0 }" B+ G
- * ========================Title=============================== *
- q- K1 j/ R5 Z8 z: q& L( y" f - * 这个函数是让系统进入DOS 4G模式 *
1 C9 g7 j: z$ A! ^! k; O& x: @ - * 程序参考了:陈家琪《DOS实方式下直接访问4GB》 *8 e: {/ a: [8 a: i, }: @! ~
- * *
! N7 R [& J C# d C' d - * 使用: openA20(); set4gb(); *! A) _" p1 v! p' O2 t! Z
- * *8 c+ s$ C9 O; f, i
- * ===========================History========================== *0 [/ I* D) V% J$ x) Q- {; w
- * author: bini *# B* M3 l/ V( u" ^/ }7 [
- * date: 2004-11-30 Frist version. *& i \# e7 W' o- l0 ^
- ********************************************************************/7 j# N$ h+ \# z' y
- 1 \! C/ m) w! U4 k, a
- #include <conio.h>$ }2 T1 ]/ ^" R: \, g2 Y- s! O
- #pragma inline
6 C) }! x6 T, Q4 _- Z8 S
' Q( f- {2 C! _- /***********************************************% w5 t4 r- r6 ]
- * 两个GDT,第一个为系统使用,不管,默认为0 *( e$ v h; ?& x+ X
- * 第二个为一个数据段,没有代码段。 *
) ]% h, ?) s8 @- G# D+ P - ***********************************************/7 V, f8 N; L ]7 Q" A. [1 n
- unsigned long GDT_def[ ]={0,0, /*系统使用*// `8 c' M5 B K: ^. n1 a
- 0x0000FFFF, /* hi16bit( 0~15 ) is base low=0,
& {0 w8 p) ~, T0 |) h - low16bit( 0~15 ) is limit low=0xFFFF
; } E# g* {9 d: J - */- q$ \# ^4 r% y6 P6 H/ _
- 0x008F9200};/* 最低字节为 base( bit 16~23 )0 w3 |" R7 V- R: D+ I# t9 K
- 最高字节为 base( bit 24~31 )* L/ |; k0 p- N
- , I* P$ Q$ ], l
- 属性Attrib = 0x8F92
8 n0 \; }* Q j4 T* j2 |. d -
8 A- ^5 k$ ], E* B% O2 Y+ h% M - 属性位Hibyte低四位为
& }! | p! ?5 m$ y/ v: ^/ K - Limit( 16~19 )=F* w, |; A; q: t+ o% q3 X' \0 O- T6 V
- 属性位Hibyte bit7 为粒度3 v/ m* l6 Y" S4 P: n& a
- (值1=4KB粒度)
$ [" y. d4 S8 T! q5 W* T - 8F & 0x80 = 1
8 c: n# Y: Z$ V3 |; I- A( z& p5 p2 T -
4 ?8 L/ r8 A$ D9 L& \' R - 属性位Lowbyte低四位为段类型,值=2
% G! M. ] M; J f: n* ^ - 表示为可读/写段
( O: X- u! E! ?+ Y( E6 L - 属性位Hibyte高四位=9,bit3=1表示:
% i, c }; M. `4 y% f/ }' H, A - 描述符对地址转换是有效的。/ l1 L) [+ x# v, a
- bit0=1表示为:
$ m) E: [( }* Q, c Y. o, i - 系统段描述符。而不是门描述符。. @3 F' `( W6 t4 x/ ~
-
: u9 x/ Z3 q$ ]4 G - */, {+ y9 `$ t& m
- 6 K5 u& W7 T" s9 t5 }. N
- /****************************************/ T2 y3 J4 d+ c. s" s
- * GDTR寄存器, 48bit=6bytes *. w# J \& P, K* X8 F
- * +-------------------------------+ *
! {( O( h: {% A* `) e& p - * | 32bit基地址 |16bit界限| *
* f7 O6 K& n y - * +-------------------------------+ *
, I% z# r* \9 M8 ?$ Y/ A - ****************************************/8 X$ P7 y! }2 a6 j3 g$ C
- unsigned char GDT_Addr[6]={0};
! {2 }2 \/ O7 i! I
/ z5 F) {4 z3 h* n: S6 ~" t- g- /***************** f. q; ?* `# y
- * 打开A20门 *0 ?3 @$ k0 b' S! u$ ]
- ****************/9 L' `/ B3 P. t' u0 l1 e* p# V6 @2 B1 H
- void openA20(void)
. P! @: K* m9 k2 v2 C3 k1 m - {! E/ o2 z1 [+ [9 \& c+ j8 t
- asm{
- ~) b" S, x7 `4 v) d' _- E8 w. C5 | - pusha+ H7 w! x' T3 x h7 N& X5 v7 D! B
- in al, 92H
( j4 t+ ?$ p8 z& } - or al, 0x02
, R: C; L1 X& r# s$ U$ ~ - out 0x92, al
( y8 m1 g: ^. W/ |2 M D r - out 0xed, al4 U) u2 L* Y) T" V& p
- popa' c) N; R* v5 S; u
- }1 y" B2 h4 w; O5 b0 e9 s. ?' F
- }, m2 m8 Q- E& y% _( C
- d9 a; }" `: S" G9 R
- /***********************************************7 t) [ {4 M3 w1 m3 c! ^
- * 函数功能:进入DOS4G *
* K" Z9 Q# I" c0 d0 ~ - * ==================== *8 r6 j) s5 T8 W2 g8 z9 t) S# P
- * *
( @, l h/ F6 G) o - * GDT描述符界限计算方式:描述符个数*8-1 *2 f! @4 ?+ c+ S* @
- * 如: *7 [3 I; ]8 H+ U" o, O5 D) v
- * mov word ptr GDT_Addr[0], (2*8-1); *; N! c' L/ i& d1 E
- * 表示为 2个GTD *
% a7 V1 [: I! h6 } - * *) n' N. H& @. D2 G( ]& l# d
- * 选择子为所在描述符内的字节偏移。 *1 H& a s! R8 \) Z( Z! ]9 `
- * *; M7 J& v/ F! e2 V* c1 [& u$ X
- ***********************************************/
1 o1 W% A) M, W - void set4gb(void)
) N* m7 n& f4 J+ b Z - {
0 ^& M! z: @+ W o - asm{0 |: d* i) H% h5 v& p, f
- cli0 `$ W4 `9 \ O% L& ^. W
- /****************************************. L5 J8 j3 i* p# Z' e T; f8 y3 G
- * GDTR寄存器 *
: }, k- ?. E) S; i* O3 e7 d6 G# d - * +-------------------------------+ *
& G; V% Z6 ^% A. L* B! w, v7 b - * | 32bit基地址 |16bit界限| *
K( L7 \+ {8 v: B - * +-------------------------------+ *
8 c) f; P W2 F V5 N5 r6 b - *****************************************/( M: \1 i V! k G5 z: D
- /*********************
t: |) \ h5 j' n; k$ E$ _ - * 得出段界限 *
* }/ H" w7 t U* G! m - *********************/0 F: v4 v+ t; `, L1 _; d7 t9 @
- mov word ptr GDT_Addr[0], (2*8-1);
( b ^# g L+ V+ y( x - /********************************************" g P H* p5 L( g7 Z$ w
- * 计算GDT表的32位基地址,存入GDTR *' Z4 P Z$ p9 j, W
- ********************************************/
4 P# D+ D1 t& \4 f' M - mov eax, ds- B# u5 M8 F$ E! w# E1 R w' h
- shl eax, 46 _: x. T' ^0 ^# T, `# l L& }
- xor ebx, ebx1 f" d2 ]+ f3 Y: v4 D8 h
- mov bx, offset GDT_def
- C; Z u# y' e% ^ - add eax, ebx+ | h t3 ?) x, W) x1 q
- mov dword ptr GDT_Addr[2], eax, D ^/ I0 B, @7 m, b
- lgdt fword ptr GDT_Addr9 p" {$ }9 ^- O5 ]
- /********************; j1 j7 x m1 \: a: F9 m
- * 选择子偏移 *1 J U+ y% q! Z5 }
- ********************/! [" h6 t( k: {) \
- mov bx, 8
' B! h' r, _. H0 f8 m - mov eax, cr0
# q3 h6 Y8 N0 l2 Y! }! p - or al, 1
# R& \1 n- k$ \2 r2 H. w - /**********************( _6 b i% I" w' B) i
- * 进入保护模式 *
4 R$ G, h% C6 {$ _3 @ - **********************/
+ v$ g$ S9 V. `+ _4 c, [ - mov cr0, eax( x8 ~7 a0 W( v* {3 v5 x' L
- jmp pMod0 |) U& q" u ^& R9 X6 \
- }
& u* K# l4 f+ \. b" [9 A - ( M4 t9 k8 Y9 ?& G( g
- pMod: asm{
; ?& b4 G' M8 j. ?- l+ W& \ - /************************************************************ \% e: k4 v& T5 u. N
- * 让fs与gs加载选择子,使其能访问 0xFFFFF * 4K (4GB) 空间 *
6 ~$ e0 M" {, @) I - ************************************************************/
/ ]4 b' }+ [2 Y - mov fs, bx" T/ ]! e2 u# J9 p9 O
- mov gs, bx; |, u( ^- r6 {$ }6 g x# H+ Z
- and al, 0x0FE
b/ v/ F( R5 x0 T2 W& L - /******************
& E5 v3 i ~) Y/ c, o5 \ - * 进入实模式 * y/ \: n) n! G9 L
- ******************/6 C' W+ k: l, l
- mov cr0, eax
& C5 a! V/ O' I0 T& I3 z - jmp rMod
9 F+ [& Z- J$ W' W: \; l) i# H - }5 `# r4 N; ]: d+ L8 W3 B
- & `8 I) M9 J' @5 ]0 b* a
- rMod: asm{5 r& J" ^+ [" T/ U2 I
- /* ******************************************************************( ]1 t, O4 p ]7 `5 N4 w
- * 退出,fs、gs清0,访问系统内存可用: gs[32位,相对于0的偏移地址] *' J7 b6 J. h$ X2 u0 }
- ********************************************************************/
% D5 \: n, [ Y3 V% Z% q' I, Y - mov ax, 0* d+ J+ W' c$ f' ^( u
- mov fs, ax
( o6 p- S; |$ T9 q! V - mov gs, ax- F/ n+ t! i8 |4 `
- sti7 G- S; [9 g' {: d( N% x
- }
+ @, d* Z4 P# }6 T - }
复制代码 这是asm的- ;/******************************************************************** T4 ?( R4 [+ \: P) K) i" ?
- ;* File: DOS4G.asm * [# G) Y& f% f3 q5 D! d3 u
- ;* Compile with masm ( Editor: Tab size = 4 ) *, W! V) m* F/ ^0 d9 V+ Z3 R6 R
- ;* *
, t% D7 t! p, ` - ;* ========================Title=============================== */ {% A7 s8 h0 ^! F; H
- ;* 这个demo是让系统进入DOS 4G模式,进行数据访问 *
" p+ I1 |- G) W - ;* *
7 Q6 ]4 ^- C" q( P) h% W+ R l! S - ;* ===========================History========================== *
3 u6 e1 W* A6 N- K: p - ;* author: bini *
8 O/ ?% g' s( L% o - ;* date: 2008-10-08 Frist version. *6 }) }1 N, ^# X! G$ n" w
- ;********************************************************************/ 1 B3 t8 {4 K6 q2 g% b, |1 t
- .model small
& w. n/ y3 |' t& N$ m7 D8 u% T - .586p
1 e3 e- N& T" _, W& l& Y -
0 Q2 T" p X! x, U* v7 a9 B! b$ D - DSEG SEGMENT USE16 ;16位数据段5 _; F+ P8 b$ S0 @: W
- " c' r, ^0 D O% D- D) a7 G+ y. u
- DESC STRUC7 F# S* ]( G* m0 K, b
- LimitL DW 0 ;段界限(BIT0-15)
J7 e- T7 C! I4 O f: f - BaseL DW 0 ;段基地址(BIT0-15)
" a! K7 T$ F6 S3 q) [9 \ - BaseM DB 0 ;段基地址(BIT16-23)
1 v' w; A* h6 k# R - Attributes DB 0 ;段属性0 U% C; ?2 j# ]( V" S
- LimitH DB 0 ;段界限(BIT16-19)(含段属性的高4位)# ^4 h5 W7 T% G) s4 b4 x6 x# a
- BaseH DB 0 ;段基地址(BIT24-31)6 C5 \5 v- E" P5 D3 G8 {
- DESC ENDS
# E) s( w6 D2 A1 _0 {- p$ N
; m. Z' A9 ~ ? d- PDesc STRUC# b! B$ ?) \ t
- Limit DW 0 ;16位界限; l3 K, j* {# x
- Base DD 0 ;32位基地址4 Q0 V4 C- Z3 ^ E; I. h8 O% o& f
- PDesc ENDS
: n2 W" s$ P" L - # j7 ?8 P% |, b) S* L
- GDT_def Label Fword
# C9 y% I {" r' Z - Null_Desc DESC < 0h, 0h, 00h, 00h, 000h, 0>
9 a6 f. G3 H: D" ~8 i$ u k4 K- k - Data_Desc DESC < 0FFFFh, 0h, 00h, 92h, 08Fh, 0>5 T- X- w! n% w# a8 H, Y
- % l) @) y/ M, F! t) g U2 ?
- GDT_Addr PDesc <$-GDT_def-1, >
9 f/ S+ q7 j% H, P0 O3 e) f - DSEG ENDS ;数据段定义结束
8 u% o# F: R1 T9 }: D- q
: y! m" \3 y" o* C5 L- CSEG SEGMENT USE16 ;16位代码段9 |" u7 ^* R1 B- `% I3 K
- ASSUME CS:CSEG,DS:DSEG
, m8 I) |+ a7 Z; q2 |- U - .Startup
" O3 x3 o7 n3 K3 G! h( Q6 D - call Set4gb
7 R% H+ j/ ^2 F/ e8 S& K - ;
/ ^( F: b/ P) M4 c( w" F - ; fs, gs即能访问4GB空间
- `2 A" J" f' s; j7 { - ; write your code in here.
3 j5 o. e: v) s% o, N0 F+ j [# K - ;4 |5 K8 b# r+ f
- .exit
0 q% ~, q# ~+ j$ B& e$ M2 X. ]& b -
2 G4 |$ Z4 _) F! k/ ? - Set4gb PROC NEAR- R" N( \1 A% y4 H
- in al, 92h
9 U# h3 }6 w% v% n - or al, 0026 e1 }4 h9 V! p! P
- out 092h, al# Z2 S6 @1 V$ \: k& C' i: Z
- out 0edh, al
3 |$ X4 `, U- N3 H' Z1 C$ n
) h3 f% S5 ]. |) C( B9 T3 f) a- cli
' c2 l" R( u( d2 Y) f4 t7 \+ b
, V [, X1 }9 |- e, O. r+ G- ]- ; mov word ptr GDT_Addr, (2*8-1);& }; w4 K9 w0 U+ c4 c" [% Q5 t
- 0 g& l# X7 y7 n& m; D. c
- mov eax, ds# N( y* o0 V6 F' k; X
- shl eax, 4
2 Y0 ^3 M" C+ M5 i" q! V9 Z - xor ebx, ebx
% E8 z2 P. H- }1 k - mov bx, offset GDT_def
5 z6 T; z" P' G4 I H - add eax, ebx
) O( A8 R! z# @. m3 F! U. p- Y0 Y - mov dword ptr GDT_Addr.Base, eax( P: x2 S; c% t+ a8 @8 Q# s0 z
- lgdt fword ptr GDT_Addr
]! e6 U* n% S0 m+ ^5 S
, [, R5 O% k; h- mov bx, 8
. ]8 S& K! Q, e$ [: ~4 t8 r5 [" h5 | - mov eax, cr0
, D: R0 i) p1 {- m$ z - or al, 1' H6 W2 S2 }2 d2 V' f2 C
- mov cr0, eax
( w' @; _7 [1 `4 T
! k+ d$ k. Y- Z( |2 G2 E: W) x9 s- jmp pMod
6 c1 @- U3 D( C! A$ X8 ~ - pMod:
! m1 ~ ], g: o& z - & h6 M' I& x6 S8 z
- mov fs, bx
& C7 H- C! q$ _" h - mov gs, bx% F C5 {) O: A! k
- and al, 0FEh
$ E' } e4 b+ a$ k1 Z6 X7 o( B - mov cr0, eax
0 {" K) K+ p5 ~ ? -
8 {% t9 F1 a! v k7 A+ b - jmp rMod
2 ^8 d% ]! o: x4 Y5 E }3 C& g/ y - rMod:( h, ^. k3 t1 d. O
; ?' h% N: g! y/ v5 P' a; J3 y- mov ax, 0
2 ~8 L7 ~7 [9 C. f - mov fs, ax/ C. p6 U/ ]0 _; m- c* j
- mov gs, ax
" l! b- e. o" Z: z+ D1 Y -
, j: B' k6 \1 j# `3 @! y - ; 在2M的位置测试写一下数据
7 l- q. X* p u8 n - mov esi, 200000h2 x# [7 O" g# e! y
- mov dword ptr fs:[esi], 055aa55aah
5 ]9 U# l' }/ }. A$ Z& \ - ; 用RU去看看200000h的位置是否是此数据...., p& Q5 a9 Z% r7 Q H1 b
- ! p1 v) o% B" I
- sti5 G1 i" M3 s9 O. y. b5 j0 U" N
- ret8 t0 r- w# T- E
- Set4gb ENDP
4 y8 Y1 S* m" R, o! K - # e2 P% G# H. i; Q0 [. j7 X
- CSEG ENDS ;代码段定义结束
4 E2 h( Z+ J6 f) W4 L6 ^ - end
复制代码 |
|