Download as docx, pdf, or txt
Download as docx, pdf, or txt
You are on page 1of 7

INT 21h : Interrupt số hiệu ngắt là 21h

Ngắt: ngắt là 1 hiện tương đang thực hiện công việc này phải chuyển sang thực hiện 1 công việc
khác. Ngắt có hai loại:
- Ngắt cứng: ngắt do các tín hiệu điều khiển phần cứng gây nên (ví dụ: INTR – Interrupt
request)
- Ngắt mềm: ngắt do các câu lệnh của chương trình phần mềm mang đến (ví dụ: INT là
lệnh ngắt)
Cú pháp: INT Số hiệu ngắt
Số hiệu ngắt: 8 bit (00h – FFh) 00000000 ~ 11111111 (00 ~ FFh)
INT 21h là ngắt dùng để giao tiếp với bàn phím và màn hình
 INT 21h
- Hàm 1: Dùng để nhập 1 kí tự vào từ bàn phím. Nếu kí tự đó là kí tự bàn phím (không
phải kí tự điều khiển) thì kí tự sau khi nhập sẽ được cất trong thanh ghi AL.
Cú pháp:
MOV AH, 1 ; khởi tạo hàm 1 để chuẩn bị nhập 1 ký tự
INT 21H ; Ngắt để nhập 1 kí tự vào từ bàn phím
- Hàm 2: Dùng để hiển thị 1 kí tự ra màn hình. Kí tự muốn được hiển thị thì mã ASCII của
kí tự đó phải được cất trong thanh ghi DL.
Cú pháp:
MOV AH, 2 ; khởi tạo hàm 2 để chuẩn bị hiển thị ký tự ra màn hình
MOV DL, MÃ ASCII CỦA KÍ TỰ ; cất mã ASCII của ký tự vào DL
INT 21H ; Ngắt để hiển thị kí tự ra màn hình

Chú ý: MOV DL, MÃ ASCII CỦA KÍ TỰ


Cách 1: Hiển thị kí tự vừa nhập (phải chuyển mã ASCII của kí tự từ AL sang DL)
MOV DL, MÃ ASCII CỦA KÍ TỰ  MOV DL, AL
Cách 2: Hiển thị kí tự mong muốn (phải biết mã ASCII của kí tự đó)
Ví dụ: Hiển thị kí tự A (A hoa)
MOV DL, MÃ ASCII CỦA KÍ TỰ  MOV DL, ‘A’ or MOV DL, 41h
Do mã ASCII của kí tự A hoa = 41h (mã ASCII của A – Z : 41h – 5Ah; mã ASCII
của a – z: 61h – 7Ah; mã ASCII của 0 – 9: 30h – 39h)
Lưu ý: Chuyển mã ASCII từ ký tự hoa về ký tự thường và ngược lại
Chuyển từ HOA về THƯỜNG: ADD AL, 20h ; AL = AL + 20h
Chuyển từ THƯỜNG sang HOA: SUB AL, 20h ; AL = AL – 20h

- Hàm 4CH: Thoát về DOS


Cú pháp:
MOV AH, 4CH
INT 21H ; Ngắt thoát về DOS
- Hàm 9: Hiển thị 1 chuỗi ký tự ra màn hình. Địa chi hiệu dụng (địa chỉ độ lệch) của chuỗi
cần hiển thị phải được cất trong thanh ghi DX qua lệnh LEA (Load Effective Address).

Chuỗi cần hiển thị thì phải được khai báo:

TÊN CHUỖI KIỂU CỦA CHUỖI ‘NỘI DUNG’, ‘$’


Cú pháp:
MOV AH, 9 ; khởi tạo hàm 9 chuẩn bị hiển thị ký tự
LEA DX, TÊN CỦA CHUỖI
INT 21H ; Ngắt để hiển thị CHUỖI ra màn hình
Ví dụ: Khai báo chuỗi kí tự cần hiển thị
DB: Define Byte – Định nghĩa theo kiểu 1 byte
DW: Define Word – Định nghĩa theo kiểu 2 byte (8086: 1 word = 2 byte)
DD: Define Double Word – Định nghĩa theo kiểu 4 byte

Chaomung DB ‘Welcome cac ban da den vơi Viet Nam’, ‘$’


MOV AH, 9
LEA DX, chaomung
INT 21H ; Ngắt để hiển thị chuỗi chaomung

Giới thiệu về hai kí tự đặc biệt:


Carriage return - Wikipedia

CR: Carriage return – mã ASCII là 0Dh (13) – Về đầu dòng


