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

Chương 9: Truy cập trực tiếp vào bộ nhớ

Chia sẻ: Phan Thi Ngoc Giau | Ngày: | Loại File: PDF | Số trang:7

71
lượt xem
11
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 § 1. Cỏc hàm truy nhập theo địa chỉ phõn đoạn 1. Hàm pokeb:...

Chủ đề:
Lưu

Nội dung Text: Chương 9: Truy cập trực tiếp vào bộ nhớ

  1. Generated by Foxit PDF Creator © Foxit Software http://www.foxitsoftware.com For evaluation only. int peek(unsigned seg, unsigned off); chương 9 T ruy 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 Mỗi trang màn hỡnh gồm 80x25 ký tự, do đú cần 80x25x2=4000 4. Hàm peek: Nhận một số nguyờn từ bộ nhớ. byte bộ nhớ. Thực tế mỗi trang màn hỡnh được phõn bố 4096 = + Nguyờn mẫu trong dos.h như sau: 0x1000 byte. Như vậy 4 trang màn hỡnh được phõn bố như sau: 491 492
  2. Generated by Foxit PDF Creator © Foxit Software http://www.foxitsoftware.com For evaluation only. getch(); + Trang màn hỡnh thứ 0 bắt đầu từ địa chỉ 0xB800:0x0000 //Hien thi trang 1 + Trang màn hỡnh thứ 1 bắt đầu từ địa chỉ 0xB800:0x1000 493 v.h.ah = 5 ; v.h.al = 1 ; + Trang màn hỡnh thứ 2 bắt đầu từ địa chỉ 0xB800:0x2000 int86(0x10,&v,&r); + Trang màn hỡnh thứ 3 bắt đầu từ địa chỉ 0xB800:0x3000 for (i=0;i
  3. Generated by Foxit PDF Creator © Foxit Software http://www.foxitsoftware.com For evaluation only. ds = FP_SEG(buf); dx = FP_OFF(buf); #include "dos.h" #include "conio.h" thỡ ds:dx chứa địa chỉ của mảng buf. void duarmh(char *day, int dong,I nt cotd, int cotc,I nt m_nen, Vớ dụ 2. Sau khi thực hiện cỏc cõu lệnh: int m_chu); 495 char far *pchar; 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); duarmh("Chuc mung nam moi", 28, 30, 50, MAGENTA, § 4 . cỏc vớ dụ minh hoạ 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 trỡnh gồm hàm main() và hai hàm sau: duarmh("Chuc mung nam moi", 40, 30, 50, MAGENTA, 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à gúc dưới-phải là (dongd,cotd). Mầu cho bởi tham số maucs. ở đõy sử void cuaso(int dongt,int cott,int dongd,int cotd,int maucs) 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, từ /* Xac dinh thuoc tinh mau */ cột cotd đến cotc. Mầu nền cho bởi m_nen, mầu chữ cho bởi m_chữ. mau = (maucs
  4. Generated by Foxit PDF Creator © Foxit Software http://www.foxitsoftware.com For evaluation only. /* dt=(dongt-1)-t*25; dd=(dongd-1)-t*25; Xac dinh trang man hinh t /* Chon t la trang hien thi */ va cac chi so dong d trong trang t v.h.ah=5;v.h.al=t; int86(0x10,&v,&r); */ /* t=(dong-1)/25; d=dong-1-t*25; Dua cac khoang trong (ma 32) va thuoc tinh mau 497 /* Chon t la trang hien thi */ vao cac vi tri thich hop cua bo nho man hinh v.h.ah=5;v.h.al=t; int86(0x10,&v,&r); */ p=t*4096+d*160+(cotd-1)*2; for (i=dt;i
  5. Generated by Foxit PDF Creator © Foxit Software http://www.foxitsoftware.com For evaluation only. void khoi_dong_may(void) main() { { HAM f; unsigned char far *p; /*p se tro toi bang vecto ngat*/ f = (HAM)MK_FP(0xFFFF,0); int n; /* n - so hieu ngat, n=1,2,... */ f(); int k; /* vi tri cua ngat n trong bang vecto ngat */ } unsigned seg,off; char mat_khau[]= {'A','B','C','D'}; /* p tro toi bang vecto ngat */ int n = sizeof(mat_khau)/sizeof(char); p=(unsigned char far*)MK_FP(0,0); 499 void main() clrscr(); { while(1) char i, ch, sai_mat_khau; { clrscr(); printf("\n So hieu ngat (Bam 0 - Ket thuc): "); i=0; scanf("%d",&n); if(n==0) break; sai_mat_khau=0; k=(n-1)*4; cout
  6. Generated by Foxit PDF Creator © Foxit Software http://www.foxitsoftware.com For evaluation only. unsigned long far *t_time=(unsigned long ++i ; far*)MK_FP(0,0x46C); } char buf_time[]={'T',47,'I',47,'M',47,'E',47,':', 47, 32, 47, 32, 47, if (sai_mat_khau) 32, 47, 32, 47, 32, 47, 32, 47, 32, 47, 32, 47, 32, 47}; { char buf_luu[28]; cout
  7. Generated by Foxit PDF Creator © Foxit Software http://www.foxitsoftware.com For evaluation only. for (i=0; i
ADSENSE

CÓ THỂ BẠN MUỐN DOWNLOAD

 

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