Giáo trình Vi xử lý (Tiếp) - Trường Đại học SPKT Hưng Yên

Chương 4: CÁC CẤU TRÚC LẬP TRÌNH

4.1. Tổng quan

Trong các ngôn ngữ lập trình bậc cao, người ta thường sử dụng các cấu trúc lập trình cơ

bản sau:

- Cấu trúc tuần tự

- Cấu trúc rẽ nhánh

+ Rẽ một nhánh (IF.THEN.)

+ Rẽ hai nhánh (IF.THEN.ELSE.)

+ Rẽ nhiều nhánh (CASE.OF.)

- Cấu trúc lặp

+ Lặp xác định (FOR.TO.DO)

+ Lặp không xác định

Điều kiện trước (WHILE.DO.)

Điều kiện sau (REPEAT.UNTIL.)

Sau đây ta sẽ nghiên cứu việc biểu diễn các cấu trúc lập trình trên bằng hợp ngữ trong khi

các lệnh của hợp ngữ sẽ thực hiện theo cấu trúc tuần tự. Vì vậy, muốn điều khiển rẽ

nhánh chương trình, chúng ta cần phải thực hiện các lệnh chuyển điều khiển.

4.1.1. Các lệnh chuyển điều khiển

4.1.1.1. Các định hướng

- Định hướng NEAR: Thông thường các lệnh điều khiển rẽ nhánh chương trình được

thực hiện theo định hướng NEAR (Mặc định).

Định hướng này cho phép các lệnh chuyển điều khiển thực hiện trong khoảng ±126 byte.

Có nghĩa là, chỉ có thể nhảy về trước và về phía sau của lệnh 126 byte.

- Định hướng FAR: Nếu có định hướng này, chương trình dịch sẽ cho phép lệnh chuyển

điều khiển rẽ nhánh ra ngoài giới hạn ±126byte.

pdf 37 trang Bích Ngọc 04/01/2024 260
Bạn đang xem 20 trang mẫu của tài liệu "Giáo trình Vi xử lý (Tiếp) - Trường Đại học SPKT Hưng Yên", để tải tài liệu gốc về máy hãy click vào nút Download ở trên

Tóm tắt nội dung tài liệu: Giáo trình Vi xử lý (Tiếp) - Trường Đại học SPKT Hưng Yên

Giáo trình Vi xử lý (Tiếp) - Trường Đại học SPKT Hưng Yên
Giáo trình VI XỬ LÝ  
Bộ môn Kỹ thuật máy tính – Khoa CNTT – ĐHSPKT_HY Trang 55 
Bước 4: Vì tệp chương trình có cấu trúc *.EXE, nên ta có thể bỏ qua bước này. 
Bước 5: Chạy tệp chương trình 
 Vidu_exe ↵ 
Chương 4: CÁC CẤU TRÚC LẬP TRÌNH 
4.1. Tổng quan 
Trong các ngôn ngữ lập trình bậc cao, người ta thường sử dụng các cấu trúc lập trình cơ 
bản sau: 
- Cấu trúc tuần tự 
- Cấu trúc rẽ nhánh 
+ Rẽ một nhánh (IF...THEN....) 
+ Rẽ hai nhánh (IF...THEN...ELSE...) 
+ Rẽ nhiều nhánh (CASE...OF...) 
- Cấu trúc lặp 
+ Lặp xác định (FOR...TO...DO) 
+ Lặp không xác định 
Điều kiện trước (WHILE...DO...) 
Điều kiện sau (REPEAT...UNTIL...) 
Sau đây ta sẽ nghiên cứu việc biểu diễn các cấu trúc lập trình trên bằng hợp ngữ trong khi 
các lệnh của hợp ngữ sẽ thực hiện theo cấu trúc tuần tự. Vì vậy, muốn điều khiển rẽ 
nhánh chương trình, chúng ta cần phải thực hiện các lệnh chuyển điều khiển. 
4.1.1. Các lệnh chuyển điều khiển 
4.1.1.1. Các định hướng 
- Định hướng NEAR: Thông thường các lệnh điều khiển rẽ nhánh chương trình được 
thực hiện theo định hướng NEAR (Mặc định). 
Định hướng này cho phép các lệnh chuyển điều khiển thực hiện trong khoảng ±126 byte. 
Có nghĩa là, chỉ có thể nhảy về trước và về phía sau của lệnh 126 byte. 
- Định hướng FAR: Nếu có định hướng này, chương trình dịch sẽ cho phép lệnh chuyển 
điều khiển rẽ nhánh ra ngoài giới hạn ±126byte. 
Giáo trình VI XỬ LÝ  
Bộ môn Kỹ thuật máy tính – Khoa CNTT – ĐHSPKT_HY Trang 56 
4.1.1.2. Điều kiện cho các lệnh nhảy 
 Các lệnh điều khiển rẽ nhánh chương trình phụ thuộc vào các trạng thái của các 
cờ trong thanh ghi cờ. Vì vậy, ta có thể tạo ra các điều kiện cho các lệnh này bằng một số 
lệnh sau: 
a/ Lệnh CMP (Compare - so sánh) 
Dạng lệnh: CMP toan_hang_1,toan_hang_2 
ý nghĩa: Lệnh này sẽ thực hiện lấy toan_hang_1 trừ đi cho toan_hang_2 và kết quả không 
trả lại cho toan_hang_1. Nhưng nó sẽ tác động đến các cờ trạng thái trong thanh ghi cờ. 
Ví dụ: MOV AL,3Ah ;AL=00111010 
 CMP AL,1Ch ; 
CF= 00111000 
 00111010 
 -00011100 
 00011110 
Như vậy, nếu xét đến các cờ trạng thái thì ta thấy lệnh trên sẽ ảnh hưởng đến cờ như sau: 
CF=0; PF=1; AF=1; ZF=0; SF=0; OF=0. 
b/ Lệnh Test (Kiểm tra) 
Dạng lệnh: TEST toan_hang_1,toan_hang_2 
ý nghĩa: Lệnh này sẽ kiểm tra một bit nào đó của toan_hang_1 với các bit 1 tương ứng ở 
toan_hang_2. 
Ví dụ: TEST AL,1 ;kiểm tra bit0 của AL xem bit này có bằng 1 hay không. Nếu giá trị 
của AL là một số lẻ thì bit0=1. 
4.1.1.3. Các lệnh điều khiển rẽ nhánh 
 Về cơ bản, chúng ta có thể xét đến một số lệnh điều khiển rẽ nhánh đã nghiên 
