|
|
刚学习的同学,有些还不会,我这里贴点C和asm的代码。只供参考。- _' y; |/ K9 ?
9 q/ _+ W9 `/ D) F, X2 v. |% d这是C的- /********************************************************************
2 C! O# @ f* w2 H, ?. R - * File: DOS4G.H *
3 D1 }0 M; u; t# J2 V @& _7 p - * Compile with BC 3.1 ( Editor: Tab size = 4 ) *+ L- q( q. L( `( P: S+ l: f
- * *$ V2 b5 p A% q" r$ z* }7 q
- * ========================Title=============================== *
+ Z. y' \6 [0 q- [. ?1 H - * 这个函数是让系统进入DOS 4G模式 *
; |8 Z6 M. G( a! Y; z" f* u - * 程序参考了:陈家琪《DOS实方式下直接访问4GB》 *' y x9 T0 t) r" X4 }/ M3 i7 e
- * *
# [( D4 P3 F/ X3 B3 d+ y - * 使用: openA20(); set4gb(); *3 i+ a( \9 G+ d8 K
- * *% [. U" X) ], N7 Y# a
- * ===========================History========================== *5 Y/ `) e z7 @( b! S: _' w+ V- Z
- * author: bini *
, j! I* k: R* Y( v$ |4 t% P - * date: 2004-11-30 Frist version. *
( f9 G) ?, u+ t( o - ********************************************************************/: D# m6 n1 s* N" w+ h( h
- 8 ]8 h V6 z( I9 I$ F. ~, }5 }) m
- #include <conio.h>
4 i' a/ m9 q; M% U$ Z S - #pragma inline
- W( k9 w1 n) Q7 D - & B k1 x, S* Q
- /***********************************************6 ]# U6 ?' D4 L. d- g
- * 两个GDT,第一个为系统使用,不管,默认为0 *) }# M2 j( V4 e
- * 第二个为一个数据段,没有代码段。 *
# D4 p5 {5 z8 }$ x - ***********************************************/& X( q% g. h* p
- unsigned long GDT_def[ ]={0,0, /*系统使用*/
; w# d7 t+ s0 H; Q2 v( g; f - 0x0000FFFF, /* hi16bit( 0~15 ) is base low=0, 8 G% h# s/ J! i/ I7 G
- low16bit( 0~15 ) is limit low=0xFFFF
$ w1 B3 I. B, M9 S& y- ^- ^ - */# E; X" g# @: Z- H/ t; M) K" k
- 0x008F9200};/* 最低字节为 base( bit 16~23 )7 o) E! J* K2 n' Z) A9 G
- 最高字节为 base( bit 24~31 )% t g' w) H; l4 X$ v) j9 P
- - s! i+ g; n' Q9 w$ ?! o" q
- 属性Attrib = 0x8F92
0 }' X; z* g7 @: ?/ T -
# S3 B. Y2 A1 n, G - 属性位Hibyte低四位为
' ^6 ?" Y0 Z8 x2 K: _ - Limit( 16~19 )=F
. f8 i6 }. D4 c3 z" F) l - 属性位Hibyte bit7 为粒度3 d8 p4 Q$ n/ g8 @4 d9 d8 K
- (值1=4KB粒度)
8 \ r+ l' m3 ^+ V: d, G# Z1 E3 Z - 8F & 0x80 = 16 O% i3 ?8 U( m% d0 V6 _- _4 G
- : e. l3 j$ G% I+ z: P
- 属性位Lowbyte低四位为段类型,值=2+ t2 ^/ |% e% w6 h3 b& q2 I' b0 h
- 表示为可读/写段
; [# [, o" S( ?2 k: [ - 属性位Hibyte高四位=9,bit3=1表示:! U( s7 R- |# N& U
- 描述符对地址转换是有效的。
& i+ [6 p# f3 _) W- A0 Q5 R- K - bit0=1表示为:
: ?, t# `- D+ m @ - 系统段描述符。而不是门描述符。! x- n2 R" z8 E4 H3 b d8 c
-
. D! z0 U c! b' d' E T+ [- a - */
2 j! z* P, \- L. e# H8 H, o
/ `3 p2 h% M, M. r! |/ j- /****************************************
2 P9 E* ^' d1 d& J6 i, d - * GDTR寄存器, 48bit=6bytes *9 t& @% B4 |" H% X7 F
- * +-------------------------------+ *- i7 I0 R" p8 l, o: G
- * | 32bit基地址 |16bit界限| *
/ N" P# e2 h1 n - * +-------------------------------+ *
1 z- Q0 ^5 y/ f2 z - ****************************************/
/ X; l, z9 A0 m3 O! ?/ t - unsigned char GDT_Addr[6]={0};
' g4 L! b+ P3 y. {" p) p
( P+ y' K) h. O ?; |0 a- /****************0 ~; f" {5 D5 Q) G' r9 w/ A
- * 打开A20门 *
2 ~0 i1 V# I' e1 k - ****************/
) ^8 ]- L; Y4 T0 l# d - void openA20(void)
3 w) \& i5 M/ U- C" j1 N& R& D5 J4 L - {2 q& C/ i) {* T. I5 G
- asm{
+ C, h9 F" B* I2 r! E# Q& J - pusha
" K. E! X- y' n) d - in al, 92H
2 u( k; S& L5 ~3 `3 C - or al, 0x024 T$ P6 d" j0 ]# N' {, y9 S- `
- out 0x92, al
1 Z; @( L( r) u( i( m7 e0 n - out 0xed, al) e j6 T! {3 @: h
- popa
- i5 {; O# U& p% J& {5 _! D0 T3 { - }
! X8 E4 Y8 w9 I1 G - }) A/ K. O( F& }. k9 b. d
0 \* ~* t2 I$ l ?2 P9 g+ l9 `/ ^1 v- /***********************************************
3 K. E! U( E/ I% f( V: x* a- ^ - * 函数功能:进入DOS4G *4 g; e& F' m3 o
- * ==================== *
2 D& ~/ D% L6 t# _$ M - * *
6 |$ D# O' E4 O! A4 ^3 U/ l; E% ~ - * GDT描述符界限计算方式:描述符个数*8-1 *
% Q$ q u3 C, C/ S( [2 b& A. p - * 如: *6 T+ L/ E# m! r8 U! M1 Y! \# Z, e
- * mov word ptr GDT_Addr[0], (2*8-1); *
2 P: l8 ~# l3 g; N. j - * 表示为 2个GTD *! w5 }9 ~" e1 z9 I/ X# N1 N+ c
- * *; w9 t* u) t) q% n, z: n4 k% C
- * 选择子为所在描述符内的字节偏移。 *" t( w* K& C% o6 A& f
- * *
* n+ C" [+ `" y! v7 U7 l. Z - ***********************************************/
# M& t( J, [7 {2 z: [* V - void set4gb(void)0 D1 g1 o. t1 Q0 o0 G( h) i' [9 q
- {
: n' Z6 h9 }& H - asm{
5 K. x8 c: I% n. I - cli
( r- \5 U( M; y a8 o7 F - /****************************************1 c+ f; f) D( X
- * GDTR寄存器 *
0 k8 |. Z# M; R D" X - * +-------------------------------+ *2 Y& g6 k- R R1 {/ O7 }
- * | 32bit基地址 |16bit界限| *
+ w' ^5 V+ F7 Y$ z* F; A. [ - * +-------------------------------+ *
2 c q! g- K9 U0 e9 X: { - *****************************************/6 g4 N6 K; y. x7 W6 O) M
- /*********************
0 ^9 H6 A, w0 Q2 K( H - * 得出段界限 *6 N+ \* v! P& r& Y3 l+ s' D
- *********************/3 k) t% _& d3 \* R
- mov word ptr GDT_Addr[0], (2*8-1);! z9 Z% ?$ j) O4 O% I& g
- /******************************************** g$ j# Q9 @) q: z
- * 计算GDT表的32位基地址,存入GDTR *
6 b1 g6 @/ h( H6 Q3 P& J - ********************************************/& c& u; k+ g9 d; t2 @" s3 Q
- mov eax, ds
& C& [' d! b- E0 X - shl eax, 44 O+ M( c: }& l4 }
- xor ebx, ebx
6 C+ W1 P. Z$ f% w/ X - mov bx, offset GDT_def
9 L. D, v3 r4 f, C - add eax, ebx4 m$ k! l/ U' s# Q
- mov dword ptr GDT_Addr[2], eax
9 Z. I' d- c6 ^/ T: u, v - lgdt fword ptr GDT_Addr( z4 s. H. w2 d( j, V6 W" ?
- /********************
; n; y4 L7 ^6 M8 {, O; @2 X - * 选择子偏移 *
' c& `/ J( G. Y0 b$ y+ N - ********************/- O6 |" V7 W: `6 Z9 Y
- mov bx, 8
( O# I( ]9 `+ |, V) J - mov eax, cr04 s4 A3 v, R; Z2 x* Y
- or al, 1& w6 D3 W- [4 n6 |, @
- /**********************
4 r/ \" G+ Z+ y$ I1 ]- J! e - * 进入保护模式 *+ g1 V ]% M. z0 d
- **********************/6 Q4 Z; A( Y3 a8 C2 X E
- mov cr0, eax
/ o) G' z1 g+ l5 Q - jmp pMod; M0 p4 P8 M" O3 m y$ z$ X
- }
; u) z2 M; w5 {0 B% @ ]6 W
9 P# E: ?6 w }' g- pMod: asm{ J z: l" ~! u3 J, X O
- /************************************************************3 K& S% N: f9 w
- * 让fs与gs加载选择子,使其能访问 0xFFFFF * 4K (4GB) 空间 *
+ i7 T) [* y. @' Z - ************************************************************/# }4 Z8 e8 D0 ]. I1 t1 e- x4 q
- mov fs, bx
/ z& B9 a' w" S# [- e6 u - mov gs, bx6 U# x3 X* L: l7 w
- and al, 0x0FE
' v2 ^$ \/ B. T2 F) N9 x7 o - /******************) F6 ?; A" N9 S
- * 进入实模式 *7 j/ Z; e% L. u% N# B% x
- ******************/+ D, r* ]8 y. b9 h
- mov cr0, eax
! w5 F0 v: k% K: f" _' r% C1 I - jmp rMod
9 c+ A) ~+ W3 w0 l+ o! Q' V" n3 J - }, F1 a$ ~- K) E2 V3 O$ f8 p
# r1 X% ?0 {+ L+ ^% C- rMod: asm{# a# \1 d8 k+ o6 V
- /* ******************************************************************
; R5 E7 d. x: F9 c- Q) @8 a - * 退出,fs、gs清0,访问系统内存可用: gs[32位,相对于0的偏移地址] */ U3 |$ d3 k$ z6 o. v1 @
- ********************************************************************/3 e8 m; T5 y( f; b# p' [
- mov ax, 0+ |/ E% |* A2 m8 X8 W4 L
- mov fs, ax! ]6 V( L) `) L' z% U: `2 c
- mov gs, ax
3 ?* Q; \2 i/ z" ` G - sti
- k' ^0 E8 v) W/ j; y" E - }- ]9 n% K/ b, l; ?( f6 c$ b# K# i
- }
复制代码 这是asm的- ;/********************************************************************" d: L1 _! b- q8 E3 |3 ], U
- ;* File: DOS4G.asm *
/ O9 q: l0 x/ C+ c: y' @! Q' J - ;* Compile with masm ( Editor: Tab size = 4 ) *
; T( i, Y1 E0 C3 k - ;* *
6 \, p& Q! u* Y. X - ;* ========================Title=============================== *- F4 m( h% O4 Y8 x& @& h# S! u; S$ @
- ;* 这个demo是让系统进入DOS 4G模式,进行数据访问 *6 |$ z; \' m! P
- ;* *
+ s8 {) q& ?3 a% V! y - ;* ===========================History========================== *% R l4 X3 _* k* D! L' y. K+ g
- ;* author: bini *; j: g6 \# Y% o* g: N, z/ |+ f
- ;* date: 2008-10-08 Frist version. *) A& k, e# k' Y7 n. \( z
- ;********************************************************************/
: Y% U. u) `( d7 W/ i: s - .model small
" \" \/ h) L5 d, P& W - .586p+ w: f, Q0 _# x7 f) x: K5 I
-
7 U7 P7 n2 t6 V- C( t/ {" ]7 p - DSEG SEGMENT USE16 ;16位数据段
) }9 }, c6 _" G
9 l$ F f+ H$ `+ h- @ `$ Y. C& V- DESC STRUC
, w# e+ E' Z7 S2 ~9 D - LimitL DW 0 ;段界限(BIT0-15)
- x3 h: c/ p1 l - BaseL DW 0 ;段基地址(BIT0-15)
! g& \: m; Q0 X! H. h% J4 K! Z - BaseM DB 0 ;段基地址(BIT16-23)2 g- k6 W" L5 x' F/ g7 m# X
- Attributes DB 0 ;段属性: Y4 ~% m U2 ^1 E
- LimitH DB 0 ;段界限(BIT16-19)(含段属性的高4位)* u& s# S1 i$ \2 v9 M! S' z
- BaseH DB 0 ;段基地址(BIT24-31). j8 d% D S' b
- DESC ENDS( U) i- v6 @5 q( A1 X% {: p
; o" v- w7 `, f( q- PDesc STRUC3 {9 l, i2 r* I* |
- Limit DW 0 ;16位界限6 M+ F; ~7 s ^3 B
- Base DD 0 ;32位基地址
! U8 H# p- x c- i# n4 ~/ H - PDesc ENDS
4 p1 m% D9 G- C( p6 H7 _ - * N+ ~; k$ R$ V3 ~2 E& q
- GDT_def Label Fword
2 @1 S. m3 c4 V3 k; K% C - Null_Desc DESC < 0h, 0h, 00h, 00h, 000h, 0>1 p6 g% ^9 U1 @9 z
- Data_Desc DESC < 0FFFFh, 0h, 00h, 92h, 08Fh, 0>
5 @9 j7 Z# u: T( `9 g
, M( k; I8 h4 r9 R6 x- GDT_Addr PDesc <$-GDT_def-1, >
; j! e& T0 ?4 t9 V( s: k - DSEG ENDS ;数据段定义结束
4 X( v3 e( z# V& B, N; _ - , P! X9 {$ A3 D2 P4 O, {4 p3 j! L7 {
- CSEG SEGMENT USE16 ;16位代码段4 K; H5 _" z8 v, r: s
- ASSUME CS:CSEG,DS:DSEG
5 a4 f- }, T# C$ Y3 s - .Startup
+ [- g/ |1 F2 P9 Y8 O8 O. k4 j( ?) K - call Set4gb( F, u( p; E0 H- Z" i
- ;
% B2 Z: L2 k+ C& \0 x( Y* e! v: z& V - ; fs, gs即能访问4GB空间7 y- Y8 s' b' \! K# ]; |" X& W4 M
- ; write your code in here.
7 K W- L; C2 A' a - ;4 |- T: o: _6 P/ P( M0 u+ | h
- .exit
7 \8 z. C6 k3 y# L4 e - _" ~, j9 E! M
- Set4gb PROC NEAR
) F6 F. R" w/ I8 Y9 @! _# k - in al, 92h: D/ {/ \) D* D5 \6 t8 W5 u
- or al, 002. m' e: d0 C, {( C! E
- out 092h, al
) o, J) X0 B0 ]2 E - out 0edh, al
* r0 R/ {2 z+ L7 u0 x& H; D# x n* r$ h
" f! Z1 f0 j" X W2 r7 `- cli
+ V8 [- n' A1 Y2 Q - & Y9 n/ ]. E, G
- ; mov word ptr GDT_Addr, (2*8-1);8 g' Y% \* j) C" C
$ d& W# Y0 K, y+ B3 v8 z- mov eax, ds
8 h/ A' p. T& I- H - shl eax, 4# Z+ X3 B2 g5 k- P4 Y6 F
- xor ebx, ebx
) U4 B4 o5 C- E. S2 l - mov bx, offset GDT_def
! \5 Y6 k5 X. K+ Q. S" v$ `4 ? - add eax, ebx
: }, S8 W$ P3 y; J% W - mov dword ptr GDT_Addr.Base, eax: H4 ]" I7 ]$ c( w5 K
- lgdt fword ptr GDT_Addr9 j+ B, Q& `$ |1 W4 ?4 m8 w7 i# a9 D
- : P( b# P+ `& O* |
- mov bx, 81 @# f" v0 V/ R# ^' @1 O
- mov eax, cr07 r6 k A& Y% W6 `, W, X# e
- or al, 1
+ C& }. o! K. } |- p - mov cr0, eax O3 T) y9 C8 w I; c y. @; [; ^
) v; q5 W* l$ G' e- jmp pMod
2 G9 ~+ |1 F2 ?# `* u+ u- y! Y - pMod:
+ g1 g: I3 e! P
. v+ e5 U6 m% ]! J8 r$ Y6 b- mov fs, bx) C: ^7 h/ Z/ q+ K v K( s7 y, D9 k- @
- mov gs, bx# f4 e) |$ D: H0 f; k
- and al, 0FEh( M0 Z' \4 |6 Z6 Z7 _9 f. I- m1 q2 V
- mov cr0, eax& O; c m: @3 c* J3 e$ ~' H% P
-
5 ]- W# b) C0 w) l - jmp rMod4 Q6 ^) d! |2 N& Y6 j4 m
- rMod:
; S& c+ e" w$ F- |7 K5 O+ n+ Y
% Q) }' E0 {8 `- mov ax, 0, x; d5 a& B" T6 _' S3 }
- mov fs, ax0 J" F3 D- p9 s
- mov gs, ax0 g5 m3 P, T2 w2 R4 g4 q; k' l) U
- 2 b+ K& D( Q( C( q+ ?1 b
- ; 在2M的位置测试写一下数据
0 r% P l" [: D5 g% \" H1 h- W - mov esi, 200000h
4 n4 l. ^9 B; C - mov dword ptr fs:[esi], 055aa55aah- {8 J3 N8 z! r, o
- ; 用RU去看看200000h的位置是否是此数据....* E: X/ w9 r' e7 Q' `2 {
- s7 W" R Q% D3 k- sti1 p, f( ~# j# z7 U8 h% P4 {
- ret
8 k! ~. X! G a - Set4gb ENDP
: i6 L) e% |9 w6 g - 6 S8 s9 S: q& k0 V& y& ~, `- u X
- CSEG ENDS ;代码段定义结束
2 H: S3 O0 b5 ~. b- S1 L6 } - end
复制代码 |
|