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; 
            
        
        
    
                    