cứu ở chương 1 phần 1. 
Ví dụ, xét lệnh JE. Lệnh này phụ thuộc vào cờ ZF. Nếu ZF=1 thì lệnh JE mới có 
thể thực hiện được. Song, trên thực tế, khi xét đến điều kiện thực hiện các lệnh nhảy, ta 
chỉ cần quan tâm đến ý nghĩa của các từ viết tắt cho từng loại lệnh nhảy. Các điều kiện đó 
thể hiện như: A - Above; B -Bellow; C - Carry; E - Equal; G - Greater; L - Less; N - Not; 
Z - Zero... nhưng cũng có thể kết hợp với nhau để có các ý nghĩa khác nhau như: NLE; 
NGE; NL; LE; NG; GE; NA; NB; NAE; NBE; AE; BE 
4.2. Cấu trúc tuần tự 
 Cấu trúc tuần tự là một cấu trúc mà trong đó các mã lệnh hợp ngữ được thực hiện 
các công việc theo trình tự hết lệnh này đến lệnh khác. 
Ngữ pháp: 
 Lệnh_1 
Giáo trình VI XỬ LÝ  
Bộ môn Kỹ thuật máy tính – Khoa CNTT – ĐHSPKT_HY Trang 57 
Điều_kiện 
Công_việc 
Sai
Đúng 
 Lệnh_2 
 ........... 
 Lệnh_n 
Ví dụ: Viết một đoạn chương trình thực hiện nhập vào một kí tự từ bàn phím, sau đó in ra 
màn hình kí tự đó tại dòng tiếp theo. 
Giải: 
 MOV AH,1 
 INT 21h 
 MOV AH,2 
 MOV DL,13 
 INT 21h 
 MOV DL,10 
 INT 21h 
 MOV DL,AL 
 INT 21h 
4.3. Cấu trúc rẽ nhánh 
4.3.1. Cấu trúc IFTHEN 
Đây là cấu trúc điều khiển rẽ nhánh 
chương trình với việc kiểm tra điều kiện. 
Nếu điều kiện thoả mãn thì thực hiện công 
việc. Nếu điều kiện không thoả mãn thì bỏ 
qua công việc này. 
Ngữ pháp: 
 IF điều_kiện THEN công_việc 
Ví dụ: Viết một đoạn chương trình thực 
hiện nhập vào một kí tự. Nếu là kí tự 'A' 
thì hiển thị tại dòng tiếp theo. 
Giải: 
 MOV AH,1 ;Nhap vao tu ban phim mot ki tu 
 INT 21h ;ki tu do nam trong AL 
 CMP AL,41h 
 JNE ketthuc 
 PUSH AX ;Cat tam ki tu nay vao ngan xep 
 MOV Ah,2 ;Dua con tro 
 MOV DL,13 ;xuong dong tiep theo 
 INT 21h 
Giáo trình VI XỬ LÝ  
Bộ môn Kỹ thuật máy tính – Khoa CNTT – ĐHSPKT_HY Trang 58 
 MOV DL,10 ;ve ve dau dong 
 INT 21h 
 POP DX ;Lay ki tu ra va dua truc tiep vao DL 
 INT 21h ;In ra man hinh 
Ketthuc: 
 MOV AH,4Ch 
 INT 21h 
Đoạn chương trình trên sẽ thực hiện cho phép người sử dụng nhập vào từ bàn phím một 
kí tự. Sau đó, so sánh với mã ASCII của 'A'. Nếu không bằng thì sẽ thực hiện các lệnh 
sau lệnh "JNE ketthuc" rồi mới kết thúc. Nếu không, máy sẽ bỏ qua các lệnh đó và kết 
thúc chương trình bằng hàm ngắt 4Ch của ngắt 21h. 
4.3.2. Cấu trúc IF..THENELSE 
Trong thực tế, chúng ta thường đưa ra một điều 
kiện nào đó. Nếu trường hợp thoả mãn thì sẽ 
thực hiện một công việc nào đó. Ngược lại, sẽ 
không thực hiện một công việc khác. 
Ngữ pháp: 
 IF điều_kiện THEN 
 công_việc_1 
 ELSE 
 công_việc_2 
 END_IF 
Ví dụ: Viết 1 đoạn chương trình hợp ngữ thực hiện nhập vào từ bàn phím một kí tự. Nếu 
kí tự nhập vào có mã ASCII nhỏ hơn mã ASCII của số 1 thì đưa ra màn hình thông báo 
"Kí tự này đứng trước '1' trong bảng mã", ngược lại, đưa ra màn hình thông báo "Kí tự 
này đứng sau '1' trong bảng mã" 
Giải: Đoạn chương trình được thể hiện như sau: 
* Giả thiết: thông báo "Kí tự này đứng trước '1' trong bảng mã" được lưu trong biến 
truoc, thông báo "Kí tự này đứng sau '1' trong bảng mã" được lưu trong biến sau 
Đoạn chương trình được viết như sau: 
 ;Nhap ki tu tu ban phim 
 mov ah,1 
 int 21h 
 ;Bat dau cau truc 
 cmp AL,'1' ;so sanh ki tu nhap vao voi '1' 
 JL then_ 
Điều_kiện 
Công_việc 1 
Sai 
Đúng 
Công_việc 2 
Giáo trình VI XỬ LÝ  
Bộ môn Kỹ thuật máy tính – Khoa CNTT – ĐHSPKT_HY Trang 59 
 MOV AH,9 
 LEA DX,sau 
 INT 21h 
 JMP End_if 
 then_: 
 MOV AH,9 
 LEA DX,truoc 
 INT 21h 
 end_if: 
