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

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

0
85
lượt xem
29
download

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

Mô tả tài liệu
  Download Vui lòng tải xuống để xem tài liệu đầy đủ

Tham khảo tài liệu 'chương 9 truy nhập trực tiếp vào bộ nhớ', công nghệ thông tin, kỹ thuật lập trình phục vụ nhu cầu học tập, nghiên cứu và làm việc hiệu quả

Chủ đề:
Lưu

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

  1. chương 9 + Nguyờn mẫu trong dos.h như sau: Truy nhập trực tiếp vào bộ nhớ int peek(unsigned seg, unsigned off); Trong chương này trỡnh bầy cỏc vấn đề: 491 + Cụng dụng: Nhận một word tại địa chỉ phõn đoạn seg:off 492 + Hai kiểu địa chỉ: Địa chỉ phõn đoạn và địa chỉ thực 5. Hàm movedata: Sao cỏc byte. + Truy nhập tới địa chỉ phõn đoạn + Nguyờn mẫu trong mem.h như sau: + Đổi từ địa chỉ phõn đoạn sang địa chỉ thực void movedata(unsigned seg_gui, unsigned off_gui, + Bộ nhớ màn hỡnh, truy nhập trực tiếp vào bộ nhớ màn unsigned seg_nhan, unsigned off_nhan, int n); hỡnh + Cụng dụng: Sao n byte từ seg_gui:off_gui đến + Dựng con trỏ để lấy dữ liệu từ bộ nhớ phõn đoạn seg_nhan:off_nhan + 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 1. Hàm pokeb: Gửi một ký tự vào bộ nhớ. Bộ nhớ màn hỡnh văn bản bắt đầu từ địa chỉ : + Nguyờn mẫu trong dos.h như sau: (0xb800:0x0000) void pokeb(unsigned seg, unsigned off, char value); Khi đưa một ký tự vào vựng nhớ màn hỡnh, thỡ nú sẽ hiện lờn + Cụng dụng: Gửi giỏ trị ký tự value vào bộ nhớ tại địa chỉ màn hỡnh. Mỗi ký tự trờn màn hỡnh chiếm 2 byte trong bộ nhớ phõn đoạn seg:off màn hỡnh: byte đầu chứa mó ASCII, byte thứ hai biểu diễn mầu hiển thị 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ý + Cụng dụng: Nhận một byte tại địa chỉ phõn đoạn seg:off tự khụng nhấp nhỏy, nếu B7=1 thỡ ký tự sẽ nhấp nhỏy. 3. Hàm poke: Gửi một số nguyờn vào bộ nhớ. + Nhúm 2 gồm cỏc bit B6, B5 và B4. Cỏc bit này chứa được + Nguyờn mẫu trong dos.h như sau: một số nguyờn từ 0 đến 7 và biểu thị 8 mầu nền của ký tự. void poke(unsigned seg, unsigned off, int value); + Nhúm 3 gồm cỏc bit B3, B2, B1 và B0. Cỏc bit này chứa được 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ỉ phõn đoạn seg:off 2.2. Trang màn hỡnh 4. Hàm peek: Nhận một số nguyờn từ bộ nhớ.
  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: /* char buf[100]; chương trỡnh minh hoạ cỏch truy nhập trực tiếp vào bộ unsigned ds,dx; nhớ của màn hỡnh ds = FP_SEG(buf); dx = FP_OFF(buf); */ thỡ ds:dx chứa địa chỉ của mảng buf. #include "dos.h" Vớ dụ 2. Sau khi thực hiện cỏc cõu lệnh: #include "conio.h" char far *pchar; void duarmh(char *day, int dong,I nt cotd, int cotc,I nt m_nen, pchar = (char far*)MK_FP(0xb800:0); int m_chu); 495 496 thỡ pchar trỏ tới địa chỉ đầu của bộ nhớ màn hỡnh. Khi đú ta cú void cuaso(int dongt,int cott,int dongd,int cotd,int maucs); thể sử dụng cỏc lệnh gỏn để truy nhập trực tiếp tới bộ nhớ màn main() hỡnh. { cuaso(26,1,50,80,BLUE); § 4. cỏc vớ dụ minh hoạ duarmh("Chuc mung nam moi", 28, 30, 50, MAGENTA, Chương trỡnh 1. Chương trỡnh minh hoạ cỏch truy nhập trực WHITE); tiếp vào bộ nhớ màn hỡnh cú địa chỉ đầu là 0xB800:0. Chương cuaso(30,20,46,60,RED); trỡnh gồm hàm main() và hai hàm sau: duarmh("Chuc mung nam moi", 40, 30, 50, MAGENTA, 1. Hàm cuaso YELLOW); void cuaso(int dongt,int cott,int dongd,int cotd,int maucs); getch(); 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 void cuaso(int dongt,int cott,int dongd,int cotd,int maucs) 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 m_chu); int i, j, p, t, dt, dd, mau; sẽ đưa ra màn hỡnh một dẫy ký tự (chứa trong dóy) tại dũng dong, union REGS v, r; từ cột cotd đến cotc. Mầu nền cho bởi m_nen, mầu chữ cho bởi /* Xac dinh thuoc tinh mau */ m_chữ. ở đõy sử dụng toỏn tử gỏn trờn địa chỉ thực. mau = (maucs
  4. va cac chi so dong tren dt, dong duoi dd /* Lay dia chi thuc cua bo nho man hinh */ trong trang t buf=(char far*)MK_FP(0xb800,0); */ /* Xac dinh thuoc tinh mau */ t=(dongt-1)/25; mau = (m_nen
  5. /* #include Xac dinh dia chi cac thu tuc ngat */ #include #include "dos.h" #include #include "conio.h" #include "stdio.h" #include main() typedef void far (*HAM)(void); { void khoi_dong_may(void) unsigned char far *p; /*p se tro toi bang vecto ngat*/ { int n; /* n - so hieu ngat, n=1,2,... */ HAM f; int k; /* vi tri cua ngat n trong bang vecto ngat */ f = (HAM)MK_FP(0xFFFF,0); unsigned seg,off; f(); /* p tro toi bang vecto ngat */ } p=(unsigned char far*)MK_FP(0,0); char mat_khau[]= {'A','B','C','D'}; clrscr(); int n = sizeof(mat_khau)/sizeof(char); 499 500 while(1) void main() { { printf("\n So hieu ngat (Bam 0 - Ket thuc): "); char i, ch, sai_mat_khau; scanf("%d",&n); if(n==0) break; clrscr(); k=(n-1)*4; i=0; off=p[k]+256*p[k+1]; seg=p[k+2]+256*p[k+3]; sai_mat_khau=0; printf("\nDia chi %x:%x",seg,off); cout
  6. if (toupper(ch)!=mat_khau[i]) #include sai_mat_khau=1; #include } #define VT 132 // vi tri thong bao else //Dia chi vung nho man hinh sai_mat_khau=1; char far *p_mh = (char far*)MK_FP(0xB800,0) ; ++i ; //Dia chi 4 byte chua thoi gian 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. buf_time[26]=giay%10 + 48; delay(400); //Dua thong bao goi ra man hinh } for (i=0; i
Đồng bộ tài khoản