- Ngắt 16h của BIOS
3.4.2 Chương trình thường trú và chương trình ngắt
a. Chương trình thường trú
- Khái niệm về chương trình thường trú
Chương trình thường trú (Terminate and Stay Resident- TSR) là chương trình có thể chạy “sau” chương trình khác, hỗ trợ khả năng kích hoạt, khả năng nằm lại bộ nhớ sau khi chạy xong. Sau đó khi ta chạy một chương trình khác với một điều kiện nào đó nó sẽđược kích hoạt để hoạt
Với chương trình bình thường khi chạy sẽ được một chương trình tải (Program Loader trong command.com) nạp vào vùng nhớ do DOS cấp phát. Khi chương trình thực hiện xong thì vùng nhớđã cấp phát cho nó được giải phóng và DOS sẽđánh dấu lại vùng nhớ này để cấp phát cho chương trình khác. Với chương trình thường trú thì bước cuối cùng không xảy ra, chương trình thường trú làm cho DOS đánh dấu lại miền dành cho DOS và vùng bị nó chiếm, do vậy sau này DOS sẽ không cấp phát vùng nhớ này cho chương trình khác, và như vậy nó được bảo vệ
chống bị viết đè bởi chương trình khác, bằng cách này thì chương trình thường trú trở thành một “bộ phận” của DOS.
Chỉ có file dạng COM với cấu trúc nằm gọn trong một đoạn mới dễ dàng trở thành chương trình thường trú. Ngoài hợp ngữ, người ta có thể viết chương trình thường trú trên các ngôn ngữ
lập trình bậc cao khác như ngôn ngữ C, Pascal … - Viết chương trình thường trú
Chương trình thường trú được viết giông như chương trình thông thường và thêm một đoạn mã của chương trình thường trú vào vùng nhớ dành cho DOS, đoạn mã đó sẽ không được kích hoạt nếu không được trao điều khiển. Việc thêm một đoạn mã tiếp dau vùng dành cho DOS được thực hiện bằng các chương tình con phục vụ ngắt. Đó là ngắt số 27H hoặc hàm 31H của ngắt 21H.
Có hai cách để làm cho chương trình thường trú được kích hoạt là: dùng ngắt và ấn một tổ
hơp phím (hot-key).
Các chương trình thường trú thường sửa nội dung của vector ngắt trong bẳng vector ngắt để
làm cho nó trỏđến địa chỉ của mình trong bộ nhớ, nhờ thế mỗi khi ngắt tương ứng được gọi thì chương trình thường trú lại được trao điều khiển. việc làm này được gọi là chặn vector ngắt. Chẳng hạn, nhiều chương trình POP-UP thường sửa ngắt bàn phím (vector ngắt bàn phím (số 9) nằm tại địa chỉ: 0:0024h) làm cho nó trỏđến địa chỉ của mình và cất địa chỉ của INT 9h để cho nó làm nhiệm vụ khi càn thiết.
- Các bước viết chương trình thường trú
Bước 1: Lấy và đặt lại vector ngắt bằng các dịch vụ của DOS
Ta luôn cần đến các chương trình con phục vụ ngắt đã có của hệ thống để không phải viết lại trong chương trình của mình đoạn chương trình đã có, vì vậy cần lấy nội dung của vector ngắt cũ cất vào miền dữ liệu của chương trình thường trú, khi nào cần sẽ trả lại giá trị này cho vector ngắt mà chương trình thường trú đã thay đổi. Giá trị của một vector ngắt là 2 từ tương ứng với
địa chỉđoạn (CS) và địa chỉ lệch (IP) của chương trình con phục vụ ngắt tương ứng. + Lấy vector ngắt (Get Interrupt Vector)
Hàm 35h:
Ý nghĩa: Lấy địa chỉ của một ngắt từ bảng vector ngắt.
Đầu vào: AH=35h
AL=số hiệu vector ngắt Int 21h
Đầu ra: ES:BX = giá trị của vector ngắt.
Ví dụ: Đoạn chương trình sau lấy vector ngắt của bàn phím (INT 9h) MODEL Tiny
Org 100h Jmp Load_Prog
; vùng dữ liệu SohieuNgat EQU 9h
NgatCu DW 2 DUP(0); luu dia chi ngat cu Load_Prog PROC
Mov AH,35
Mov AL, SohieuNgat Int 21h
Mov NgatCu,BX ; lay dia chi lech Mov NgatCu[2],ES ; lay dia chi doan ….