4.3.3. Cấu trúc rẽ nhánh CASEOF 
Là một cấu trúc đa nhánh. Nó kiểm tra các thanh ghi, các biến hay các giá trị riêng rẽ 
trong miền giá trị. 
Ngữ pháp: 
CASE biểu_thức 
Giá_trị_1: công_việc_1 
Giá_trị_2: công_việc_2 
................. 
Giá_trị_n: công_việc_n 
END CASE 
Như vậy, nếu biểu thức bằng giá trị nào, thì công việc tương ứng sẽ được thực hiện. 
Ví dụ: Viết một đoạn chương trình thực hiện nhập vào một kí tự. Nếu kí tự đứng trước 'A' 
trong bảng mã ASCII thì đưa ra thông báo kí tự đứng trước 'A'. Nếu kí tự nhập vào là 'A' 
thì đưa ra thông báo chính là kí tự 'A'. Nếu đứng sau 'A' thì đưa ra thông báo kí tự đứng 
sau 'A'. 
Giải: Giả thiết các biến truoc, dung, sau chứa nội dung là các chuỗi thông báo cần đưa ra. 
Ta có thể thực hiện đoạn chương trình như sau: 
 ;Nhap vao ki tu 
 mov ah,1 
 int 21h 
 ;CASE... OF.... 
 CMP AL,'A' 
 JL L1 
 JE L2 
 JG L3 
 L1: 
 MOV AH,9 
Biểu thức
Công việc 1 Công việc 2 Công việc n 
Giá trị 1 Giá trị 2 Giá trị n 
Giáo trình VI XỬ LÝ  
Bộ môn Kỹ thuật máy tính – Khoa CNTT – ĐHSPKT_HY Trang 60 
 LEA DX,TRUOC 
 INT 21H 
 JMP END_ 
 L2: 
 MOV AH,9 
 LEA DX,DUNG 
 INT 21H 
 JMP END_ 
 L3: 
 MOV AH,9 
 LEA DX,SAU 
 INT 21H 
 END_: 
4.3.4. Cấu trúc rẽ nhánh với điều kiện kép 
Là một dạng cấu trúc rẽ nhánh mà trong đó, điều kiện là một sự kết hợp của hai 
hay nhiều điều kiện khác nhau. Điều kiện kép có hai dạng 
1/ Điều kiện kết hợp AND 
Là cấu trúc rẽ nhánh mà trong đó có nhiều điều kiện kết hợp. Nếu tất cả các điều kiện đều 
thoả mãn thì công việc sẽ được thực hiện. Ngược lại, có thể thực hiện một công việc khác 
hoặc không thực hiện gì. 
Ví dụ: Viết một đoạn chương trình thực hiện nhập vào từ bàn phím một kí tự. Kiểm tra 
xem phím nhập vào có phải là chữ số không 
Giải: 
 mov ah,1 
 int 21h 
 CMP AL,'0' 
 JL END_IF 
 CMP AL,'9' 
 JG END_IF 
 ;THEN 
 MOV AH,9 
 LEA DX,SO 
 INT 21H 
 END_IF: 
 MOV AH,4Ch 
 INT 21h 
Giáo trình VI XỬ LÝ  
Bộ môn Kỹ thuật máy tính – Khoa CNTT – ĐHSPKT_HY Trang 61 
2/ Điều kiện kết hợp OR 
Là cấu trúc rẽ nhánh mà trong đó có nhiều điều kiện kết hợp. Nếu một trong các điều 
kiện đều thoả mãn thì công việc sẽ được thực hiện. Ngược lại, nếu tất cả các điều kiện 
không được thoả mãn thì có thể thực hiện một công việc khác hoặc không thực hiện gì. 
Ví dụ: Viết một đoạn chương trình thực hiện nhập vào từ bàn phím một kí tự. Kiểm tra 
xem phím nhập vào có phải là 'Y' hoặc 'y' không 
Giải: Giả thiết có hai biến. yeucau chứa thông báo nhập vào; dung chứa thông báo kí tự 
nhập vào đúng là 'y' hoặc 'Y'. Đoạn chương trình sẽ được viết ra như sau: 
 MOV AH,9 
 LEA DX,yeucau 
 INT 21h 
 mov ah,1 
 int 21h 
 CMP AL,'Y' 
 JE THEN_ 
 CMP AL,'y' 
 JE THEN_ 
 JMP END_IF 
 THEN_: 
 MOV AH,9 
 LEA DX,DUNG 
 INT 21H 
 END_IF: 
 MOV AH,4Ch 
 INT 21h 
4.4. Cấu trúc lặp 
4.4.1. Cấu trúc FORTODO 
Đây là một dạng cấu trúc lặp với số lần lặp đã 
được xác định. 
Ngữ pháp: 
FOR số_lần_lặp DO công_việc 
Đầu tiên, gán cho thanh ghi đếm CX một giá trị 
bằng số lần lặp. Sau đó, thực hiện công việc. 
Sau mỗi lần lặp, giảm giá trị trong thanh ghi CX 
đi 1 đơn vị và kiểm tra nó với 0. Nếu chưa bằng 0 
CX=số_lần_lặp 
Công_việc 
CX=CX-1 
CX=0? 
Sai
Đúng 
Giáo trình VI XỬ LÝ  
Bộ môn Kỹ thuật máy tính – Khoa CNTT – ĐHSPKT_HY Trang 62 
thì tiếp tục thực hiện công viêc... cho tới khi CX=0. 
Trong tập lệnh của bộ vi xử lý 8086 tồn tại một lệnh sử dụng phù hợp trong cấu trúc này. 
Đó là lệnh LOOP. 
Lệnh này tự động giảm thanh ghi CX 1 đơn vị và sau đó so sánh CX với 0. 
Ví dụ: Viết một đoạn chương thực hiện nhập vào từ bàn phím một kí tự. Sau đó cho hiển 
thị nó 200 lần trên màn hình 
Giải: 
 MOV AH,9 
 LEA DX,YEUCAU 
 INT 21H 
 MOV CX,200 
 MOV AH,1 
 INT 21H 
 PUSH AX 
 MOV AH,2 
 MOV DL,13 
 INT 21H 
 MOV DL,10 
 INT 21H 
 POP AX 
 MOV AH,2 
 FOR_: 
 MOV DL,AL 
 INT 21H 
 LOOP FOR_ 
4.4.2. Cấu trúc WHILEDO 
Là một cấu trúc lặp phụ thuộc vào một điều kiện. 
Ngữ pháp: 
WHILE điều_kiện DO công_việc 
Công_việc sẽ được thực hiện cho đến khi 
điều_kiện trở nên sai 
Ví dụ: Viết một đoạn chương trình thực hiện đếm 
số kí tự nhập vào từ bàn phím 
Giải: 
XOR CX,CX 
Điều_kiện 
Công_việc 
Đúng sai 
Giáo trình VI XỬ LÝ  
Bộ môn Kỹ thuật máy tính – Khoa CNTT – ĐHSPKT_HY Trang 63 
 MOV AH,1 
 WHILE_: 
 INT 21H 
 CMP AL,13 
 JE END_WHILE 
