Thứ Sáu, 14 tháng 1, 2022

5: Truy Cập Trực Tiếp Bộ Nhớ

 

5: Truy Cập Trực Tiếp Bộ Nhớ


- 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ỉ sep_ nhan:off_nhan. Nguyên mẫu của hầm trong menu.h là:
void movedata(unsigned seg gui,unsigned ofÍf gui, unsigned seg_ nhan,unsiened off nhan, Int n)

- Đổ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 đù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]
unsiened ds,dx;
ds= EP_SEGŒuf)
dx= EP_OFF(bu?)

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_ EP(Oxb§00: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.
// Address_1
#include <dos.h>
#include <conio.h>
#include <stdio.h>


int main()   {     
    unsigned char far *p;     
    int n,k;     
    unsigned seg,off;     
     
    p=(unsigned char far*)MK_FP(0,0);


    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);       
    }  
    return 0
}

0 bình luận:

Đăng nhận xét