Phòng thí nghiệm Mơ & Truyền số liệu Thực hành Lậptrìnhhệthống BÀI 2: XỬ LÝ NGẮT MỤC ĐÍCH THÍ NGHIỆM Giúp sinh viên thực nghiệm khảo sát vấn đề sau : - Đọc nội dung bảng vector ngắt - Thực chặn ngắt THIẾT BỊ SỬ DỤNG Máy vi tính PHẦN I : CƠ SỞ LÝ THUYẾT Ngắt (interrupt) q trình dừng chương trình chạy để ưu tiên thực chương trình khác, chương trình gọi chương trình phục vụ ngắt (ISR – Interrupt Service Routine) ISR hoàn toàn giống với chương trình bình thường máy tính, nghĩa có khả truy xuất đến tất lệnh ngơn ngữ máy µP Tuy nhiên cuối ISR kết thúc lệnh IRET (Interrupt Return) để µP tiếp tục thực lệnh kết thúc trước Khi thực lệnh gọi ngắt đó, chương trình phục vụ cho ngắt gọi Để thực ngắt tương ứng, địa thực chương trình phục vụ ngắt đặt bảng, gọi bảng vector ngắt Bảng vector ngắt gồm có 256 phần tử, phần tử gồm byte ứng với 256 ngắt (từ ngắt đến ngắt 0FFh) Mỗi phần tử bảng vector ngắt chứa địa chỉ: địa ghi đoạn đưa vào CS địa offset chương trình phục vụ ngắt đưa vào IP Bảng vector ngắt mơ tả sau: Địa Địa ISR Số thứ tự ngắt 0000h:0000h IP 0000h:0002h CS 0000h:0004h IP 0000h:0006h CS 0000h:0008h IP 0000h:000Ah CS … … 0000h:03FCh IP 0000h:03FEh CS … 255 Khi có q trình ngắt xảy ra, CPU tìm địa bắt đầu chương trình ngắt chứa bảng vector ngắt theo số thự tự ngắt Do phần tử bảng Trang 11 Phòng thí nghiệm Mơ & Truyền số liệu Thực hành Lậptrìnhhệthống vector ngắt chiếm byte nên để tìm giá trị địa bảng vector ngắt, ta cần nhân số thứ tự ngắt với Quá trình gọi ngắt từ hợp ngữ đơn giản thực lệnh INT STT_ngắt sau nạp tham số cần thiết cho ngắt Khi thực lệnh gọi ngắt, CPU tìm kiếm bảng vector ngắt địa chương trình phục vụ ngắt Người sử dụng xây dựng mơt chương trình sở chương trình xử lý ngắt Sau đó, chương trình khác gọi ngắt để sử dụng Một chương trình gọi chương trình loại mà khơng cần biết địa Như vậy, muốn thay đổi ngắt, ta thay đổi nội dung bảng vector ngắt để đến chương trình phục vụ người sử dụng tự xây dựng chương trình thực ngắt gọi Để làm điều này, ta cần tìm vị trí vector ngắt tương ứng bảng thay đổi giá trị Điều thực bảng vector ngắt đặt RAM nạp khởi động hệthống Quá trình lấy gán địa chương trình phục vụ ngắt thực thông qua ngắt 21h hàm sau: Hàm 35h: lấy địa ngắt Vào: AL = số thứ tự ngắt Ra: ES:BX = địa chương trình phục vụ ngắt Hàm 25h: gán địa chương trình phục vụ cho ngắt Vào: AL = số thứ tự ngắt, DS:DX Ra: khơng có PHẦN II : I TIẾN TRÌNH THÍ NGHIỆM ĐỌC BẢNG VECTOR NGẮT Q trình đọc nội dung từ bảng vector ngắt thực cách: dùng hàm 25h 35h ngắt 21h hay truy nhập trực tiếp vào nhớ Dùng hàm 25h 35h - Dùng NCEdit soạn thảo chương trình sau: MODEL SMALL STACK 100h DATA Hexcode db ‘0123456789ABCDEF’ Msg db ‘Nhap so thu tu ngat: $’ Msg1 db ‘Dia chi segment: $’ Msg2 db ‘Dia chi offset: $’ Msg3 db ‘Nhan mot phim bat ky de tiep tuc, ESC de thoat$’ CrLf db 13,10,’$’ CODE main PROC MOV AX,@DATA Trang 12 Phòng thí nghiệm Mơ & Truyền số liệu Thực hành Lậptrìnhhệthống MOV DS,AX Start: MOV AX,02h INT 10h MOV AH,09h LEA DX,Msg INT 21H CALL read_number ; ••c s• Hex MOV INT PUSH PUSH AH,35h 21h BX ES MOV AH,09h LEA DX,CrLf INT 21h MOV AH,09h LEA DX,Msg1 INT 21h POP AX CALL print_hex MOV AH,09h LEA DX,CrLf INT 21h MOV AH,09h LEA DX,Msg2 INT 21h POP AX CALL print_hex MOV AH,09h LEA DX,CrLf INT 21h MOV AH,09h LEA DX,Msg3 INT 21h MOV INT CMP JNE AH,08h 21h AL,27 start MOV AH,4Ch INT 21H main ENDP ; Print_hex PROC Trang 13 Phòng thí nghiệm Mơ & Truyền số liệu PUSH AX MOV BX,AX AND BX,0F000h MOV CL,12 SHR BX,CL MOV DL,Hexcode[BX] MOV AH,02h INT 21h POP AX PUSH AX MOV BX,AX AND BX,0F00h MOV CL,8 SHR BX,CL MOV DL,Hexcode[BX] MOV AH,02h INT 21h POP AX PUSH AX MOV BX,AX AND BX,00F0h MOV CL,4 SHR BX,CL MOV DL,Hexcode[BX] MOV AH,02h INT 21h POP AX PUSH AX MOV BX,AX AND BX,000Fh MOV DL,Hexcode[BX] MOV AH,02h INT 21h POP AX RET Print_hex ENDP ; Read_number PROC ; Nh•p s• Hex t• bàn phím MOV AH,01h INT 21h MOV BX,0 Look1: CMP AL,Hexcode[BX] JE Next1 INC BX JMP Look1 Next1: MOV CL,4 SHL BL,CL PUSH BX MOV AH,01h Trang 14 Thực hành Lậptrìnhhệthống Phòng thí nghiệm Mơ & Truyền số liệu Thực hành Lậptrìnhhệthống INT 21h MOV BX,0 Look2: CMP AL,Hexcode[BX] JE Next2 INC BX JMP Look2 Next2: MOV AL,BL POP BX ADD AL,BL RET Read_number ENDP END main - Ghi nhận địa chương trình phục vụ ngắt ngắt 00h, 09h, 0Bh 10h Truy nhập trực tiếp vào nhớ Để xác định địa chương trình phục vụ ngắt, ta xác định dựa vào bảng vector ngắt Thay đoạn in đậm đoạn chương trình sau: MOV BX,0 MOV ES,BX MOV BL,4 MOV AH,0 MUL BL MOV BX,AX MOV AX,ES:[BX] PUSH AX MOV AX,ES:[BX+2] PUSH AX II - Ghi nhận địa chương trình phục vụ ngắt ngắt 00h, 09h, 0Bh 10h So sánh kết với phần thực hành CHẶN NGẮT Thực chương trình chuyển chữ thường thành chữ hoa nhấn phím: MODEL SMALL STACK 100h DATA CODE main PROC off_int DW ? seg_int DW ? MOV AX,CS MOV DS,AX Trang 15 Phòng thí nghiệm Mơ & Truyền số liệu MOV MOV INT MOV MOV MOV Thực hành Lậptrìnhhệthống AH,35h ; L•u ••a ch• ng•t 09h AL,09h 21h off_int,BX BX,ES seg_int,BX MOV AH,25h ; Gán ••a ch• m•i cho ng•t 09h MOV AL,09h PUSH DS PUSH CS POP DS MOV DX,offset Int0_ISR INT 21h POP DS PUSH DS MOV AH,25h MOV AL,60h MOV DX,off_int MOV BX,seg_int MOV DS,BX INT 21h POP DS lap: MOV AH,08h INT 21h CMP AL,27 JE EXIT MOV DL,AL MOV AH,02h INT 21h JMP lap ; ; ; ; ; Ki•m tra phím nh•n N•u có nh•n phím xu•t ký t• v•a nh•n hình, n•u nh•n ESC exit: MOV DX,off_int PUSH DS MOV BX,seg_int MOV DS,BX MOV AH,25h MOV AL,09h INT 21h POP DS ; Khơi ph•c ng•t 09h MOV AH,4Ch INT 21h main ENDP Int0_ISR INT MOV MOV MOV MOV PROC FAR 60h ; X• lý phím nh•n BX,40h ES,BX BX,ES:[1Ah] AX,ES:[BX] Trang 16 Phòng thí nghiệm Mơ & Truyền số liệu Thực hành Lậptrìnhhệthống CMP AL,'a' JB exit_int CMP AL,'z' ; N•u khơng ch• th••ng JA exit_int ;thì gi• ngun SUB AL,20h ; ng••c l•i chuy•n thành MOV ES:[BX],AX ; ch• hoa l•u vào b• ••m exit_int: IRET Int0_ISR ENDP END main - Sửa đổi chương trình để khơng nhận phím số từ ‘0’ Ỉ ‘9’ Trang 17 ... MOV CL,4 SHL BL,CL PUSH BX MOV AH,01h Trang 14 Thực hành Lập trình hệ thống Phòng thí nghiệm Mơ & Truyền số liệu Thực hành Lập trình hệ thống INT 21h MOV BX,0 Look2: CMP AL,Hexcode[BX] JE Next2... ngắt địa chương trình phục vụ ngắt Người sử dụng xây dựng mơt chương trình sở chương trình xử lý ngắt Sau đó, chương trình khác gọi ngắt để sử dụng Một chương trình gọi chương trình loại mà không... RAM nạp khởi động hệ thống Quá trình lấy gán địa chương trình phục vụ ngắt thực thơng qua ngắt 21h hàm sau: Hàm 35h: lấy địa ngắt Vào: AL = số thứ tự ngắt Ra: ES:BX = địa chương trình phục vụ ngắt