INC CX 
 JMP WHILE_ 
 END_WHILE: 
 MOV AH,4CH 
 INT 21H 
4.4.3. Cấu trúc REPEATUNTIL 
Ngữ pháp: 
REPEAT 
 cong_việc 
UNTIL điều_kiện 
Đây là cấu trúc lặp mà trong đó công_việc thực 
hiện trước, sau đó mới kiểm tra điều_kiện. Nếu 
điều_kiện đúng thì kết thúc quá trình lặp. Ngược 
lại, nếu điều_kiện vẫn còn sai thì quay trở lại thực hiện công_việc... 
Ví dụ: Viết một đoạn chương trình thực hiện nhập vào từ bàn phím một chuỗi kí tự kết 
thúc bằng việc nhấn phím ENTER 
Giải: 
 MOV AH,9 
 LEA DX,YEUCAU 
 INT 21H 
 REPEAT_: 
 MOV AH,1 
 INT 21H 
 CMP AL,13 
 JNE REPEAT_ 
 MOV AH,4Ch 
 INT 21h 
4.5. Cấu trúc chương trình con 
Nhằm mục đích làm cho chương trình ngắn gọn và dễ hiểu, thông thường người ta 
thực hiện chia nhỏ chương trình thành các Module khác nhau, mỗii Module có thể thực 
Điệu_kiện 
Công_việc 
Đúng 
sai 
Giáo trình VI XỬ LÝ  
Bộ môn Kỹ thuật máy tính – Khoa CNTT – ĐHSPKT_HY Trang 64 
hiện một hoặc một khèi công việc nhất định. Mỗi một Module đó được gọi là một chương 
trình con. 
Trong lập trình hợp ngữ thông thường người ta chỉ sử dụng một loại chương trình 
con thủ tục. Cấu trúc của chương trình con loại này được thực hiện như sau: 
4.5.1. Cấu trúc của chương trình con 
1/ Cấu trúc: 
 PROC [kiểu] 
 ;Thân chương trình con 
 ;.................................... 
 RET 
 ENDP 
Trong đó: 
+ Tên ctc: Là tên Chương trình con m người sử dụng tự đặt theo qui định đặt tên của 
ASSEMBLY 
+ PROC, ENDP: Các lệnh giả được thực hiện để khai báo bắt đầu và kết thúc chương 
trình con. 
+ kiểu: có thể là NEAR hoặc FAR. 
- NEAR (Mặc định) có nghĩa là dòng lệnh gọi thủ tục ở cùng đoạn với thủ tục đó. 
- FAR có nghĩa là dòng lệnh gọi thủ tục ở trong một đoạn khác. 
2/ Ví dụ: 
 xoamh PROC 
 MOV AH,0 
 MOV AL,3 
 INT 10h 
 RET 
 xoamh ENDP 
3/ Một số chú ý: 
- Tránh trường hợp sau khi thực hiện xong chương trình con, nội dung các thanh ghi có 
thể bị thay đổi, thường người ta sử dụng lệnh PUSH và POP trong chương trình con để 
đưa tạm vào ngăn xếp và sau đó lấy lại cho các thanh ghi. Ví dụ trong đoạn chương trình 
trên, sau khi thực hiện chương trình con xong, nội dung của thanh ghi AX có thể bị thay 
đổi. Ta có thể viết lại như sau: 
 xoamh PROC 
 PUSH AX ; đẩy tạm AX vào ngăn xếp 
 MOV AH,0 
 MOV AL,3 
Giáo trình VI XỬ LÝ  
Bộ môn Kỹ thuật máy tính – Khoa CNTT – ĐHSPKT_HY Trang 65 
 INT 10h 
 POP AX ;lấy lại giá trị cũ từ ngăn xếp cho AX 
 RET ;sau đó trở về chương trình chính 
 xoamh ENDP 
- Để người khác có thể đọc và hiểu rõ thủ tục thực hiện như thế nào thì, người lập trình 
phải có một đoạn giải thích như sau: 
;Chức năng của thủ tục 
;Vào: (lấy thông tin từ chương trình gọi) 
;Ra: (Trả thông tin đã được xử lý về cho chương trình gọi) 
;Cách sử dung (nếu có) 
Ví dụ: Viết một thủ tục thực hiện nhân 2 số nguyên dương A và B bằng cách cộng và 
dịch các bit. 
Thuật toán: 
tich=0 
Repeat 
 if LSB(B)=1 
 then 
 tich=tich+A 
 end_if 
 SHL A,1 
 SHR B,1 
until B=0 
Đoạn mã: 
nhan PROC 
;Nhan 2 so A,B bang phep dich va cong cac bit 
;Vao: AX=A;BX=B 
;Ra: DX=ket qua 
PUSH AX ;day tam AX 
PUSH BX ;va BX vao ngan xep 
XOR DX,DX ;xoa thanh ghi DX chua tich 
REPEAT: 
;if B le 
TEST BX,1 ;bit LSB cua BX bang 1? 
JZ END_IF ;Khong, dich trai AX.... 
;then 
Giáo trình VI XỬ LÝ  
Bộ môn Kỹ thuật máy tính – Khoa CNTT – ĐHSPKT_HY Trang 66 
ADD DX,AX ;tich=tich+A 
END_IF: 
SHL AX,1 ;dich trai AX 
SHR BX,1 ;dich phai BX 
;until B=0 
JNZ REPEAT ;B 0, lap lai 
POP BX ;Khoi phuc lai BX 
POP AX ;va AX tu ngan xep 
RET 
nhan ENDP 
4.5.2. Cách gọi và thực hiện một chương trình con 
Sau khi đó lập được một thủ tục, người lập trình chỉ việc gọi chúng ra từ một đoạn 
chương trình nào đó như sau: 
CALL 
Việc gọi chương trình con rất đơn giản, song có một số chú ý khi ta thực hiện với 
chương trình con. 
4.5.2.1. Chương trình con nằm trong cùng một chương trình 
1/ Cách gọi. 
Nếu đoạn chương trình con nằm trong cùng một chương trình, thì ta có thể gọi và thực 
hiện theo mẫu sau. Ví dụ: 
Title ctchinh 
.MODEL Small 
.STACK 100h 
.DATA 
 ;khai báo dữ liệu cho chương trình 
