C++ và lập trình hướng đối tượng - Chương 9 - Pdf 91

chơng 9
Truy nhập trực tiếp vào bộ nhớ
Trong chơng này trình bầy các vấn đề:
+ Hai kiểu địa chỉ: Địa chỉ phân đoạn và địa chỉ thực
+ Truy nhập tới địa chỉ phân đoạn
+ Đổi từ địa chỉ phân đoạn sang địa chỉ thực
+ Bộ nhớ màn hình, truy nhập trực tiếp vào bộ nhớ màn hình
+ Dùng con trỏ để lấy dữ liệu từ bộ nhớ phân đoạn
+ Dùng con trỏ hàm để thực hiện các thủ tục của DOS
Đ
1. Các hàm truy nhập theo địa chỉ phân đoạn
1. Hàm pokeb: Gửi một ký tự vào bộ nhớ.
+ Nguyên mẫu trong dos.h nh sau:
void pokeb(unsigned seg, unsigned off, char value);
+ Công dụng: Gửi giá trị ký tự value vào bộ nhớ tại địa chỉ phân
đoạn seg:off
2. Hàm peekb: Nhận một ký tự từ bộ nhớ.
+ Nguyên mẫu trong dos.h nh sau:
char peekb(unsigned seg, unsigned off);
+ Công dụng: Nhận một byte tại địa chỉ phân đoạn seg:off
3. Hàm poke: Gửi một số nguyên vào bộ nhớ.
+ Nguyên mẫu trong dos.h nh sau:
void poke(unsigned seg, unsigned off, int value);
+ Công dụng: Gửi giá trị nguyên value vào bộ nhớ tại địa chỉ phân
đoạn seg:off
4. Hàm peek: Nhận một số nguyên từ bộ nhớ.
+ Nguyên mẫu trong dos.h nh sau:
int peek(unsigned seg, unsigned off);
+ Công dụng: Nhận một word tại địa chỉ phân đoạn seg:off
5. Hàm movedata: Sao các byte.
+ Nguyên mẫu trong mem.h nh sau:

2.3. Chọn trang hiển thị
Tại mỗi thời điểm chỉ có thể hiển thị đợc một trong 4 trang màn
hình. Để hiển thị trang màn hình thứ t (t=0,1,2,3) chúng ta sử dụng
chức năng 5 của ngắt 0x10 theo mẫu sau:
union REGS v,r;
v.h.ah = 5 ; // Chức năng 5
v.h.al = t ; // Số hiệu trang màn hình cần hiển thị
int86(0x10, &v, &r); // Thực hiện ngắt 0x10
2.4. Ví dụ minh hoạ
Ví dụ sau dùng hàm pokeb để đa các ký tự vào các trang của bộ
nhớ màn hình, sau đó dùng chức năng 5 của ngắt 0x10 để chọn trang
hiển thị.
//CT9_03.CPP
#include <dos.h>
#include <conio.h>
char d1[]={'C',1*16+14,'H',1*16+14,'U',1*16+14,'C',1*16+14};
char d2[]={'M',2*16+15,'U',2*16+15,'N',2*16+15,'G',2*16+15};
void main()
{
union REGS v,r;
clrscr();
//Mặc định hiển thị trang 0
for (int i=0;i<8;++i)
pokeb(0xb800,i,d1[i]);
getch();
//Hien thi trang 1
v.h.ah = 5 ; v.h.al = 1 ;
int86(0x10,&v,&r);
for (i=0;i<8;++i)
pokeb(0xb800,0x1000+i,d2[i]);

Đ
4. các ví dụ minh hoạ
Chơng trình 1. Chơng trình minh hoạ cách truy nhập trực tiếp
vào bộ nhớ màn hình có địa chỉ đầu là 0xB800:0. Chơng trình gồm
hàm main() và hai hàm sau:
1. Hàm cuaso
void cuaso(int dongt,int cott,int dongd,int cotd,int maucs);
thiết lập một cửa sổ mầu có toạ độ góc trên-trái là (dongt, cott) và
góc dới-phải là (dongd,cotd). Mầu cho bởi tham số maucs. ở đây sử
dụng hàm pokeb và địa chỉ phân đoạn.
2. Hàm duarmh
void duarmh(char *day, int dong, int cotd, int cotc,int m_nen,
int m_chu);
sẽ đa ra màn hình một dẫy ký tự (chứa trong dãy) tại dòng dong, từ
cột cotd đến cotc. Mầu nền cho bởi m_nen, mầu chữ cho bởi m_chữ.
ở đây sử dụng toán tử gán trên địa chỉ thực.
Trong hàm main() sẽ sử dụng các hàm cuaso và duarmh để tạo hai
cửa sổ và viết hai dòng chữ trên trang màn hình thứ hai (từ dòng 26
đến dòng 50).
/*
chơng trình minh hoạ cách truy nhập trực tiếp vào bộ
nhớ của màn hình
*/
#include "dos.h"
#include "conio.h"
void duarmh(char *day, int dong,I nt cotd, int cotc,I nt m_nen, int
m_chu);
void cuaso(int dongt,int cott,int dongd,int cotd,int maucs);
main()
{

{
p=t*4096+i*160+(cott-1)*2;
for (j=0;j<=cotd-cott;++j)
{
pokeb(0xb800,p+2*j,32);
pokeb(0xb800,p+2*j+1,mau);
}
}
}
void duarmh(char *day, int dong, int cotd, int cotc, int m_nen,
int m_chu)
/* Dung dia chi thuc */
{
int i,p,t,d,kt,mau;
char far *buf;
union REGS v,r;
/* Lay dia chi thuc cua bo nho man hinh */
buf=(char far*)MK_FP(0xb800,0);
/* Xac dinh thuoc tinh mau */
mau = (m_nen << 4)+m_chu;
/*
Xac dinh trang man hinh t
va cac chi so dong d trong trang t
*/
t=(dong-1)/25; d=dong-1-t*25;
/* Chon t la trang hien thi */
v.h.ah=5;v.h.al=t; int86(0x10,&v,&r);
p=t*4096+d*160+(cotd-1)*2;
/*
Dua cac ky tu va thuoc tinh mau

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 %x:%x",seg,off);
}
}
Chơng trình 3. Chơng trình minh hoạ cách dùng con trỏ hàm để
thực hiện thủ tục khởi động lại máy của DOS, biết địa chỉ đầu của
thủ tục này là 0xFFFF:0000 . Chơng trình yêu cầu nhập mật khẩu.
Nếu chọn đúng (bấm ABCD và Enter) thì chơng trình tiếp tục làm
việc, nếu vào sai thì sẽ khởi động lại máy.
#include <dos.h>
#include <conio.h>
#include <iostream.h>
#include <ctype.h>
typedef void far (*HAM)(void);
void khoi_dong_may(void)
{
HAM f;
f = (HAM)MK_FP(0xFFFF,0);
f();
}
char mat_khau[]= {'A','B','C','D'};
int n = sizeof(mat_khau)/sizeof(char);
void main()
{
char i, ch, sai_mat_khau;
clrscr();
i=0;
sai_mat_khau=0;


Nhờ tải bản gốc

Tài liệu, ebook tham khảo khác

Music ♫

Copyright: Tài liệu đại học © DMCA.com Protection Status