Kiến trúc và tổ chức máy tính - Chương 6: Lập trình hợp ngữ
1. Giới thiệu cấu trúc tập lệnh của CPU 2. Tập thanh ghi của 8086/8088 3. Các kiểu thao tác của tập lệnh 4. Tập lệnh họ 8086/8088
Bạn đang xem trước 20 trang tài liệu Kiến trúc và tổ chức máy tính - Chương 6: Lập trình hợp ngữ, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
bangtqh@utc2.edu.vn
KIẾN TRÚC VÀ TỔ CHỨC MÁY TÍNH
(Computer Organization and Architecture)
Chương 6
Lập trình Hợp ngữ
bangtqh@utc2.edu.vn
Nội dung
1. Giới thiệu cấu trúc tập lệnh của CPU
2. Tập thanh ghi của 8086/8088
3. Các kiểu thao tác của tập lệnh
4. Tập lệnh họ 8086/8088
Chương 6 - Lập trình hợp ngữ 2
bangtqh@utc2.edu.vn
6.1. Giới thiệu tập lệnh của CPU
Mỗi CPU có 1 tập lệnh xác định
Tập lệnh có hàng chục hoặc hàng trăm lệnh. Intel
8086/8088 có tập lệnh khoảng 115 lệnh chia làm
5 nhóm
Mỗi lệnh là một chuỗi số nhị phân mà CPU hiểu
được và thực hiện 1 thao tác xác định
Các lệnh được mô tả bằng ký hiệu gợi nhớ Là
các lệnh của hợp ngữ (Assembly)
Chương 6 - Lập trình hợp ngữ 3
bangtqh@utc2.edu.vn
Giản đồ trạng thái của Chu kỳ lệnh
4
Không kiểm tra ngắt
TÝnh to¸n
®Þa chØ lÖnh
Gi¶i m·
thao t¸c
lÖnh
TÝnh to¸n
®Þa chØ to¸n
h¹ng
Xö lý d÷ liÖu
TÝnh to¸n
®Þa chØ to¸n
h¹ng
NhËn lÖnh
NhËn to¸n
h¹ng
CÊt to¸n
h¹ng
NhiÒu
to¸n
h¹ng
NhiÒu
kÕt
qu¶
DL d¹ng
x©u hoÆc
vect¬
KÕt thóc lªnh,
nhËn lÖnh
tiÕp theo
bangtqh@utc2.edu.vn
Giản đồ trạng thái của chu kỳ lệnh
5
Có kiểm tra ngắt cuối mỗi chu kỳ lệnh
TÝnh to¸n
®Þa chØ
lÖnh
Gi¶i m·
thao t¸c
lÖnh
TÝnh to¸n
®Þa chØ
to¸n h¹ng
Xö lý d÷
liÖu
TÝnh to¸n
®Þa chØ
to¸n h¹ng
NhËn lÖnh
NhËn to¸n
h¹ng
CÊt to¸n
h¹ng
NhiÒu
to¸n
h¹ng
NhiÒu
kÕt
qu¶
DL d¹ng
x©u hoÆc
vect¬
KÕt thóc lªnh,
nhËn lÖnh
tiÕp theo
KiÓm tra
ng¾t
Ng¾t
Kh«ng
cã ng¾t
bangtqh@utc2.edu.vn
6.2. Tập thanh ghi của 8086/8088
8086/8088 có 14 thanh ghi 16 bit chia làm 4 nhóm như
hình vẽ
8086/8088 có bus địa chỉ 20 bit (1MB không gian địa chỉ)
sử dụng phương pháp đánh địa chỉ phân đoạn
(segment addressing)
Địa chỉ vật lý = địa chỉ segment*16 + địa chỉ offset
Chương 6 - Lập trình hợp ngữ 6
Nhóm
thanh
ghi đa
năng
Nhóm
thanh ghi
đoạn
(segment)
bangtqh@utc2.edu.vn
Nhóm thanh ghi đa năng
Còn gọi là nhóm thanh
ghi công dụng chung
(General purpose
registers)
Có thể dùng ½ mỗi thanh
ghi như những thanh ghi
độc lập
8086/8088 tự động sử
dụng một số thanh ghi đa
dụng vào một số mục
đích cụ thể
Chương 6 - Lập trình hợp ngữ 7
bangtqh@utc2.edu.vn
Nhóm thanh ghi đoạn
CS: chứa địa chỉ cơ sở đoạn mã lệnh
của chương trình đang chạy
DS: chứa địa chỉ đoạn của vùng dữ
liệu chương trình đang thực hiện
ES: (Extra segment) Chứa địa chỉ
đoạn dữ liệu bổ sung (vùng chứa
biến của chương trình)
SS: Chứa địa chỉ bộ nhớ stack của
chương trình đang chạy
Chương 6 - Lập trình hợp ngữ 8
bangtqh@utc2.edu.vn
Thanh ghi con trỏ và chỉ số
IP: (instruction pointer): luôn chỉ đến địa chỉ lệnh sắp
được thi hành trong bộ do do CS đang trỏ tới Cặp
CS:IP chứa địa chỉ vật lý của lệnh trong bộ nhớ
SP: luôn kết hợp với SS tạo thành cặp SS:SP để trỏ
tới địa chỉ vùng nhớ stack của chương trình.
SI và DI (Source index và Destination index): được
thiết kế chuyên dụng trong các thao tác vận chuyển
số liệu. Cặp DS:SI trỏ tới dữ liệu nguồn, ES:DI trỏ tới
dữ liệu đích
Chương 6 - Lập trình hợp ngữ 9
bangtqh@utc2.edu.vn
Thanh ghi cờ của 8086/8088
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
X X X X OF DF IF TF SF ZF X AF X PF X CF
Chương 6 - Lập trình hợp ngữ 10
bangtqh@utc2.edu.vn
Ngắt (nhắc lại)
Ngắt là cơ chế mà BXL dừng chương trình đang thi hành để
thực hiện 1 công việc khác
– Ngắt cứng: thường xuất phát từ các thiết bị phần cứng ngoại vi,
yêu cầu CPU giải quyết 1 công việc gì đó (vd: INT 2 báo sự cố
phần cứng; INT 8: ngắt tín hiệu đồng hồ; INT 9 ngắt bàn
phím.v.)
– Ngắt mềm: là các chương trình con được gọi bằng lệnh INT của
BXL. Số hiệu chương trình con là số hiệu của vector ngắt trong
bảng vector ngắt. Chương trình con này thi hành 1 dịch vụ nào đó
của DOS hoặc BIOS.
Khi gọi ngắt mềm, người lập trình thường phải truyền các
tham số thông qua các thanh ghi và kết quả thu được sẽ
có trong thanh ghi hoặc bộ nhớ.
Bảng vector ngắt chiếm 1KB vùng nhớ địa chỉ thấp từ
0:0000h đến 0:0400h trong đó cứ 4 byte tạo thành 1
vector chứa địa chỉ offset (word thấp) và địa chỉ segment
(word cao)
– Vd: INT 0 tại địa chỉ 0:0004h, INT 1 tại địa chỉ 0:0008h, INT
2 tại địa chỉ 0:000Ch
Chương 6 - Lập trình hợp ngữ 11
bangtqh@utc2.edu.vn
Tập lệnh 8086/8088
VXL 8086/8088 có khoảng 115 lệnh, chia làm 6 nhóm
lệnh chính
– Các lệnh vận chuyển số liệu (POP, PUSH, MOV,.)
– Các lệnh số học (ADD, SUB, MUL, IMUL, DIV, CMP)
– Các lệnh thao tác ở mức bit (AND, NOT, ROR, ROL)
– Các lệnh thao tác với dãy byte (REP, CMPSB,
REPZ)
– Các lệnh điều khiển (CALL, INT, JE, JZ, LOOP,)
– Các lệnh thao tác với cờ (flag) và điều khiển BXL
(HLT,CLC, CLD, NOP, WAIT.)
Chương 6 - Lập trình hợp ngữ 12
bangtqh@utc2.edu.vn
Phân biệt EXE và COM
File *.COM
– Nằm trên 1 segment size tối đa chỉ 64KB
– Nạp vào bộ nhớ và thực thi hanh hơn file EXE
– Khi chạy file COM, DOS tạo vùng nhớ Program Segment
Prefix (PSP) dài 256 Byte ở 0000h chứa các thông tin cần
thiết, sau đó các mã lệnh sẽ được load vào từ vị trí 0100h
và nạp giá trị 0 vào stack (2 byte), thanh ghi SP trỏ tới
0FFFEh
Size thực tế của chương trình COM chỉ là:
64KB – 256 Byte – 2 byte stack
File *.EXE
– Nằm trên nhiều segment khác nhau
– Size thường lớn 64KB
– Có thể gọi được các chương trình con dạng near hoặc far
Chương 6 - Lập trình hợp ngữ 13
bangtqh@utc2.edu.vn
Khung một chương trình assembly
Xét cụ thể 1 chương trình đơn giản
Chương 6 - Lập trình hợp ngữ 14
Đoạn mã chứa
lệnh của chương
trình
Đoạn khai
báo dữ liệu
Chương
trình chính
Chương
trình con
bangtqh@utc2.edu.vn
Khung chương trình assembly (tt)
Chỉ thị .MODEL
– TINY: Mã lệnh và dữ liệu cùng nằm trong 1 segment
– SMALL: Mã lệnh nằm trên 1 segment; Dữ liệu trên 1
segment khác
– MEDIUM: Mã lệnh nằm trong nhiều segment; Dữ liệu
nằm trên 1 segment
– COMPACT: Mã lệnh nằm trên 1 segment; Dữ liệu nằm
trên nhiều segment
– LARGE: Mã lệnh nằm trong nhiều segment; Dữ liệu
nằm trên nhiều segment nhưng không chứa mảng lớn
hơn 64KB
– HUGE: Mã lệnh và dữ liệu nằm trên nhiều segment; dữ
liệu có thể chứa các mảng lớn hơn 64KB
Chương 6 - Lập trình hợp ngữ 15
bangtqh@utc2.edu.vn
Khung chương trình assembly (tt)
Chỉ thị .STACK
– Cú pháp: .STACK n
– Khai báo dùng để dành ra một vùng nhớ dùng làm stack (chủ yếu
phục vụ cho chương trình con), thông thường ta chọn khoảng 256
byte là đủ để sử dụng
– Nếu không khai báo thì chương trình dịch tự động cho kích thước
stack là 1 KB:
Chỉ thị .DATA
– Bắt đầu khai báo đoạn dữ liệu chứa các biến và hằng trong
chương trình
– Xem công thức khai báo dữ liệu
Chỉ thị .CODE
– Đoạn mã bắt đầu bằng một chương trình chính và có thể có các
lệnh gọi chương trình con (CALL)
– Một chương trình chính hay chương trình con bắt đầu bằng lệnh
PROC và kết thúc bằng lệnh ENDP (đây là các lệnh giả của
chương trình dịch). Trong chương trình con, ta sử dụng thêm lệnh
RET để trả về địa chỉ lệnh trước khi gọi chương trình con.
Chương 6 - Lập trình hợp ngữ 16
bangtqh@utc2.edu.vn
Khung chương trình assembly (tt)
Chỉ thị ENDP
– Báo cho Assembler biết điểm kết thúc 1 thủ tục có tên
là MAIN
Chỉ thị END
– Báo cho Assembler biết điểm kết thúc chương trình
chính với nhãn lệnh đâu tiên trong modul chương trình
chính là MAIN
Chương 6 - Lập trình hợp ngữ 17
bangtqh@utc2.edu.vn
Khung chương trình assembly (tt)
Trường hợp đoạn mã, đoạn dữ liệu, stack gộp chung
vào 1 segment duy nhất
Chương 6 - Lập trình hợp ngữ 18
Đoạn khai báo
dữ liệu
Chương trình
chính
Định nghĩa chương
trình con nếu có ở
đây
bangtqh@utc2.edu.vn
Cấu trúc 1 dòng lệnh Assembly
Nhãn: Dài tối đa 31 ký tự, không được bắt đầu bằng ký
tự số, không chứa dấu cách trống
Mã lệnh (Op-code): Là các chữ viết tắt gợi nhớ chỉ các
lệnh của BXL
Các toán hạng (Operands): Báo cho BXL biết tìm
toán hạng ở đâu
Chú thích: Phải đứng sau dấu chấm phẩy (;) và kết thúc
bởi dấu xuống dòng
19
Nhãn Mã lệnh Toán hạng Chú thích
START: MOV AH, 10h ; Đưa giá trị 10h vào AH
bangtqh@utc2.edu.vn
Khai báo biến
Khai báo biến để assembler cung cấp một địa chỉ xác
định trong bộ nhớ.
– DB (define byte)
– DW (define word)
– DD (define double word)
Ví dụ
A1 DB 1 ;khai báo 1 biến A1 dài 1 byte, giá trị =1
A2 DB ? ;khai báo 1 biến A2 dài 1 byte
A3 DB ‘P’ ;khai báo 1 biến A3 kiểu ký tự
A4 DW 1 ;khai bao 1 biến dài 2 byte, giá trị =1
A5 DB 1,2,3 ;khai báo mảng 3 phần tử giá trị = 1,2,3
A6 DB 10 DUP (0) ;mảng 10 phẩn tử giá trị 0
Chương 6 - Lập trình hợp ngữ 20
bangtqh@utc2.edu.vn
Khai báo biến
Lưu ý: Đối với các biến có độ lớn nhiều hơn 1 byte,
byte thấp sẽ chứa ở ô nhớ có địa chỉ thấp và byte cao
sẽ chứa ở ô nhớ có địa chỉ cao.
– Ví dụ: VarA DW 1234h
– Nếu VarA được cấp ở địa chỉ 1000h thì
• Địa chỉ 1001h chứa byte 34h
• Địa chỉ 1002h chứa byte 12h
Chương 6 - Lập trình hợp ngữ 21
bangtqh@utc2.edu.vn
Khai báo hằng
Các hằng khai báo trong chương trình hợp ngữ bằng
lệnh giả. Hằng có thể ở dạng số, ký tự hay chuỗi.
VD:
A12 EQU 10
A13 EQU 'AAA'
;Sau khi sử dụng khai báo trên, nếu ta dùng lệnh:
MOV AH, A12 ;thì AH = 10h
;Nếu khai báo tiếp
A14 DB ‘B’, A13
;thì chuỗi A14 có giá trị gán ban đầu là 'BAAA'.
Chương 6 - Lập trình hợp ngữ 22
bangtqh@utc2.edu.vn
Các toán tử trong Assembly
Toán tử số học
Toán tử logic
Toán tử quan hệ
Toán tử cung cấp thông tin
Toán tử thuộc tính
Chương 6 - Lập trình hợp ngữ 23
bangtqh@utc2.edu.vn
Toán tử số học
VD:
MOV AH, (5+1)*7/2 ;AH← 21
MOV AH, 00010110b shl 2 ;AH← 01011000b
MOV AH, 00010110b shr 2 ;AH← 00000101b
MOV AH, 100 mod 3 ;AH←1
Chương 6 - Lập trình hợp ngữ 24
bangtqh@utc2.edu.vn
Các toán tử trong Assembly (tt)
Toán tử logic
– Gồm các toán tử AND, OR, NOT, XOR
Toán tử quan hệ
– So sánh 2 biểu thức và trả về giá trị True (-1) nếu thỏa
mãn; False (0) nếu không thỏa mãn
Chương 6 - Lập trình hợp ngữ 25
bangtqh@utc2.edu.vn
Toán tử cung cấp thông tin
SEG
– Cú pháp: SEG bt
trong đó: bt có thể là biến, nhãn hay các toán hạng bộ nhớ
– Công dụng: trả về địa chỉ segment của bt
OFFSET
– Cú pháp: OFFSET bt
trong đó: bt có thể là biến, nhãn hay các toán hạng bộ nhớ
– Công dụng: trả về địa chỉ offset của bt
Toán tử chỉ số [ ]
– Dùng lấy phần tử chỉ số i đối với biến dạng mảng ví dụ:
Tenmang[i]
– Dùng để xác định giá trị tại một ô nhớ có địa chỉ lưu trong
thanh ghi (vd: [BX]
Toán tử (:) – segment override operator
– Quy định tính địa chỉa đối với segment được chỉ định (các
thanh ghi đoạn ES, SS, DS, CS
Chương 6 - Lập trình hợp ngữ 26
bangtqh@utc2.edu.vn
Toán tử cung cấp thông tin (tt)
Toán tử TYPE
– Cú pháp TYPE bt
– Cho phép xác định kiểu của biểu thức bt.
• Nếu bt là biến trả về số byte (1, 2, hoặc 4)
• Nếu bt là nhãn trả về 0FFFh nếu nhãn NEAR,
0FFFEh nếu là nhãn FAR
• Nếu bt là hằng trả về 0
Toán tử LENGTH
– Cú pháp LENGTH bt
– Trả về số phần tử của bt (tính theo byte, word, hoặc
dword)
Toán tử SIZE
– Trả về tổng số byte đã cấp cho một đối tượng
Chương 6 - Lập trình hợp ngữ 27
bangtqh@utc2.edu.vn
Toán tử thuộc tính
PTR
– Cú pháp: PTR bt
– có dạng BYTE hoặc WORD nếu bt là toán
hạng bộ nhớ
– có dạng NEAR hoặc FAR nếu bt là nhãn
– Ví dụ:
A DW 100 DUP(?)
B DD ?
; Đưa byte đầu tiên trong mảng A vào thanh ghi AH
MOV AH, BYTE PTR A
; Đưa 2 byte thấp trong biến B vào thanh ghi AX
MOV AX, WORD PTR B
Chương 6 - Lập trình hợp ngữ 28
bangtqh@utc2.edu.vn
Các mode địa chỉ toán hạng
Toán hạng có thể là:
– Một giá trị cụ thể
– Nội dung của thanh ghi
– Nội dung của ngăn nhớ
– Nội dung của cổng vào ra
Mode địa chỉ là cách thức địa chỉ hóa trong lệnh để
xác định toán hạng
29
bangtqh@utc2.edu.vn
Các mode địa chỉ toán hạng
Mode địa chỉ tức thì
Mode địa chỉ trực tiếp
Mode địa chỉ gián tiếp
Mode địa chỉ thanh ghi
Mode địa chỉ gián tiếp qua thanh ghi
Mode địa chỉ dịch chuyển
Mode địa chỉ stack
30
bangtqh@utc2.edu.vn
Mode địa chỉ tức thì
Toán hạng là một phần của lệnh
Toán hạng nằm ngay trong trường địa chỉ
Chỉ có thể là toán hạng nguồn
Truy nhập toán hạng rất nhanh
Ví dụ:
ADD AX, 10
31
bangtqh@utc2.edu.vn
Mode địa chỉ gián tiếp
Toán hạng là nội dung của ngăn nhớ có địa
chỉ nằm trong một ngăn nhớ khác, ngăn
nhớ khác đó được thể hiện trong lệnh
Vùng nhớ có thể được tham chiếu là lớn
Có thể gián tiếp nhiều lần
CPU phải thực hiện tham chiếu bộ nhớ
nhiều lần để tìm toán hạng → chậm
Ví dụ: ADD AH, [a]
32
bangtqh@utc2.edu.vn
Sơ đồ mode địa chỉ gián tiếp
33
§Þa chØM· lÖnh
LÖnh
Bé nhí
To¸n h¹ng
§Þa chØ cña t/h¹ng
bangtqh@utc2.edu.vn
Mode địa chỉ thanh ghi
Toán hạng là nội dung của một thanh ghi
Số lượng thanh ghi có hạn
Trường địa chỉ nhỏ (chỉ cần ít bit)
– Độ dài lệnh ngắn hơn
– Nhận lệnh nhanh hơn
Không tham chiếu bộ nhớ
Truy nhập toán hạng nhanh
Tăng số lượng thanh ghi → tăng tốc độ
Ví dụ:
ADD AL, AH
34
bangtqh@utc2.edu.vn
Sơ đồ mode địa chỉ thanh ghi
Vị trí của toán hạng chính là các thanh ghi của BXL
– VD: MOV DS, AX
35
Tªn thanh ghiM· lÖnh
LÖnh
TËp thanh ghi
To¸n h¹ng
bangtqh@utc2.edu.vn
Mode địa chỉ gián tiếp qua thanh ghi
Toán hạng là ngăn nhớ có địa chỉ nằm trong một
thanh ghi
Thanh ghi này được gọi là thanh ghi con trỏ
Vùng nhớ có thể được tham chiếu là lớn: 2n, trong đó
n là độ dài (bit) của thanh ghi
Ví dụ:
SUB AL, [BX]
36
bangtqh@utc2.edu.vn
Sơ đồ mode gián tiếp qua thanh ghi
37
Tªn thanh ghiM· lÖnh
LÖnh
Bé nhí
To¸n h¹ng§Þa chØ cña t/h¹ng
TËp thanh ghi
bangtqh@utc2.edu.vn
Mode địa chỉ dịch chuyển
Kết hợp hai mode:
– Mode gián tiếp qua thanh ghi
– Mode trực tiếp
Trường địa chứa hai thành phần:
– Tên một thanh ghi
– Một hằng số
Địa chỉ toán hạng = ND thanh ghi = hằng số
Ví dụ:
ADD AL, [SI + 50]
38
bangtqh@utc2.edu.vn
Sơ đồ mode địa chỉ dịch chuyển
39
Register RM· lÖnh
LÖnh
Bé nhí
To¸n h¹ng
§Þa chØ cña t/h¹ng
TËp thanh ghi
Address A
+
bangtqh@utc2.edu.vn
Mode địa chỉ stack
Toán hạng được ngầm hiểu là ngăn nhớ đỉnh ngăn
xếp
Ví dụ: PUSH AX
40
M· lÖnh
LÖnh
Ng¨n nhí ®Ønh stack
NgÇm hiÓu
bangtqh@utc2.edu.vn
Minh họa lệnh gọi chương trình con
41
bangtqh@utc2.edu.vn
Thể hiện ở Stack
42
Sau lÖnh
CALL Proc1
Khëi t¹o
néi dung
stack
Sau lÖnh
CALL Proc2
Sau lÖnh
RETURN
Sau lÖnh
CALL Proc2
Sau lÖnh
RETURN
Sau lÖnh
RETURN
bangtqh@utc2.edu.vn
Một số lệnh cơ bản của assembly
Lệnh MOV
– Cú pháp: MOV đích, nguồn
– Không được dùng lệnh MOV chuyển trực tiếp dữ liệu
giữa 2 ô nhớ mà phải thông qua một thanh ghi
– Không được chuyển trực tiếp dữ liệu vào thanh ghi
đoạn (DS, CS, SS, ES)
– Không được chuyển trực tiếp giữa 2 thanh ghi đoạn
Lệnh XCHG: Hoán chuyển nội dung giữa 2 toán
hạng
– Cú pháp: XCHG dst, src
– Không được phép dùng lệnh XCHG với thanh ghi đoạn
(DS, CS, SS, ES)
Chương 6 - Lập trình hợp ngữ 43
bangtqh@utc2.edu.vn
Một số lệnh cơ bản của assembly (tt)
Lệnh cộng không nhớ ADD
– Cú pháp: ADD dst, src
– Công dụng: dst ←dst + src
– Không được phép cộng 2 thanh ghi đoạn
– Toán hạng src có thể là thanh ghi hoặc ô nhớ hoặc giá
trị cụ thể; Toán hạng dst là thanh ghi hoặc ô nhớ
Lệnh cộng có nhớ ADC
– Cú pháp: ADC dst, src
– Công dụng: dst ← dst + src + CF
– Thường được dụng khi cộng các số lớn hơn 16 bit
Lệnh tăng INC
– Cú pháp: INC dst ;dsc có thể là reg hoặc mem
– Công dụng: dst ←dst +1
Chương 6 - Lập trình hợp ngữ 44
bangtqh@utc2.edu.vn
Một số lệnh cơ bản của assembly (tt)
Lệnh giảm DEC
– Cú pháp: DEC dst ;dsc có thể là reg hoặc mem
– Công dụng: dst dst – 1
Lệnh trừ SUB
– Cú pháp: SUB dsc, src ;dsc ← dsc - src
– src có thể là reg, mem hoặc immed; dsc chỉ có thể là
reg hoặc mem
– Không được phép trừ trên thanh ghi đoạn
Lệnh trừ có mượn SBB
– Cú pháp SBB dsc, src ;dsc dsc – src - CF
Lệnh đảo dấu NEG
– Cú pháp NEG dsc ;dsc -dsc
Chương 6 - Lập trình hợp ngữ 45
bangtqh@utc2.edu.vn
Một số lệnh cơ bản của assembly (tt)
Lệnh nạp địa chỉ thực LEA
– Cú pháp: LEA dst, src
– Công dụng là chuyển địa chỉ offset của src vào dst
– Đích dst thường là BX, CX, DX, BP, SI, DI; scr thường
là tên của biến.
– Tương đương với lệnh: MOV reg16, OFFSET mem16
Lệnh gọi ngắt INT
– Cú pháp: INT,
– Các ngắt thông dụng:
• 09h ngắt bàn phím
• 20h thoát khỏi chương trình
• 21h DOS
Chương 6 - Lập trình hợp ngữ 46
bangtqh@utc2.edu.vn
Các lệnh vào/ra trong assembly
Một số hàm của ngắt 21h (DOS)
– Hàm 01h nhập 1 ký tự từ bàn phím
– Hàm 02h in 1 ký tự ra màn hình
– Hàm 09h in 1 chuỗi ký tự (kết thúc $) ra màn hình
– Hàm 0Ah nhận một chuỗi ký tự từ bàn phím
– .
Ví dụ: Viết chương trình nhập 1 ký tự từ bàn phím
hiện ký tự vừa nhập
– Đưa số hiệu hàm vào AH
– Mã ASCII của ký tự nhập từ bàn phím sẽ lưu trong AL
– Khi in ký tự ra màn hình thì AH chứa số hiệu hàm, DL
chứa ký mã ký tự cần in
Chương 6 - Lập trình hợp ngữ 47
bangtqh@utc2.edu.vn
Các lệnh vào/ra trong assembly
Giải:
Bài tập: Viết chương trình nhập 2 số A, B trong khoảng
0..9, in ra màn hình tổng của 2 số đó
Chương 6 - Lập trình hợp ngữ 48
bangtqh@utc2.edu.vn
Các lệnh vào/ra trong assembly
Chu trình hiển thị 1 chuỗi ký tự lên màn hình
– Bước 1: Khởi tạo đoạn dữ liệu trong thanh ghi DS
MOV AX, @DATA
MOV DS, AX
– Bước 2: Đưa địa chỉ chuỗi cần in vào thanh ghi DX
LEA DX, Msg ; hoặc lệnh MOV DX, OFFSET Msg
– Bước 3: Đặt trị số hàm 09h vào AH
MOV AH, 09h
– Bước 4: Gọi ngắt 21h
INT 21h
Chương 6 - Lập trình hợp ngữ 49
bangtqh@utc2.edu.vn
Các lệnh vào/ra trong assembly
Bài tập 1: Viết chương trình hiển thị lên màn hình
Bài tập 2: Viết chương trình nhận vào từ bàn phím 1 ký
tự, hãy in ra màn hình ký tự đó ở dạng chữ in hoa.
(chương trình có hiển câu thông báo mời nhập và câu
thông báo kết quả).
Chương 6 - Lập trình hợp ngữ 50
bangtqh@utc2.edu.vn
Các lệnh vào/ra trong assembly (tt)
Chu trình nhập 1 chỗi ký tự từ bàn phím
– Bước 1: Khai báo buffer chứa chuỗi sẽ nhập
strBuffer DB 40, ?, 40 DUP (?)
– Bước 2: Đưa địa chỉ buffer vào DX
LEA DX, strBuffer; hoặc lệnh MOV DX, OFFSET Msg
– Bước 3: Đặt trị số hàm 0Ah vào AH
MOV AH, 0Ah
– Bước 4: Gọi ngắt 21h
INT 21h
+ Thao tác nhập kết thúc bằng phím Enter (mã 0Dh)
+ strBuffer[1] chứa độ dài chuỗi vừa nhập
Chương 6 - Lập trình hợp ngữ 51
bangtqh@utc2.edu.vn
Ví dụ:
Nhập họ tên và in lời chào ra màn hình
Chương 6 - Lập trình hợp ngữ 52
bangtqh@utc2.edu.vn
Các lệnh vào/ra trong assembly (tt)
Bài tập 3: Hãy viết chương trình nhập vào từ bàn
phím 2 số nguyên nằm trong khoảng 0255. Tính và
in ra màn hình Tổng và Tích của 2 số nguyên đó
Gợi ý:
+ Nhập 2 xâu strA và strB
+ Tiến hành đổi 2 xâu vừa nhập về dạng số
+ Tính tổng và tích 2 số đó
+ Đổi các chữ số hàng đv, chục, trăm sang dạng ký tự rồi
lần lượt in các ký tự đó ra màn hình
Chương 6 - Lập trình hợp ngữ 53
bangtqh@utc2.edu.vn
Cấu trúc điều khiển trong assembly
Lệnh nhảy không điều kiện JMP
– Cú pháp: JMP
– Công dụng: Chuyển tới vị trí lệnh được xác định bởi
CS:IP
Các lệnh nhảy có điều kiện
– Các lệnh nhảy không dấu
– Các lệnh nhảy có dấu (khi kết quả trả về là số có dấu)
– Các lệnh nhảy điều kiện đơn: ĐK nhảy phụ thuộc vào 1
cờ riêng biệt
Chương 6 - Lập trình hợp ngữ 54
bangtqh@utc2.edu.vn
Ví dụ lệnh nhảy JMP
Chương 6 - Lập trình hợp ngữ 55
bangtqh@utc2.edu.vn
Cấu trúc điều khiển trong assembly (tt)
Lệnh nhảy có điều kiện
– Chỉ được phép nhảy tới các label trong khoảng [-127,
128] byte tại của IP
– Lệnh JA (Jump if above)
– Lệnh JAE (Jump if above or equal)
– Lệnh JB (Jump if below)
– Lệnh JBE (Jump if below or equal)
– Lệnh JE (Jump if Equal)
– Lệnh JNE (Jump if not Equal)
– Lệnh JNA (Jump if not Above)
– .. (đọc help)
Các lệnh nhảy có điều kiện thường dùng sau lệnh so
sánh CMP
Chương 6 - Lập trình hợp ngữ 56
bangtqh@utc2.edu.vn
Cấu trúc điều khiển trong assembly (tt)
Cấu trúc rẽ nhánh If Then
Ví dụ: Viết chương trình nhập vào số năm dương lịch
Kiểm tra xem năm đó có phải năm nhuận không?
Chương 6 - Lập trình hợp ngữ 57
CMP
Lablel_Bỏ_qua_việc_A
.
Label_Bỏ_qua_việc_A:
..
ba