LF: Line Feed – mã ASCII là 0Ah (10) – Xuống dòng
Tổ hợp 2 mã CR và LF người ta hay viết gọn là CRLF tương đương phím ENTER
Ví dụ: yêu cầu hiển thị kí tự hoặc chuỗi xong thì về đầu dòng tiếp theo khi đó ta viết đoạn
code sau:
Khai báo chuỗi CRLF DB 0AH, 0DH, ‘$’
MOV AH, 9
LEA DX, CRLF
INT 21H ; Ngắt để xuống dòng về đầu dòng

Bài tập:
Viết chương trình ASM (hợp ngữ) biên dịch theo kiểu EXE thực hiện những công việc sau:
1. Nhập 1 ký tự vào từ bàn phím
2. Hiển thị dòng thông báo “Hiển thị ký tự ra màn hình”
3. Đi hiển thị ký tự đó ra màn hình
4. Hiển thị dòng thông báo “Bạn đã hoàn thành công việc”
5. Thoát về DOS

.model small
.stack 100
.data
Chuoi1 DB ‘hien thi ki tu ra man hinh’, 0Ah, 0Dh, $
Chuoi2 DB ‘ban da hoan thanh cong viec’, 0Ah, 0Dh, $
.code
MAIN PROC
; khởi tạo thanh ghi đoạn DS
Mov AX, @data
Mov DS, AX
; nhập 1 ký tự vào từ bàn phím
Mov AH, 1
INT 21h
; hiển thị chuỗi 1
Mov AH, 9
LEA DX, Chuoi1
INT 21h
; hiển thị ký tự ra màn hình
Mov AH, 2
Mov DL, AL
INT 21h
; hiển thị chuỗi 2
Mov AH, 9
LEA DX, Chuoi2
INT 21h
; Thoát về DOS
Mov AH, 4Ch
INT 21h
MAIN ENDP
END MAIN

Nhắc lại các lệnh liên quan đến cấu trúc điều khiển!
1. CMP: Compare – so sánh
Cú pháp CMP ĐÍCH, NGUỒN ; So sánh toán hạng đích với nguồn
2. Các câu lệnh NHẢY
a. Lệnh nhảy không điều kiện
Cú pháp JMP Nhãn lệnh
TH1: Nhảy lên phía trên
Nhãn lệnh: -----
-----
-----

JMP Nhãn lệnh

TH2: Nhảy xuống phía dưới


JMP Nhãn lệnh
-----
-----
-----
Nhãn lệnh: -----
-----
-----
b. Lệnh nhảy có điều kiện
- Nhảy với số có dấu:
JG : Jump if Greater > (nhảy nếu lớn hơn)
JL : Jump if Less < (nhảy nếu nhỏ hơn)
JE : Jump if Equal = (nhảy nếu bằng)
JGE (JNL) : Jump if Greater or Equal > = (nhảy nếu lớn hơn hoặc bằng)
JLE (JNG) : Jump if Less or Equal > = (nhảy nếu bé hơn hoặc bằng)
- Nhảy với số không dấu:
JA : Jump if Above > (nhảy nếu lớn hơn)
JB : Jump if Below < (nhảy nếu nhỏ hơn)
JE : Jump if Equal = (nhảy nếu bằng)
JAE (JNB) : Jump if Above or Equal > = (nhảy nếu lớn hơn hoặc bằng)
JBE (JNA) : Jump if Below or Equal > = (nhảy nếu bé hơn hoặc bằng)
- Nhảy với các cờ phép toán:
CF, PF, AF, ZF, SF, OF : 6 cờ phép toán
JC : Jump if CF = 1 Nhảy nếu cờ C = 1
JNC : Jump if CF = 0 Nhảy nếu cờ C = 0
JP : Jump if PF = 1 Nhảy nếu cờ P = 1
JNP : Jump if PF = 0 Nhảy nếu cờ P = 0
JA : Jump if AF = 1 Nhảy nếu cờ A = 1
JNA : Jump if AF = 0 Nhảy nếu cờ A = 0
JZ : Jump if ZF = 1 Nhảy nếu cờ Z = 1
JNZ : Jump if ZF = 0 Nhảy nếu cờ Z = 0
JS : Jump if SF = 1 Nhảy nếu cờ S = 1
JNS : Jump if SF = 0 Nhảy nếu cờ S = 0
JO : Jump if OF = 1 Nhảy nếu cờ O = 1
JNO : Jump if OF = 0 Nhảy nếu cờ O = 0

Chú ý: Bao giờ câu lệnh nhảy có điều kiện cũng đi ngay sau câu lệnh so sánh
- Nếu gặp điều kiện đúng thì MỚI nhảy tới nhãn lệnh
- Nếu gặp điều kiện sai thì THỰC HIỆN ngay lệnh tiếp theo

