Chapter4 Assembly 8086 8088
Chapter4 Assembly 8086 8088
/ 8088
Kiến trúc máy tính
CNTT1
Học viện Công nghệ Bưu chính Viễn thông
▶ Hợp ngữ (Assembler) là ngôn ngữ lập trình bậc thấp, chỉ cao hơn
ngôn ngữ máy;
▶ Hợp ngữ là ngôn ngữ gắn liền với các dòng vi xử lý (processor specific).
▶ Trong chương trình hợp ngữ, mỗi lệnh được đặt trên một dòng – dòng
lệnh;
▶ Lệnh có 2 dạng:
• Lệnh thật: là các lệnh gợi nhớ của VXL
▶ VD: MOV, SUB, ADD,...
▶ Khi dịch, lệnh gợi nhớ được dịch ra mã máy
• Lệnh giả: là các hướng dẫn chương trình dịch
▶ VD: MAIN PROC, .DATA, END MAIN,...
▶ Khi dịch, lệnh giả không được dịch ra mã máy mã chỉ có tác dụng định
hướng cho chương trình dịch.
• Không phân biệt chữ hoa hay chữ thường trong các dòng lệnh hợp
ngữ khi được dịch.
▶ Các tên sẽ được chương trình dịch gán địa chỉ ô nhớ.
▶ Tên chỉ có thể gồm các chữ cái, chữ số, dấu gạch dưới và phải bắt đầu
bằng 1 chữ cái
▶ Dữ liệu số:
• Thập phân: 0-9
• Thập lục phân: 0-9, A-F
▶ Bắt đầu bằng 1 chữ (A-F) thì thêm 0 vào đầu
▶ Thêm ký hiệu H (Hexa) ở cuối
▶ Ví dụ: 80H, 0F9H
• Nhị phân: 0-1
▶ Thêm ký hiệu B (Binary) ở cuối
▶ Ví dụ: 0111B, 1000B
▶ Dữ liệu ký tự:
• Bao trong cặp nháy đơn hoặc kép
• Có thể dùng ở dạng ký tự hoặc mã ASCII
▶ ’A’ = 65, ’a’ = 97
▶ Hằng (constant):
• Là các đại lượng không thay đổi giá trị
• Hai loại hằng:
▶ Hằng giá trị: ví dụ 100, ’A’
▶ Hằng có tên: ví dụ MAX_VALUE
▶ Biến (variable):
• Là các đại lượng có thể thay đổi giá trị
• Các loại biến:
▶ Biến đơn
▶ Biến mảng
▶ Biến xâu ký tự
▶ Định nghĩa biến xâu ký tự: có thể được định nghĩa như một xâu ký
tự hoặc một mảng các ký tự
▶ Ví dụ:
• str1 DB ‘string’
1 .Model Small
2 .Stack 100H
3 .Data
4 ; Khai bao cac bien va hang
5 .Code
6 jmp Start
7 Start:
8 ; Khoi tao cho thanh ghi DS
9 MOV AX, @Data; nap dia chi doan du lieu vao AX
10 MOV DS, AX; nap dia chi doan du lieu vao DS
11
12 ; Cac lenh cua chuong trinh chinh
13
14 ; Ket thuc tro ve chuong trinh goi
15 ; Dung ham 4CH cua ngat 21H
16 MOV AH, 4CH
17 INT 21H
18 End Start
19 ; Cac chuong trinh con neu co
Hàm 9 của ngắt INT 21H: hiện chuỗi ký tự với $ ở cuối lên màn hình
▶ Vào: AH = 9
DX = địa chỉ lệch của chuỗi ký tự cần hiện thị.
▶ Ra: Không
Emu8086
1 CMP AX,0
2 JNL GAN
3 NEG AX
4 GAN:
5 MOV BX, AX
1 CMP AX, 0 ; AX >0 ?
2 JNS DG ; Dung
3 MOV CL, 1 ; Khong, CL <-- 1
4 JMP RA ; Nhay qua nhanh kia
5 DG: MOV CL, 0 ; CL <-- 0
6 RA:
1 MOV CX,10
2 MOV AH,2
3 MOV DL,’9’
4 Hien: INT 21H
5 LOOP Hien
▶ 1. . . .
▶ 2. Tiep:. . .
▶ 3. . . . .
▶ 4. CMP X,Y; điều kiện
▶ Quay lại Tiếp nếu điều_kiện=sai;
▶ Bài 1 - Các lệnh số học: Viết chương trình nhập vào giá trị x và
tính giá trị biểu thức f dưới đây. Kết quả được lưu vào thanh ghi AH
và in ra màn hình (giả sử x đủ nhỏ sao cho kết quả của biểu thức
không vượt quá 8 bit, để đơn giản thử nghiệm với x = 0 và x = 1).
▶ Bài 3 - Biểu thức If Else: Nhập giá trị a từ bàn phím, tính và in
giá trị c khi biết b = 20, d = 10.
▶ Bài 5 - Switch - case: Viết switch-case dưới đây bằng hợp ngữ. Cho
biết b = 10, c = 5. Giá trị input được nhập từ bàn phím.
▶ Bài 6 - While Loop: Dùng vòng lặp while để tính tổng của n số đầu
tiên. Giá trị n được nhập từ bàn phím và n > 4 .
▶ Bài 7 - Sắp xếp mảng: Cho mảng 10 phần tử, viết chương trình sắp
xếp theo giá trị tăng dần.
1 1, 6, 3, 23, 3, 7, 1, 8, 34, 24, 50
▶ Chương trình con (còn gọi là thủ tục (procedure) hoặc hàm (func-
tion)):
• Thường gồm một nhóm các lệnh gộp lại;
• Được sử dụng thông qua tên và các tham số.
▶ Macro là một đoạn mã được đặt tên và có thể được chèn vào bất cứ
vị trí nào trong đoạn mã của chương trình
▶ Đặc điểm của macro:
• Macro hỗ trợ danh sách các tham số
• Macro chỉ tồn tại khi soạn thảo mã. Khi dịch, các macro sẽ được thay
thế bằng đoạn mã thực của macro.
• Nếu một macro không được sử dụng, mã của nó sẽ bị loại khỏi chương
trình sau khi dịch.
• Macro nhanh hơn thủ tục/hàm do mã của macro được chèn trực tiếp
vào chương trình và nó không đòi hỏi cơ chế gọi thực hiện (lưu địa
chỉ) và trở về (khôi phục địa chỉ trở về) như chương trình con
Sử dụng Macro:
1 name_macro [real parameters,..]
1 .Model Small
2 .Stack 100H
3 .Data
4 CRLF DB 13, 10,’$’
5 ChaoTay DB ’Hello!$’
6 ChaoTa DB ’Xin␣chao!$’
7 .Code
8 MAIN Proc
9 MOV AX, @Data; Khoi tao dau thanh ghi DS
10 MOV DS, AX
11
12 ; Hien thi loi chao Tay dung ham 9 cua ngat INT 21H
13
14 MOV AH, 9
15 LEA DX, ChaoTay
16 INT 21H
17
18 ; Xuong 5 dong dung ham 9 ngat INT 21H
19 LEA DX, CRLF
20 INT 21H
21 MOV CX, 6 ; CX chua so dong cach + 1
22 LAP:
23 INT 21H
24 LOOP LAP
25
26 ; Hien thi loi chao Ta dung ham 9 cua ngat INT 21H
27 MOV AH, 9
28 LEA DX, ChaoTa
29 INT 21H
30
31 ; Ket thuc tro ve chuong trinh goi
32 ; Dung ham 4CH cua ngat 21H
33 MOV AH, 4CH
34 INT 21H
35
36 MAIN Endp
37 END MAIN
1 .Model Small
2 .Stack 100H
3 .Data
4 ; Source string
5 str1 DB ’a’,’5’, ’B’, ’?’, ’d’, ’g’, ’P’,’N’,’k’,’*’
6 DB 10,13,’$’;
7 ; Destination string
8 str2 DB 10 DUP(’’)
9 DB ’$’
10 .Code
11 MAIN Proc
12 MOV AX, @Data; Khoi tao dau thanh ghi DS
13 MOV DS, AX
14 MOV ES, AX
15 ; Thiet lap SI tro toi str1 va DI tro toi str2
16 LEA SI, str1
17 LEA DI, str2
18 CLD
19 MOV CX, 10
20 START:
21 LODSB
22 ;Kiem tra co phai chu hoa khong
1 .Model Small
2 .Stack 100H
3 .Data
4 list DB 1,4,0,9,7,2,4,6,2,5
5 .Code
6 MAIN Proc
7 MOV AX, @Data; Khoi tao dau thanh ghi DS
8 MOV DS, AX
9
10 CLD
11 MOV CX, 9
12 LEA SI, list; SI tro den list
13 MOV BL, [SI]; Gan Max <-- phan tu dau tien
14 INC SI
15 START:
16 LODSB
17
18 CMP AL, BL
19 JLE BYPASS
20 MOV BL, AL; Neu AL>BL --> BL se duoc cap nhat gia tri
21
22 BYPASS:
23 LOOP START
24
25 ; In ra gia tri lon nhat
26 ADD BL, ’0’; bien doi tu so thanh ky tu
27 MOV DL, BL
28 MOV AH, 2
29 INT 21H
30
31 ; Ket thuc tro ve chuong trinh Dung ham 4CH cua ngat 21H
32 MOV AH, 4CH
33 INT 21H
34 MAIN Endp
35 END MAIN
21 MOV DI, SI
22 MOV BH, BL; Bien dem phu
23 MOV DX, DI; DX luu vi tri cua gia tri MIN
24 SubLoop:
25 INC DI
26 INC BH
27 CMP , [DI]
28 JLE NotMin
29 MOV AL, [DI]
30 MOV DX, DI
31 NotMin:
32 CMP BH, LIST_COUNT
33 JE ExitSub
34 JMP SubLoop
35 ExitSub:
36 ; Hoan doi vi tri neu MIN khac voi vi tri dau tien
37 MOV DI, DX
38 CMP SI, DI
39 JE NoSwap
40 CALL swapMemLocation
41 NoSwap:
42 INC BL
43 CMP BL, LIST_COUNT
44 JE ExitMain
45 INC SI
46 JMP MainLoop
47 ExitMain:
48 LEA DX, CR
49 CALL printString
50
51 MOV CX, LIST_COUNT
52 LEA SI, list
53 CALL printList
54 ; Ket thuc tro ve chuong trinh goi
55 ; Dung ham 4CH cua ngat 21H
56 MOV AH, 4CH
57 INT 21H
58 Main ENDP
59 ; Cac chuong trinh con
60
61 ; Chuong trinh con hoan doi hai vi tri
62 ; Input: SI tro toi vi tri thu nhat
63 ; DI tro toi vi tri thu hai
64 swapMemLocation PROC
65 PUSH AX,
66 MOV AL, [SI]
90 printString PROC
91 PUSH AX
92 MOV AH, 9
93 INT 21H
94 POP AX
95 RET
96 printString ENDP
97
98 ; Chuong trinh con in Mot ky tu so
99 ; Input: DL chua ky tu so can in
100 printSingleDigit PROC
101 PUSH AX,
102 ADD DL, ’0’
103 MOV AH, 2
104 INT 21H
105 POP AX
106 RET
107 printSingleDigit ENDP
108
109 END Main
1 .Model Small
2 .Stack 100H
3 .Data
4 ; Khai bao cac bien va hang
5 .Code
6 MAIN Proc
7 ; Khoi tao cho thanh ghi DS
8 MOV AX, @Data; nap dia chi doan du lieu vao AX
9 MOV DS, AX; nap dia chi doan du lieu vao DS
10
11 ;Doc nhiet do hien tai
12 IN AL, 125
13
14 CMP AL, 60
15 JL low ; Nhay den low neu AL nho hon 60
16
17 CMP AL, 80
18 JLE ok; Nhay den ok neu AL nho hon hoac bang 80
19 JG high; Nhay den high neu AL lon hon 80
20
21 low:
22 MOV AL, 1
23 OUT 127, AL; Bat bep "ON"
24 JMP ok
25 high:
26 MOV AL, 0
27 OUT 127, AL; Tat bep "OFF"
28
29 ok:
30 JMP Start
31
32 ; Ket thuc tro ve chuong trinh goi
33 ; dung ham 4CH cua ngat 21H
34 MOV AH, 4CH
35 INT 21H
36 MAIN Endp
37 END MAIN
Ví dụ: Vẽ lưu đồ và viết chương trình điều khiển bếp sao cho nhiệt độ
bếp luôn ổn đỉnh trong khoảng nhiệt độ 70-100 độ C. Biết hệ thống được
nối với vi xử lý 8086, trong đó: cổng đọc nhiệt độ là 100, giá trị nhiệt độ
là một sô 8 bit có dấu tương ứng với giá trị nhiệt độ thực tế. Cổng điều
khiển bếp là 105H, khi đưa giá trị 0 ra cổng thì bếp tắt, còn đưa giá trị 1
thì bếp sẽ được đốt.
Chương 4