Giáo trình C - Chương 5: Truy cập trực tiếp bộ nhớ

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)

pdf2 trang | Chuyên mục: C/C++ | Chia sẻ: dkS00TYs | Lượt xem: 2279 | Lượt tải: 0download
Tóm tắt nội dung Giáo trình C - Chương 5: Truy cập trực tiếp bộ nhớ, để xem tài liệu hoàn chỉnh bạn click vào nút "TẢI VỀ" ở 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; 

File đính kèm:

  • pdfGiao_Trinh_C_Chuong5.pdf