PHẦN I : CƠ SỞ LÝ THUYẾT Ngắt interrupt là quá trình dừng chương trình chính đang chạy để ưu tiên thực hiện một chương trình khác, chương trình này được gọi là chương trình phục vụ ngắt
Trang 1Phòng thí nghiệm Mô phỏng & Truyền số liệu Thực hành Lập trình hệ thống
BÀI 2: XỬ LÝ NGẮT
MỤC ĐÍCH THÍ NGHIỆM
Giúp sinh viên bằng thực nghiệm khảo sát các vấn đề chính sau đây :
- Đọc nội dung của bảng vector ngắt
- Thực hiện chặn ngắt
THIẾT BỊ SỬ DỤNG
1 Máy vi tính
PHẦN I : CƠ SỞ LÝ THUYẾT
Ngắt (interrupt) là quá trình dừng chương trình chính đang chạy để ưu tiên thực hiện một chương trình khác, chương trình này được gọi là chương trình phục vụ ngắt (ISR – Interrupt Service Routine) ISR hoàn toàn giống với một chương trình bình thường trên máy tính, nghĩa là nó có khả năng truy xuất đến tất cả các lệnh ngôn ngữ máy của µP Tuy nhiên cuối ISR sẽ kết thúc bằng lệnh IRET (Interrupt Return) để µP tiếp tục thực hiện lệnh đã kết thúc trước đây
Khi thực hiện lệnh gọi một ngắt nào đó, chương trình con phục vụ cho ngắt sẽ được gọi Để thực hiện các ngắt tương ứng, địa chỉ thực hiện các chương trình con phục
vụ ngắt được đặt trong một bảng, gọi là bảng vector ngắt
Bảng vector ngắt gồm có 256 phần tử, mỗi phần tử gồm 4 byte ứng với 256 ngắt (từ ngắt 0 đến ngắt 0FFh) Mỗi phần tử trong bảng vector ngắt chứa 2 địa chỉ: địa chỉ thanh ghi đoạn đưa vào CS và địa chỉ offset của chương trình phục vụ ngắt đưa vào IP
Bảng vector ngắt có thể mô tả như sau:
Địa chỉ Địa chỉ ISR Số thứ tự ngắt
0000h:0000h IP 0000h:0002h CS 0 0000h:0004h IP
0000h:0006h CS 1 0000h:0008h IP
0000h:000Ah CS 2
… … … 0000h:03FCh IP
0000h:03FEh CS 255 Khi có một quá trình ngắt xảy ra, CPU sẽ tìm địa chỉ bắt đầu của chương trình ngắt được chứa trong bảng vector ngắt theo số thự tự ngắt Do một phần tử trong bảng
Trang 2Phòng thí nghiệm Mô phỏng & Truyền số liệu Thực hành Lập trình hệ thống
vector ngắt chiếm 4 byte nên để tìm giá trị địa chỉ trong bảng vector ngắt, ta chỉ cần nhân
số thứ tự ngắt với 4
Quá trình gọi ngắt từ hợp ngữ đơn giản là thực hiện lệnh INT STT_ngắt sau khi
nạp các tham số cần thiết cho ngắt Khi thực hiện lệnh gọi ngắt, CPU sẽ tìm kiếm trong bảng vector ngắt địa chỉ của chương trình phục vụ ngắt Người sử dụng cũng có thể xây dựng môt chương trình cơ sở như các chương trình xử lý ngắt Sau đó, các chương trình khác có thể gọi ngắt ra để sử dụng Một chương trình có thể gọi chương trình con loại này mà không cần biết địa chỉ của nó
Như vậy, nếu muốn thay đổi ngắt, ta có thể thay đổi nội dung trong bảng vector ngắt để chỉ đến chương trình phục vụ do người sử dụng tự xây dựng và chương trình này
sẽ được thực hiện khi ngắt được gọi Để làm điều này, ta chỉ cần tìm vị trí của vector ngắt tương ứng trong bảng và thay đổi giá trị của nó Điều này thực hiện được do bảng vector ngắt đặt trong RAM và được nạp mỗi khi khởi động hệ thống
Quá trình lấy và gán địa chỉ của chương trình con phục vụ ngắt có thể thực hiện thông qua ngắt 21h bằng các hàm sau:
Hàm 35h: lấy địa chỉ của ngắt
Vào: AL = số thứ tự ngắt Ra: ES:BX = địa chỉ của chương trình phục vụ ngắt
Hàm 25h: gán địa chỉ của một chương trình phục vụ cho một ngắt
Vào: AL = số thứ tự ngắt, DS:DX Ra: không có
PHẦN II : TIẾN TRÌNH THÍ NGHIỆM
Quá trình đọc nội dung từ bảng vector ngắt có thể thực hiện bằng 2 cách: dùng hàm 25h và 35h của ngắt 21h hay truy nhập trực tiếp vào bộ nhớ
1 Dùng hàm 25h và 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 3Phòng thí nghiệm Mô phỏng & Truyền số liệu Thực hành Lập trình hệ 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 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 AH,08h
INT 21h
CMP AL,27
JNE start
MOV AH,4Ch
INT 21H
main ENDP
; -
Print_hex PROC
Trang 4Phòng thí nghiệm Mô phỏng & Truyền số liệu Thực hành Lập trình hệ thống
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 5Phòng thí nghiệm Mô phỏng & 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
INC BX
JMP Look2
Next2:
MOV AL,BL
POP BX
ADD AL,BL
RET
Read_number ENDP
END main
- Ghi nhận địa chỉ chương trình phục vụ ngắt của các ngắt 00h, 09h, 0Bh và 10h
2 Truy nhập trực tiếp vào bộ nhớ
Để xác định địa chỉ 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 bằng đ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
- Ghi nhận địa chỉ chương trình phục vụ ngắt của các ngắt 00h, 09h, 0Bh và 10h
So sánh kết quả với phần thực hành trên
II CHẶN NGẮT
- Thực hiện chương trình chuyển chữ thường thành chữ hoa mỗi khi 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 6Phòng thí nghiệm Mô phỏng & Truyền số liệu Thực hành Lập trình hệ thống
MOV AH,35h ; L•u ••a ch• ng•t 09h MOV AL,09h
INT 21h MOV off_int,BX MOV BX,ES
MOV 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 ; Ki•m tra phím nh•n INT 21h ; N•u có nh•n phím thì CMP AL,27 ; xu•t ký t• v•a nh•n
JE EXIT ; ra màn hình, n•u nh•n MOV DL,AL ; ESC thì thoát
MOV AH,02h INT 21h JMP lap exit:
MOV DX,off_int ; Khôi ph•c ng•t 09h PUSH DS
MOV BX,seg_int MOV DS,BX
MOV AH,25h MOV AL,09h INT 21h POP DS
MOV AH,4Ch INT 21h main ENDP Int0_ISR PROC FAR
INT 60h ; X• lý phím nh•n MOV BX,40h
MOV ES,BX MOV BX,ES:[1Ah]
MOV AX,ES:[BX]
Trang 7Phòng thí nghiệm Mô phỏng & Truyền số liệu Thực hành Lập trình hệ thống
CMP AL,'a'
JB exit_int CMP AL,'z' ; N•u không là ch• th••ng
JA exit_int ;thì gi• nguyên SUB AL,20h ; ng••c l•i thì chuy•n thành MOV ES:[BX],AX ; ch• hoa và 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 các phím số từ ‘0’ Æ ‘9’