.CODE 
Main PROC 
MOV AX,@data 
MOV DS,AX 
;Các lệnh của chương trình chính 
CALL ctc 
;Các lệnh của chương trình chính 
Main ENDP 
Ctc PROC 
;Các lệnh của chương trình con 
RET 
Giáo trình VI XỬ LÝ  
Bộ môn Kỹ thuật máy tính – Khoa CNTT – ĐHSPKT_HY Trang 67 
Ctc ENDP 
END Main 
2/ Ví dụ: Viết một chương trình nhập vào một kí tự, sau đó in ra ở dòng tiếp t ...  dài và khó hơn, nhưng 
lại thực hiện nhanh hơn một chương trình tương tự viết bằng ngôn ngữ bậc cao (Turbo 
PASCAL, C++,...). Vì vậy, để một chương trình viết kết hợp về tốc độ của hợp ngữ và 
tính dễ hiểu, ngắn gọn của ngôn ngữ lập trình bậc cao, các lập trình viên thường viết một 
số Modul chương trình cần đến việc xử lý nhanh bằng hợp ngữ, các lục phân) trực tiếp 
vào trong chương trình taij vị trí bất kỳ (có thể trong thủ tục, hàm hoặc chương trình 
chính). Phương pháp này được thực hiện bởi thủ tục INLINE. 
Giáo trình VI XỬ LÝ  
Bộ môn Kỹ thuật máy tính – Khoa CNTT – ĐHSPKT_HY Trang 81 
6.1.1. Cú pháp 
 INLINE(val/val/val/.../val); 
Trong đó: val: Là các giá trị và phải được phân cách bằng dấu “ / ” 
Các giá trị có thể là dạng thập phân, thập lục phân hoặc nhị phân. Các giá trị này chính là 
các lệnh mã máy thực hiện thao tác nào đó. 
Các giá trị thuộc kiểu dữ liệu 8 bit sẽ tạo ra 1byte mã lệnh hoặc dữ liệu, các giá trị thuộc kiểu 
dữ liệu 16 bit sẽ tạo ra 2 byte mã lệnh hoặc dữ liệu. 
6.1.2. Thực hiện 
Khi gặp phát biểu INLINE, PASCAL sẽ chuyển các giá trị trong đó sang các mã 
máy tương ứng và máy sẽ trực tiếp thực hiện. Chương trình dịch sẽ không phải tốn nhiều 
thời gian cho việc dịch lệnh. Vì vậy, việc thực hiện lệnh được nhanh hơn. 
6.1.3. Một số chú ý 
Các giá trị nếu được biểu diễn dưới dạng thập lục phân thì phải có dấu “ $ ” đứng 
trước. 
Có thể ghép các biến của PASCAL vào vị trí các giá trị thích hợp bằng cách trước 
tên biến sử dụng dấu “ < ” 
Các phát biểu INLINE có thể viết tách ra hoặc gộp lại 
Nếu phát biểu INLINE nội dung của một hàm nào đó thì giá trị trả lại của hàm 
phải tuân thủ quy định sau: 
Kiểu dữ liệu Giá trị trả lại 
Byte 
Boolean 
Char 
Liệt kê (8 bít) 
Shortint 
AL 
Word 
Integer 
Liệt kê (16 bít) 
AX 
Longint DX: AX 
Real DX:BX:AX 
6.1.4. Ví dụ 
Viết một chương trình sử dụng phát biểu INLINE thực hiện tính tổng hai số. 
Giải: 
Program thu; 
Uses crt; 
Giáo trình VI XỬ LÝ  
Bộ môn Kỹ thuật máy tính – Khoa CNTT – ĐHSPKT_HY Trang 82 
Var so1,so2:integer; 
(*---------------------------------------------*) 
Function sum(num1:integer;num2:integer):integer; 
 Begin 
 Inline($8B/$46/<num1/ {AX <-- num1} 
 $03/$46/<num2/ {AX <-- num2} 
 $89/$46/$FE); {[BP-2] <--AX} 
 End; {Gia tri tra lai chuyen qua ngan xep} 
(*--------------------------------------------*) 
Begin 
 Clrscr; 
 Write('So thu nhat: ');Readln(so1); 
 Write('So thu hai : ');Readln(so2); 
 Writeln('Tong cua hai so la: ',sum(so1,so2)); 
 Readln; 
End. 
Viết chương trình sử dụng phát biểu INLINE thực hiện việc hiển thị một ký tự ra màn 
hình đồ hoạ. 
Giải: 
Program man_hinh; 
 Begin 
 Inline($B4/$00/ {MOV AH,00 ;Ham lap che do man hinh} 
 $B0/$12/ {MOV AL,12h ;Che do 640*480*16} 
 $CD/$10); {INT 10h ;Lap che do} 
 Inline($B4/$0B/ {MOV AH,0Bh ;lap mau nen va vien } 
 $B7/$00/ {MOV BH,0 ;Trang man hinh 0 } 
 $B3/$03/ {MOV BL,0 ;mau vien va nen} 
 $CD/$10); {INT 10h ;Dat mau} 
 Inline($B4/$02/ {MOV AH,02 ;Ham dat vi tri con tro} 
 $B7/$00/ {MOV BH,00 ;Trang so 0} 
 $B6/$0C/ {MOV DH,0ch ;Toa do y} 
 $B2/$28/ {MOV DL,28h ;Toa do X} 
 $CD/$10); {INT 10h ;Dat con tro} 
 Inline($B4/$09/ {MOV AH,09 ;Ham ghi ky tu} 
 $B0/$41/ {MOV AL,01 ;Ma ASCII cua ky tu} 
Giáo trình VI XỬ LÝ  
Bộ môn Kỹ thuật máy tính – Khoa CNTT – ĐHSPKT_HY Trang 83 
 $B3/$04/ {MOV BL,04 ;Mau cua ky tu } 
 $B9/$01/$00/{MOV CX,01 ;So lan lap lai ky tu} 
 $CD/$10); {INT 10h ;Ghi ky tu} 
 Readln; 
