Giáo trình Lập trình C_Chương 5: Truy cập trực tiếp bộ nhớ
Nội dung: - Bài 1: Các hàm truy cập theo địa chỉ phân đoạn - Bài 2: Đổi từ địa chỉ phân đoạn sang địa chỉ thực
Bạn đang xem nội dung tài liệu Giáo trình Lập trình C_Chương 5: Truy cập trực tiếp bộ nhớ, để tải tài liệu về máy bạn click vào nút DOWNLOAD ở trên
58
Ch−¬ng 5 : truy cËp trùc tiÕp bé nhí
§1.C¸c hµm truy cËp theo ®Þa chØ ph©n ®o¹n
1. Hµm pokeb() : Dïng ®Ó göi mét kÝ tù value vµo bé nhí t¹i ®Þa chØ ph©n ®o¹n off .
Nguyªn mÉu cña hµm trong dos.h lµ :
void pokeb(unsigned seg,unsigned off , char value)
2. Hµm peekb() : NhËn mét byte t¹i ®Þa chØ seg:off . Nguyªn mÉu cña hµm trong dos.h lµ :
char peekb(unsigned seg,unsigned off)
3. Hµm poke() : Göi mét sè nguyªn value vµo bé nhí t¹i ®Þa chØ seg:off . Nguyªn mÉu cña
hµm trong dos.h lµ :
void poke(unsigned seg,unsigned off , int value)
4. Hµm peek() : NhËn mét word t¹i ®Þa chØ seg:off . Nguyªn mÉu cña hµm trong dos.h lµ :
void peek(unsigned seg,unsigned off )
5. Hµm movedata() : Sao n byte tõ ®Þa chØ seg_gui:off_gui ®Õn ®Þa chØ seg_nhan:off_nhan .
Nguyªn mÉu cña hµm trong menu.h lµ :
void movedata(unsigned seg_gui,unsigned off_gui , unsigned seg_nhan,unsigned
off_nhan , int n)
§2. §æi tõ ®Þa chØ ph©n ®o¹n sang ®Þa chØ thùc
1. §æi tõ ®Þa chØ thùc : §Ó ®æi tõ ®Þa chØ thùc sang ®Þa chØ ph©n ®o¹n ta dïng macro sau :
unsigned FP_SEG(®Þa chØ thùc)
unsigned FP_OFF(®Þa chØ thùc)
2. §æi tõ ®Þa chØ ph©n ®o¹n : §Ó ®æi tõ ®Þa chØ ph©n ®o¹n sang ®Þa chØ thùc ta dïng macro :
void far *MK_FP(seg:off)
VÝ dô : Sau khi thùc hiÖn c¸c c©u lÖnh:
char buf[100]
unsigned ds,dx;
ds= FP_SEG(buf)
dx= FP_OFF(buf)
th× ds:dx chøa ®Þa chØ cña n¶mg buf .
Sau khi thùc hiÖn c©u lÖnh :
char *pchar;
pchar = (char *) MK_FP(0xb800:0)
th× pchar trá tíi ®Çu bé nhí mµn h×nh . Khi ®ã ta cã thÓ dïng c¸c lÖnh g¸n ®Ó truy cËp trùc
tiÕp tíi bé nhí mµn h×nh .
Ch−¬ng tr×nh 5-1 : LËp ch−¬ng tr×nh x¸c ®Þnh ®Þa chØ cña mét ng¾t .
#include
#include
#include
void main()
{
unsigned char far *p;
int n,k;
unsigned seg,off;
clrscr();
p=(unsigned char far*)MK_FP(0,0);
59
while(1)
{
printf("\nSo hieu ngat(Bam 0 de ket thuc): ");
scanf("%d",&n);
if (n==0)
break;
k=(n-1)*4;
off=p[k]+256*p[k+1];
seg=p[k+2]+256*p[k+3];
printf("\nDia chi cua ngat %x : %x",seg,off);
}
}
Sè hiÖu cña ng¾t ®−îc ®¸nh sè tõ 0 nh−ng n ®−îc nhËp tõ 1 , mçi ng¾t chiÕm 4 byte
nªn ta cã
k=(n-1)*4;