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)
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:
Giao_Trinh_C_Chuong5.pdf