End. 
6.2. Lập trình mã lệnh gợi nhớ 
6.2.1. Chèn khối lệnh ASSEMBLY 
6.2.1.1. Cú pháp 
 PASCAL hỗ trợ một lệnh chèn đoạn mã lệnh gợi nhớ (MNEMONIC) của hợp ngữ 
vào bất cứ vị trí nào cần thiết trong chương trình. Cú pháp thực hiện như sau: 
 ASM 
 {Khối các lệnh hợp ngữ} 
 END; 
Trong đó: 
ASM, END là từ khoá cho biết vị trí bắt đầu và kết thúc của đoạn mã 
{Khối các lệnh hợp ngữ} là các mã lệnh gợi nhớ của hợp ngữ. 
6.2.1.2. Thực hiện 
 Khi chương trình dịch của PASCAL gặp từ khoá ASM trong dòng lệnh thì nó sẽ 
chuyển dòng lệnh ASSEMBLY vào và dịch với việc quy chiếu biến PASCAL ra dạng 
tương ứng của ASSEMBLY để thực hiện. 
 Nếu biến kiểu Integer thì chương trình dịch sẽ quy chiếu sang dạng DW của 
Assembly. 
6.2.1.3. Một số chú ý 
Lời chú thích, chú giải cần phải có với mỗi lệnh hợp ngữ và phải tuân thủ theo quy định 
của PASCAL. 
Các lệnh nhảy của Assembly có thể nhảy ra ngoài phần lệnh ngôn ngữ PASCAL hoặc 
đoạn lệnh bên trong phần lệnh hợp ngữ, nhưng lệnh nhảy của PASCAL không thể nhảy 
đến nhãn trong phần lệnh hợp ngữ. 
Các nhãn (nếu có) trong phần lệnh của Assembly phải có dấu '@' đứng trước. 
Các lệnh hợp ngữ phải kết hợp chính xác, tránh hiện tượng treo máy. 
6.2.1.4. Ví dụ 
Viết một chương trình thực hiện việc đưa ra số nhỏ nhất và lớn nhất trong hai số. 
Giáo trình VI XỬ LÝ  
Bộ môn Kỹ thuật máy tính – Khoa CNTT – ĐHSPKT_HY Trang 84 
Lời giải 
Thuật toán tìm số nhỏ nhất: Thuật toán tìm số lớn nhất: 
Mã lệnh: 
Program min_max; 
Uses crt; 
Var 
 so1,so2:integer; 
{*---------------------------------------------*} 
Function min(num1:integer;num2:integer):integer; 
Var 
 tg:integer; 
 BEGIN 
 ASM 
 MOV AX,num1 {AX:=num1} 
 CMP AX,num2 {If AX>num2 then} 
 JNG @END_If 
 MOV AX,num2 {AX:=num2} 
 @END_If: {tg:=AX} 
 MOV tg,AX 
 END; 
 min:=tg; 
END; 
{*---------------------------------------------*} 
Function max(num1:integer;num2:integer):integer; 
AX:=số thứ 1 
AX >số thứ 2 
AX:=số thứ 2 
Min:=AX 
Sai 
Đúng 
AX:=số thứ 1 
AX<số thứ 2 
AX:=số thứ 2 
Max:=AX 
Sai 
Đúng 
Giáo trình VI XỬ LÝ  
Bộ môn Kỹ thuật máy tính – Khoa CNTT – ĐHSPKT_HY Trang 85 
LABEL END_IF; 
 Begin 
 ASM 
 MOV AX,num1 {AX:=num1} 
 CMP AX,num2 {If AX<num2 then} 
 JNL END_IF {Begin} 
 MOV AX,num2 {AX:=num2} 
 MOV num1,AX {END} 
 END; 
END_IF: 
 max:=num1; {Gia tri tra lai cua ham} 
END; 
(*--------------------------------------------*) 
Begin 
 Clrscr; 
 Write('So thu nhat:');Readln(so1); 
 Write('So thu hai :');Readln(so2); 
 Write('So nho nhat la: ',min(so1,so2)); 
 Write('So lon nhat la: ',max(so1,so2)); 
 Readln; 
END. 
6.3. Ngắt và lập trình ngắt trong ngôn ngữ bậc cao 
ASSEMBLY là một ngôn ngữ lập trình tác động trực tiếp tới các thành phần phần 
cứng. Các thành phần phần cứng này có thể tác động bằng địa chỉ cổng, song cũng có thể 
tác động bằng các ngắt. 
Việc tác động bằng ngắt đã được qui định cho từng thiết bị ngoại vi cũng như các 
thành phần khác trong máy tính. Hệ điều hành đã qui định chúng trong các ngắt mềm. 
6.3.1. Khái niệm về ngắt 
Ngắt là quá trình CPU tạm thời ngừng 
hoạt động hiện tại khi có một yêu cầu ngắt gọi 
đến để chuyển sang thực hiện chương trình con 
phục vụ ngắt tương ứng. Sau khi thực hiện 
xong thì quay trở lại thực hiện tiếp công việc 
đang dở trên. 
CT chính 
CT con phục vụ ngắt 
Giáo trình VI XỬ LÝ  
Bộ môn Kỹ thuật máy tính – Khoa CNTT – ĐHSPKT_HY Trang 86 
6.3.2. Phân loại ngắt 
Hình 3: Phân loại các ngắt. 
1/ Ngắt cứng là ngắt do các thành phần phần cứng gây ra. 
- Ngắt trong: Là các ngắt xảy ra ngay bên trong CPU. 
- Ngắt ngoài: Là các ngắt do các thành phần phần cứng khác gây ra. 
+ Ngắt có cấm (Maskable Interrupt) là các ngắt chỉ được thực hiện khi cờ IF được thiết 
lập (IF=1) 
+ Ngắt không cấm (Non Maskable Interrupt) là các ngắt có thể thực hiện được ngay cả 
khi cờ IF không được thiết lập. 
2/ Ngắt mềm là các ngắt nằm bên trong chương trình phần mềm. 
- Ngắt của người sử dụng là các ngắt được viết ra bởi những chương trình của người sử 
dụng. 
- Ngắt hệ thống là các ngắt nằm bên trong các chương trình của BIOS hoặc hệ điều hành 
(ví dụ: DOS) 
+ Ngắt DOS là các ngắt nằm bên trong chương trình của DOS trong Module vào/ra 
(IO.SYS) 
+ Ngắt BIOS là các ngắt nằm bên trong chương trình của BIOS. 
6.3.3. Giới thiệu về một số ngắt 
6.3.3.1. Cách thực hiện ngắt trong một số ngôn ngữ lập trình 
1.Gọi ngắt trong ASSEMBLY 
Một số ngắt thông thường cể các tham số đầu vào.Phô thuộc vào các tham số 
này,chương trình sẽ thực hiện giải quyết và đưa ra các tham số đầu ra. 
Các tham số đầu vào là các giá trị chuyển tới các thanh ghi hoặc ô nhớ nào đã 
Các tham đầu ra là các giá trị nhận được sau khi hàm này xử lý xong . 
Để gọi ngắt trong ASSEMBLY ta có thể thực hiện theo mẫu sau: 
- Chuyển các tham số đầu vào 
- Gọi ngắt INT 
 Ng¾t 
