intTypePromotion=1
zunia.vn Tuyển sinh 2024 dành cho Gen-Z zunia.vn zunia.vn
ADSENSE

Kỹ thuật lập trình - chương 9

Chia sẻ: Le Hai | Ngày: | Loại File: DOC | Số trang:7

88
lượt xem
6
download
 
  Download Vui lòng tải xuống để xem tài liệu đầy đủ

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...

Chủ đề:
Lưu

Nội dung Text: Kỹ thuật lập trình - chương 9

  1. CHƯƠNG 9 int peek(unsigned seg, unsigned off); TRUY NHẬP TRỰC TIẾP VÀO BỘ NHỚ + 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. Trong chương này trình bầy các vấn đề: + Nguyên mẫu trong mem.h như sau: + Hai kiểu địa chỉ: Địa chỉ phân đoạn và địa chỉ thực void movedata(unsigned seg_gui, unsigned off_gui, + Truy nhập tới địa chỉ phân đoạn unsigned seg_nhan, unsigned off_nhan, int n); + Đổi từ địa chỉ phân đoạn sang địa chỉ thực + Công dụng: Sao n byte từ seg_gui:off_gui đến + Bộ nhớ màn hình, truy nhập trực tiếp vào bộ nhớ màn hình seg_nhan:off_nhan + 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 § 2. BỘ NHỚ MÀN HÌNH VĂN BẢN § 1. CÁC HÀM TRUY NHẬP THEO ĐỊA CHỈ PHÂN ĐOẠN 2.1. Cách biểu diễn ký tự trong bộ nhớ màn hình Bộ nhớ màn hình văn bản bắt đầu từ địa chỉ : 1. Hàm pokeb: Gửi một ký tự vào bộ nhớ. (0xb800:0x0000) + Nguyên mẫu trong dos.h như sau: Khi đưa một ký tự vào vùng nhớ màn hình, thì nó sẽ hi ện lên void pokeb(unsigned seg, unsigned off, char value); màn hình. Mỗi ký tự trên màn hình chiếm 2 byte trong bộ nhớ màn + Công dụng: Gửi giá trị ký tự value vào bộ nhớ tại địa chỉ phân hình: byte đầu chứa mã ASCII, byte thứ hai biểu diễn mầu hiển thị đoạn seg:off gọi là byte thuộc tính. Các bit của byte thuộc tính: 2. Hàm peekb: Nhận một ký tự từ bộ nhớ. B7B6B5B4B3B2B1B0 + Nguyên mẫu trong dos.h như sau: được chia làm 3 nhóm: char peekb(unsigned seg, unsigned off); + Nhóm 1 gồm bit B7 biểu thị sự nhấp nháy. Nếu B7=0 thì ký tự không nhấp nháy, nếu B7=1 thì ký tự sẽ nhấp nháy. + Công dụng: Nhận một byte tại địa chỉ phân đoạn seg:off + Nhóm 2 gồm các bit B6, B5 và B4. Các bit này chứa được m ột 3. Hàm poke: Gửi một số nguyên vào bộ nhớ. số nguyên từ 0 đến 7 và biểu thị 8 mầu nền của ký tự. + Nguyên mẫu trong dos.h như sau: + Nhóm 3 gồm các bit B3, B2, B1 và B0. Các bit này ch ứa đ ược void poke(unsigned seg, unsigned off, int value); một số nguyên từ 0 đến 15 và biểu thị 16 mầu của ký tự. + Công dụng: Gửi giá trị nguyên value vào bộ nhớ tại đ ịa ch ỉ 2.2. Trang màn hình 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: 491 492
  2. Mỗi trang màn hình gồm 80x25 ký tự, do đó c ần 80x25x2=4000 //Mặc định hiển thị trang 0 byte bộ nhớ. Thực tế mỗi trang màn hình được phân bố 4096 = for (int i=0;i
  3. Ví dụ 1. Sau khi thực hiện các câu lệnh: 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 char buf[100]; unsigned ds,dx; */ ds = FP_SEG(buf); dx = FP_OFF(buf); #include "dos.h" thì ds:dx chứa địa chỉ của mảng buf. #include "conio.h" Ví dụ 2. Sau khi thực hiện các câu lệnh: void duarmh(char *day, int dong,I nt cotd, int cotc,I nt m_nen, int m_chu); char far *pchar; 495 496 void cuaso(int dongt,int cott,int dongd,int cotd,int maucs); pchar = (char far*)MK_FP(0xb800:0); main() thì pchar trỏ tới địa chỉ đầu của bộ nhớ màn hình. Khi đó ta có thể sử dụng các lệnh gán để truy nhập trực tiếp tới bộ nhớ màn hình. { cuaso(26,1,50,80,BLUE); § 4. CÁC VÍ DỤ MINH HOẠ duarmh("Chuc mung nam moi", 28, 30, 50, MAGENTA, WHITE); Chương trình 1. Chương trình minh hoạ cách truy nhập trực cuaso(30,20,46,60,RED); tiếp vào bộ nhớ màn hình có địa chỉ đầu là 0xB800:0. Chương duarmh("Chuc mung nam moi", 40, 30, 50, MAGENTA, trình gồm hàm main() và hai hàm sau: YELLOW); 1. Hàm cuaso getch(); 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à void cuaso(int dongt,int cott,int dongd,int cotd,int maucs) 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. /* Dung dia phan doan */ 2. Hàm duarmh { void duarmh(char *day, int dong, int cotd, int cotc,int m_nen, int i, j, p, t, dt, dd, mau; int m_chu); union REGS v, r; sẽ đưa ra màn hình một dẫy ký tự (chứa trong dãy) tại dòng dong, /* Xac dinh thuoc tinh mau */ từ cột cotd đến cotc. Mầu nền cho bởi m_nen, mầu chữ cho bởi mau = (maucs
  4. trong trang t buf=(char far*)MK_FP(0xb800,0); */ /* Xac dinh thuoc tinh mau */ t=(dongt-1)/25; mau = (m_nen
  5. Xac dinh dia chi cac thu tuc ngat */ #include #include "dos.h" #include #include "conio.h" #include "stdio.h" typedef void far (*HAM)(void); main() void khoi_dong_may(void) { { unsigned char far *p; /*p se tro toi bang vecto ngat*/ HAM f; int n; /* n - so hieu ngat, n=1,2,... */ f = (HAM)MK_FP(0xFFFF,0); int k; /* vi tri cua ngat n trong bang vecto ngat */ f(); unsigned seg,off; } /* p tro toi bang vecto ngat */ char mat_khau[]= {'A','B','C','D'}; p=(unsigned char far*)MK_FP(0,0); int n = sizeof(mat_khau)/sizeof(char); 499 500 clrscr(); void main() while(1) { { char i, ch, sai_mat_khau; printf("\n So hieu ngat (Bam 0 - Ket thuc): "); clrscr(); scanf("%d",&n); if(n==0) break; i=0; k=(n-1)*4; sai_mat_khau=0; off=p[k]+256*p[k+1]; seg=p[k+2]+256*p[k+3]; cout
  6. } #define VT 132 // vi tri thong bao //Dia chi vung nho man hinh else char far *p_mh = (char far*)MK_FP(0xB800,0) ; sai_mat_khau=1; //Dia chi 4 byte chua thoi gian ++i ; unsigned long far *t_time=(unsigned long } far*)MK_FP(0,0x46C); if (sai_mat_khau) char buf_time[]={'T',47,'I',47,'M',47,'E',47,':', 47, 32, 47, 32, 47, { 32, 47, 32, 47, 32, 47, 32, 47, 32, 47, 32, 47, 32, 47}; cout
  7. for (i=0; i
ADSENSE

CÓ THỂ BẠN MUỐN DOWNLOAD

 

Đồng bộ tài khoản
2=>2