Tài liệu Lập trình hệ thống Chương 2
Phạm Hùng Kim Khánh Trang 34
Chương 2
NGẮT VÀ SỰ KIỆN
1. Khái niệm
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.
Các nguyên nhân dẫn đến ngắt là:
- Bản thân chương trình đang thực hiện bị lỗi, ví dụ như: chia cho 0, …
- Do tác động của thiết bị ngoại vi, ví dụ như: thực hiện lệnh in nhưng máy in lỗi,
ghi dữ liệu vào đĩa nhưng không có đĩa, …
- Do lập trình viên chủ động gọi các ngắt có sẵn.
Một cách đơn giản, chúng ta có thể xem ngắt như là quá trình gọi chương trình con
như
ng các chương trình con này được tạo ra sẵn trong máy tính và quá trình gọi này có thể
xảy ra tại thời điểm không xác định trước.
Sự kiện (Event) là một tác động lên một đối tượng trong môi trường Windows. Khi
có một sự kiện xảy ra, Windows sẽ gởi thông điệp (message) đến đối tượng. Các sự kiện
thường xảy ra là:
- Sự kiện chuột: Click, Double Click, …
- Sự kiện bàn phím: nhấn phím, nhả phím, …
- Sự
kiện cửa sổ: Activate, Load, Unload, …
2. Các loại ngắt và bảng vector ngắt
Quá trình ngắt có thể mô tả như sau:
Hình 2.1 – Quá trình thực hiện ngắt
Lưu trữ các thanh ghi cần thiết
…
Khôi phục các thanh ghi
Quay về chương trình chính (IRET)
Chương trình chính ISR
Tài liệu Lập trình hệ thống Chương 2
Phạm Hùng Kim Khánh Trang 35
Trong các quá trình ngắt, ta phân biệt thành 2 loại: ngắt cứng và ngắt mềm. Ngắt
mềm là ngắt được gọi bằng một lệnh trong chương trình ngôn ngữ máy. Ngắt mềm được
thục hiện trên hợp ngữ thông qua lệnh INT. Đối với các ngôn ngữ bậc cao hơn, vẫn cho
phép thực hiện gọi ngắt nhưng phải được biên dịch thành lệnh INT trong hợp ngữ rồi mời
thực hiện.
Khác với ngắ
t mềm, ngắt cứng không được khởi động bên trong máy tính mà do các
linh kiện điện tử tác đông lên hệ thống. Ngắt cứng cũng được chia thành 2 loại: ngắt che
được và ngắt không che được. Ngắt che được là ngắt có thể cho phép hay không cho phép
thực thi bằng phần mềm thông qua cờ ngắt IF (Interrupt Flag): lệnh CLI (Clear Interrupt
Flag) sẽ cấm ngắt và lệnh STI (Set Interrupt Flag) sẽ cho phép các ngắt này hoạt động.
Các loại ngắt khác nhau có thể mô tả như sau:
Hình 2.2 – Các loại ngắt
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.
Ngắt
Ngắt mềm Ngắt cứng
Ngắt hệ thống
Ngắt do người
sử dụng
Trong Ngoài
HĐH BIOS Che được
Không
che được
Tài liệu Lập trình hệ thống Chương 2
Phạm Hùng Kim Khánh Trang 36
Bảng vector ngắt có thể mô tả như sau:
Địa chỉ Địa chỉ ISR Số thứ tự ngắt
0000h:0000h CS
0000h:0002h IP
0
0000h:0004h CS
0000h:0006h IP
1
0000h:0008h CS
0000h:000Ah IP
2
… … …
0000h:03FCh CS
0000h:03FEh IP
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 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.
Danh sách các ngắt mô tả như sau:
STT Địa chỉ Chức năng
00h 0000h – 0003h CPU: chia cho 0
01h 0004h – 0007h CPU: thực hiện từng lệnh
02h 0008h – 000Bh CPU: Lỗi RAM
03h 000Ch – 000Fh CPU: thực hiện đến điểm dừng
04h 0010h – 0013h CPU: tràn số
05h 0014h – 0017h In trang màn hình (Print Screen)
06h, 07h 0018h – 001Fh Dành riêng
08h 0020h – 0023h IRQ0: ngắt đồng hồ (18.2 lần / giây)
09h 0024h – 0027h IRQ1: ngắt bàn phím
0Ah 0028h – 002Bh IRQ2: Dành riêng
0Bh 002Ch – 002Fh IRQ3: Giao tiếp nối tiếp 1
0Ch 0030h – 0033h IRQ4: Giao tiếp nối tiếp 2
0Dh 0034h – 0037h IRQ5: Đĩa cứng
Tài liệu Lập trình hệ thống Chương 2
Phạm Hùng Kim Khánh Trang 37
0Eh 0038h – 003Bh IRQ6: Đĩa mềm
0Fh 003Ch – 003Fh IRQ7: Máy in
10h 0040h – 0043h BIOS: màn hình
11h 0044h – 0047h BIOS: xác định cấu hình máy tính
12h 0048h – 004Bh BIOS: xác định kích thước RAM
13h 004Ch – 004Fh BIOS: truy nhập đĩa cứng / đĩa mềm
14h 0050h – 0053h BIOS: truy nhập giao tiếp nối tiếp
15h 0054h – 0057h BIOS: truy nhập cassette hay mở rộng ngắt
16h 0058h – 005Bh BIOS: kiểm tra bàn phím
17h 005Ch – 005Fh BIOS: truy nhập máy in
18h 0060h – 0063h Chương trình xâm nhập ROM BASIC
19h 0064h – 0067h BIOS: khởi động hệ thống (khi nhấn Ctrl-Alt-Del)
1Ah 0068h – 006Bh BIOS: đọc / ghi ngày / giờ
1Bh 006Ch – 006Fh Nhấn phím Break
1Ch 0070h – 0073h Gọi sau INT 08h
1Dh 0074h – 0077h Địa chỉ bảng tham số màn hình
1Eh 0078h – 007Bh Địa chỉ bảng tham số đĩa mềm
1Fh 007Ch – 007Fh Địa chỉ bảng font có ký tự mở rộng
20h 0080h – 0083h DOS: kết thúc chương trình
21h 0084h – 0087h DOS: gọi các hàm của DOS
22h 0088h – 008Bh Địa chỉ kết thúc chương trình
23h 008Ch – 008Fh Nhấn Ctrl-Break
24h 0090h – 0093h Địa chỉ chương trình xử lý lỗi
25h 0094h – 0097h DOS: đọc đĩa mềm / đĩa cứng
26h 0098h – 009Bh DOS: ghi đĩa mềm / đĩa cứng
27h 009Ch – 009Fh DOS: kết thúc chương trình và thường trú
28h – 3Fh 00A0h – 00FFh Dành riêng cho DOS
40h 0100h – 0103h BIOS: phục vụ đĩa mềm
41h 0104h – 0107h Địa chỉ bảng tham số đĩa cứng 1
42h – 45h 0108h – 0117h Dành riêng
46h 0118h – 011Bh Địa chỉ của bảng tham số đĩa cứng 2
47h – 49h 011Ch – 0127h Dành cho user
Tài liệu Lập trình hệ thống Chương 2
Phạm Hùng Kim Khánh Trang 38
4Ah 0128h – 012Bh Hẹn giờ
4Bh – 67h 012Ch – 019Fh Dành cho user
68h – 6Fh 01A0h – 01BFh Không dùng
70h 01C0h – 01C3h IRQ8: đồng hồ thời gian thực
71h 01C4h – 01C7h IRQ9
72h 01C8h – 01CBh IRQ10
73h 01CCh – 01CFh IRQ11
74h 01D0h – 01D3h IRQ12
75h 01D4h – 01D7h IRQ13: từ 80x87
76h 01D8h – 01DBh IRQ14: đĩa cứng
77h 01DCh – 01DFh IRQ15
78h – 7Fh 01E0h – 01FFh Dành riêng
80h – F0h 0200h – 03C3h Dùng cho bộ thông dịch BASIC
F1h – FFh 03C4h – 03FFh Không sử dụng
3. Gọi ngắt và chặn ngắt
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ó
Tài liệu Lập trình hệ thống Chương 2
Phạm Hùng Kim Khánh Trang 39
Để thực hiện chặn một ngắt, ta cần thực hiện như sau:
Hình 2.2 – Quá trình chặn một ngắt
Một ví dụ cho quá trình chặn ngắt như sau:
;*******************************************************************************
;*
;* LAB6-2.ASM - Assembler Laboratory ZMiTAC
*
;*
;* Sample program that converts lowercase to uppercase when key pressed
*
;*
;*******************************************************************************
.MODEL SMALL
.STACK 100h
.CODE
;*******************************************************************************
;* Variables
;*******************************************************************************
old_proc dd 0 ; address of original interrupt handler
dot_flag db 0 ; dot flag
;*******************************************************************************
;* 09h interrupt handler
;*******************************************************************************
segment_kb EQU 40h ; beggining of keyboard data segment
wsk_kb EQU 1Ch ; offset of pointer to keyboard buffer
kb_buf_begin EQU 80h ; offset of address of begining of the
buffer
kb_buf_end EQU 82h ; offset of address of end of the buffer
keys PROC FAR
;-------------------------------------------------------------------------------
; Calling of original interrupt handler
;-------------------------------------------------------------------------------
Dùng hàm 35h lấy
địa chỉ của ngắt
Dùng hàm 25h gán
địa chỉ mới cho ngắt
Dùng hàm 25h khôi
phục lại địa chỉ cũ
cho ngắt