Ng¾t cøng Ng¾t mÒm 
Ng¾t ngoµi Ng¾t trong Ng¾t cña ng−êi 
sö dông 
Ng¾t hÖ 
thèng 
BIOS DOS Kh«ng cÊmCã cÊm 
Giáo trình VI XỬ LÝ  
Bộ môn Kỹ thuật máy tính – Khoa CNTT – ĐHSPKT_HY Trang 87 
- Xử lý các tham số đầu ra 
Ví dụ : MOV AH,01h ;Nhập vào một kí tự 
 INT 21h ;Kí tự nằm trong AL 
 MOV DL,AL ;Lấy từ AL sang DL 
 INT 21h ;Hiển thị 
2.Gọi ngắt trong PASCAL 
Việc gọi ngắt trong PASCAL cũng được thực hiện theo mẫu trên.Song phải theo một 
số quy định sau: 
- Các lệnh được sử dụng là các lệnh của PASCAL. Lệnh gán tương đương với lệnh 
MOV trong ASSEMBLY 
- Nếu sử dụng hệ đếm thập lục phân,thì phải cài đặt dấu ‘$’ đứng trước mỗi số đó. 
- Muốn tác động trực tiếp tới các thanh ghi của bộ vi xử lý ,ta phải sử dụng biến có 
kiểu là REGISTERS. kiểu này được quy định trong UNIT DOS như sau: 
+ Kiểu REGISTERS được khai báo trong UNIT DOS: 
 TYPE 
 REGISTERS=RECORD 
 CASE integer OF 
 0:(AX,BX,CX,DX,BP,SI,DI,DS,ES,Flags:word); 
 1:(AL,AH,BL,BH,CL,CH,DL,DH:Byte); 
 END; 
+ Các thanh ghi của bộ vi xử lý được quy định bằng các tên biến. Muốn truy nhập đến 
các biến này, ta phải quy định về kiểu bản ghi. Ví dụ : R là biến kiểu REGISTERS 
 =>R.AH:=$01; hoặc with R do AH:=$01; 
- Muốn gọi ngắt trong PASCAL, có thể sử dụng thủ tục: 
 INTR(,); 
Ví dụ : R là biến kiểu REGISTERS => INTR($ 10,R); 
- Riêng với số hiệu ngắt 21h ta có thể sử dụng thủ tục 
 MSDOS(); 
Ví dụ: INTR($21,R); MSDOS(R); 
6.3.3.2. Một số ngắt thông dụng 
Ngắt 21h: Ngắt chức năng của DOS 
Hàm 01h: Vào một kí tự từ bàn phím và hiển thị ra màn hình 
Mô tả Ví dụ minh hoạ 
Vào: AH=01h 
Ra: AL=Mã ASCII của kí tự nhập vào 
MOV AH,01H 
INT 21H 
Giáo trình VI XỬ LÝ  
Bộ môn Kỹ thuật máy tính – Khoa CNTT – ĐHSPKT_HY Trang 88 
MOV ktu,AL 
Hàm 02h: In một ký tự ra màn hình văn bản 
Vào AH=02h 
DL= mã ASCII của kí tự nhập vào 
Ra Không 
MOV AH,02H ;In ra màn hình 
MOV DL,’A’ ; chữ ’A’ 
INT 21H 
 Hàm 08h: Vào một kí tự từ bàn phím,không hiển thị kí tự ra màn hình 
Vào AH=01h 
Ra AL= mã ASCII của kí tự nhập vào 
MOV AH,08H 
INT 21H 
MOV ktu,AL 
Hàm 09h: In một chuỗi kí tự ra màn hình 
Vào AH=09h 
DS:DX=Con trỏ đến chuỗi kết thúc 
bằng ‘$’ 
Ra Không 
MOV AH,09H 
LEA DX,chuỗi 
INT 21H 
Hàm 4Ch: Kết thúc chương trình .EXE 
Vào : AH=4Ch 
Ra : Không 
MOV AH,4CH 
INT 21H 
 Hàm 2Ah: Xác định ngày tháng 