Cấu trúc điều khiển:


1. Cấu trúc điều kiện: If then ; If then else

VD1: giả sử AX đang chứa 1 số nào đó! Hãy chuyển giá trị tuyệt đối của AX và BX
Phân tích:
- AX đang chứa 1 số nào đó (Số đó có thể âm hoặc dương  sử dụng lệnh nhảy với số có
dấu).
- Xét trường hợp: AX >= 0 thì |AX| = AX (trị tuyệt đối của AX = AX)
- Xét trường hợp: AX < 0 thì |AX| = - AX (trị tuyệt đối của AX = -AX: NEG AX)

CMP AX, 0 ; So sánh nội dung thanh ghi AX với 0


JGE ChuyenBX ; Nếu AX >= 0 thì nhảy tới nhãn lệnh ChuyenBX để cất nội dung AX vào BX
NEG AX ; Đảo dấu của AX = - AX
ChuyenBX: MOV BX, AX ; Cất giá trị tuyệt đối của AX vào BX
VD2: Giả sử AL và BL đang chứa 2 ký tự khác nhau! Hãy hiển thị ký tự nhỏ hơn
Phân tích:
- So sánh AL và BL (Mã ASCII của ký tự là số không dấu). Ta sẽ sử dụng nhảy theo kiểu
số không dấu
- Giả sử AL < BL  chuyển AL sang DL để hiển thị bằng hàm 2 của ngắt 21h
- Giả sử BL < AL  chuyển BL sang DL để hiển thị bằng hàm 2 của ngắt 21h

MOV AH, 2 ; khởi tạo hàm 2


CMP AL, BL ; So sánh AL và BL
JB HTA ; Nếu AL < BL thì HT AL
MOV DL, BL ; Hiển thị BL
JMP HT ; Ngắt để hiển thị
HTA: MOV DL, AL ; Hiển thị AL
HT: INT 21h ; Ngắt

2. Cấu trúc lựa chọn


Xem slide PART 3 có ví dụ
3. Cấu trúc lặp
- Lặp với số lần lặp biết trước:
Thanh ghi CX phải chứa số lần lặp. Sau mỗi lệnh LOOP thì thanh ghi CX tự động giảm
đi 1. Cho đến khi thanh ghi CX = 0 thì thoát ra khỏi vòng lặp
1 dòng ký tự $ trên màn hình: Màn hình tiêu chuẩn là 25 hàng và 80 cột
Do đó nếu hiển thị 1 dòng ký tự có nghĩa là 1 ký tự được hiển thị 80 lần

MOV CX, 80; khởi tạo lặp 80 lần


MOV AH, 2 ; khởi tạo hàm 2 để chuẩn bị hiển thị
MOV DL, ‘$’ ; Chuyển mã ASCII của $ vào DL
HT: INT 21h ; Ngắt để hiển thị
LOOP HT ; hiển thị 80 lần
RA:
-----
- Lặp với số lần lặp không biết trước
+ Repeat Until: Lặp ít nhất 1 lần rồi mới kiểm tra điều kiện
+ While Do: Kiếm tra điều kiện trước rồi mới đi thực hiện công việc
Các ví dụ các em xem ở PART 3
XOR AX, AX ; AX = AX XOR AX (2 thằng giống nhau thì kết quả = 0)
INC : INCREASE TĂNG: I = I + 1; I = I ++

Đọc từ bàn phím cho đến khi gặp ký tự CR thì thôi

MOV AH, 1
nhaplai: INT 21h ; ký tự vừa nhập cất trong thanh ghi AL
CMP AL, ‘CR’
JNE nhap lai ; AL <> CR thì nhập lại còn nếu AL = kí tự CR thì thoát
THOAT:

BTVN:
1. Học thuộc các thanh ghi (tên, nội dung, mục đích sử dụng)
2. Các chế độ địa chỉ (địa chỉ đoạn, độ lệch, logic, vật lý, v.,v)
3. Tập lệnh (hoàn thành theo mẫu thày đã gửi tuần sau nộp)
4. Học thuộc bài hôm nay: Các cấu trúc điều khiển, các lệnh so sánh, lệnh nhảy, các lệnh
với ngắt 21h
5. Tuần sau sẽ ôn tập làm thử đề thi giữa kỳ các năm và giải đáp các câu hỏi
6. Thi giữa kỳ: thi trắc nghiệm chung cho cả khóa đại trà (có thể thêm 1 vài câu tự luận)

You might also like