Vào : AH=2Ah 
Ra : AL=ngày trong tuần(0-6) 
CX=năm(1980-2099) 
DH=tháng(1-12) 
DL=ngày(1-31) 
R.AH:=$2A 
INTR($21,R) 
Ngay-tuan:=R.AL; 
Nam:=R.CX; 
Thang:=R.DH; 
Ngay:=R.DL; 
Hàm 2Bh: Đặt ngày tháng (Đặt lại ngày hệ thống) 
Vào : AH= 2Bh 
CX=năm(1980-2099) 
DH=tháng(1-12) 
DL= ngày(1-31) 
Ra : AL=0 nếu ngày hợp lệ; 
AL=FFh nếu ngày không hợp lệ 
R.AH:=$2B; 
Nam:=R.CX; 
Thang:=R.DH; 
Ngay:=R.DL; 
INTR($21,R); 
IF R>AL=0 then write(‘OK!’); 
Else write(‘Not OK!’); 
Hàm 2Ch: Xác định thời gian hệ thống 
Giáo trình VI XỬ LÝ  
Bộ môn Kỹ thuật máy tính – Khoa CNTT – ĐHSPKT_HY Trang 89 
Vào: AH=2Ch 
Ra : CH=giờ(0-23) 
CL=phút(0-59) 
DH=giây(0-59) 
DL=phần trăm giây(0-99) 
R.AH:=$2C; 
NTR($21,R); 
Gio:=R.CH; 
Phut:=R.CL; 
Giay:=R.DH; 
Phan_tram:=R.DL 
Hàm 2Dh: Đặt thời gian (Đặt lại thời gian hệ thống) 
Vào: AH=2Dh 
CH=giờ(0-23) 
CL=phút(0-59) 
DH=giây(0-59) 
DL=phần trăm giây(0-99) 
Ra : AL=0 nếu thời gian hợp lệ 
AL=FFh nếu thời gian không hợp lệ 
R.AH:=$2D; 
R.CH:=gio; 
R.CL:=phut; 
R.DH:=giay; 
R.DL:=phan_tram; 
INTR($21,R); 
If R.AL=0 then write(‘OK!’) 
Else write(‘Not OK!’); 
Hàm 30h: Xác định số phiên bản của DOS 
Vào : AH=30h 
Ra : BX=0000h 
CX=0000h 
AL=số trước dấu phẩy 
AH=số sau dấu phẩy 
R.AH:=30H 
INTR($21,R); 
Ver1:=R.AL; 
Ver2:=R.AH; 
Write(‘MS_DOS Version ‘,ver1,’,’,ver2) 
Hàm 36h: Xác định dung lượng còn trống trên đĩa 
Vào :AH=36h 
DL=ổ đĩa(0_mặc định;1_A;1_B;...) 
Ra : BX=Số liên cung chưa dùng 
CX=Số byte/cung 
DX=Số liên cung / đĩa 
AX=FFFFh nếu ổ đĩa không hợp lệ=số 
cung/liên cung(hợp lệ) 
R.AH:=36H; 
R.DL:=1; 
INTR($21,R); 
Free_cyl:=R.BX; 
Bps:=R.CX; {byte per sector} 
Cpd:=R.DX; {cylinder per dick} 
If AX=$FFFF then write(‘No Dick’) 
Else spc:=R.AX; {sector per cylinder); 
Ngắt 10h: Ngắt màn hình 
 Hàm 00h: Chọn chế độ hiển thị cho màn hình 
Giáo trình VI XỬ LÝ  
Bộ môn Kỹ thuật máy tính – Khoa CNTT – ĐHSPKT_HY Trang 90 
Vào: AH=0h 
AL=chế độ 
03h:Text 80*25*16 
12h:Grapt 640*480*16 
13h: Grapt 320*200*256 
Ra : Không 
R.AH:=0h; 
R.AL:=mode; 
INTR($10,R); 
Hàm 02h: Dịch chuyển Con trỏ 
Vào: AH=02h 
BH=trang số 
DH=hàng 
DL=cột 
Ra : Không 
R.AH:=02h; 
R.BH:=trang; 
R.DH:=hang; 
R.DL:=cot; 
INTR($10,R) 
Hàm 06h: Cuốn màn hình hay cửa sổ lên một số dòng xác định 
Vào: AH=06h 
AL=số dòng cuốn(=0;toàn bộ) 
BH=thuộc tính của dòng trống 
CH,DL=dòng,cột góc trên trái 
DL,DL=dòng,cột góc dưới phải 
Ra: Không 
R.AH:=06h; 
R.AL:=so_dong; 
R.BH:=thuoc_tinh; 
R.CH:=dong1;R.CL=cot1; 
R.DH:=dong2;R.DL=cot2; 
INTR($10,R); 
Hàm 07h: Cuốn màn hình hay cửa sổ xuống một dòng xác định 
Vào : AH=07h 
AL=số dòng cuốn(=0;toàn bộ) 
BH=thuôc tính các dòng trống 
CH,CL=dong,cột góc dưới phải 
Ra : Không 
R.AH:=07h; 
R.AL:=so_dong; 
R.BH:=thuoc_tinh; 
R.CH:=dong1;R.CL=cot1; 
R.DH:=dong2;R.DL=cot2; 
INTR($10,R); 
Hàm 09h: Hiển thị kí tự với thuộc tính tại vị trí Con trỏ 
Vào: AH=09h 
AL=mã ASCII của kí tự 
BH=trang số 
BL=thuộc tính(text); màu(graph) 
CX=số lần viết kí tự 
Ra :Không 
R.AH:=09h; 
R.AL:=kitu; 
R.BH:=0; {trang so 0} 
R.BL:=mau; 
R.CX=solan; 
INTR($10,R); 
Ngắt 16h: Ngắt bàn phím 
Giáo trình VI XỬ LÝ  
Bộ môn Kỹ thuật máy tính – Khoa CNTT – ĐHSPKT_HY Trang 91 
Hàm 00h: Đọc kí tự từ bàn phím 
Vào : AH=00h 
Ra :AH=mã quét của phím 
AL=mã ASCII của kí tự 
R.AH:=00h; 
INTR($16,R); 
R.AH:=ma_scan; 
R.AL:=ma_ascii; 
Hàm 02h: Lấy các cờ bàn phím 
Vào : AH=02h 
Ra : AL=các cờ 
Bit 7: insert; bit 6:capslock; bit 5:numlock; 
bit 4:scrollock 
R.AH:=00h; 
INTR($16,R); 
R.AH:=ma_scan; 
R.AL:=ma_ascii; 
Ngắt 33h: Ngắt con chuột 
Hàm 00h: Khởi tạo chuột 
Vào : AX=00h 
Ra : AX=FFFFh không nhận chuột 
R.AX:=00h; 
INTR($33,R); 
if R.AX=FFFFh then 
WRITE('Khong khoi tao duoc chuot!'); 
Hàm 01h: Hiện trỏ chuột 
Vào : AX=01h 
Ra : Không 
R.AX:=01h; 
INTR($33,R); 
Hàm 02h: ẩn trỏ chuột 
Vào : AX=02h 
Ra : Không 
R.AX:=02h; 
INTR($33,R); 
Hàm 03h: Trạng thái nhấn chuột 
Vào : AX=03h 
Ra : CX,DX=toạ độ ảo của chuột. 
BX=trạng thái nút chuột nhấn 
bit 0: Nút trái 
bit 1: Nút phải 
bit 2: Nút giữa 
R.AX:=03h; 
INTR($33,R); 
X=R.CX shl 3+1; 
Y=R.DX shl 3+1; 
if (R.BX and 1)=1 then 
WRITE('Phim trai chuot!!!'); 

File đính kèm:

  • pdfgiao_trinh_vi_xu_ly_tiep_truong_dai_hoc_spkt_hung_yen.pdf