Professional Documents
Culture Documents
tập lệnh 8086
tập lệnh 8086
tập lệnh 8086
Bảng mã chế độ địa chỉ cho các toán hạng của lệnh:
MOD 00 01 10 11
R/M W=1 W=0
• Chế độ địa chỉ tức thì: Toán hạng đích là 1 thanh ghi hay 1 ô nhớ, toán hạng
nguồn là hằng số. Chế độ địa chỉ này có thể được dùng để nạp dữ liệu cần
thao tác vào bất kỳ thanh gi nào hoặc bất kì ô nhớ nào trong đoạn dữ liệu
DS.
• Ví dụ: MOV CL,100; chuyển 100 vào CL
• Chế độ địa chỉ trực tiếp: Trong chế độ này một hằng là địa chỉ lệch của ô nhớ
làm một toán hạng, còn toán hạng kia chỉ có thể là thanh ghi mà không được
là ô nhớ.
• Ví dụ: MOV AL,[1234]; chuyển nội dung ô nhớ DS:[1234] vào AL
• Chế độ địa chỉ gián tiếp: Trong chế độ địa chỉ này, một toán hạng là một
thanh ghi được sử dụng để chứa địa chỉ lệch của ô nhớ chứa dữ liệu, còn
toán hạng kia chỉ có thể là thanh ghi là không được là ô nhớ.
• Ví du: MOV AL,[BX]; chuyển nội dung ô nhớ có địa chỉ DS:BX và AL
• Chế độ địa chỉ tương đối cơ sở: Các thanh ghi cơ sở như BX hoặc
BP và hằng số biểu diễn giá trị dịch chuyển địa chỉ dùng để tính địa
chỉ hiệu dụng của 1 toán hạng trong vùng nhớ DS hoặc SS. Sự có
mặt của các giá trị dịch chuyển xác định tính tương đối của địa chỉ
so với địa chỉ cơ sở.
• Ví dụ MOV CX,[BX] + 10;
• Chế độ địa chỉ tương đối chỉ số: Trong chế độ địa chỉ này các thanh
ghi chỉ số như SI hoặc DI và hằng số biểu diễn giá trị dịch chuyển
được dùng để tính địa chỉ hiệu dụng của toán hạng trong vùng nhớ
DS hoặc ES.
• Ví dụ MOV CX,[SI] +10;
• Chế độ địa chỉ tương đối chỉ số cơ sở: Là sự kết hợp của địa chỉ
tương đối cơ sở và địa chỉ tương đối chỉ số. Trong chế độ này ta
dùng cả thanh ghi cơ sở lẫn thanh ghi chỉ số và một hằng số biểu
diễn sự dịch chuyển của địa chỉ để tính địa chỉ của toán hạng.
• Ví dụ MOV AX,[BX][SI] + 8
TẬP LỆNH TRONG VXL 8086
• Bộ VXL 8086 có tập lệnh gồm 111 lệnh chiều dài của
lệnh từ 1 byte đến vài byte.
• Tập lệnh bao gồm:
• Nhóm các lệnh trao đổi dữ liệu.
• Nhóm các lệnh tính toán số học
• Nhóm các lệnh tính toán logic
• Nhóm các lệnh dịch quay toán hạng
• Nhóm các lệnh nhảy
• Nhóm các lệnh lặp
• Nhóm các lệnh điều khiển đặc biệt khác.
NHÓM CÁC LỆNH TRAO ĐỔI DỮ LIỆU
• Chức năng:
• Trao đổi dữ liệu giữ thanh ghi và ô nhớ, giữa thiết bị vào ra
và ô nhớ hoặc thanh ghi.
• Nạp dữ liệu cần thiết cho các thao tác tính toán của VXL.
Mã gợi nhớ Chức năng
MOV Di chuyển dữ liệu giữa thanh ghi và ô nhớ
• MOV:
• Cú pháp: MOV đích, nguồn
• Thực hiện: Đích ←Nguồn
• Toán hạng sử
dụng trong lệnh:
Đích Nguồn Ví dụ
Reg Reg MOV AH,BH
Reg Mem MOV CL,[1000H]
Reg Imm MOV DH,10
Mem Reg MOV table,BX
Mem Imm MOV X1,25H
Seg.reg Reg16 MOV DS,AX
Seg.reg Mem16 MOV ES,X2
NHÓM CÁC LỆNH TRAO ĐỔI DỮ LIỆU
• XCHG:
• Cú pháp: XCHG đích,nguồn
• Thực hiện đích ↔ nguồn
• Các toán hạng sử dụng trong lệnh:
ĐíchXCHG Nguồn Ví dụ
AX Reg XCHG AX,BX
Mem Reg XCHG SUM,BX
Reg Reg XCHG CL,DL
• XLAT:
• Cú pháp: XLAT
• Thực hiện: AL←[DS*10H+BX+AL]
• Lấy giá trị thứ n trong bảng dữ liệu vào thanh ghi AL với BX giữ địa chỉ đầu bảng. AL giữ
khoảng cách từ đầu bảng tới giá trị cần lấy.
NHÓM CÁC LỆNH TRAO ĐỔI DỮ LIỆU
• LEA:
• Đây là lệnh để tính địa chỉ lệch của biến hoặc địa chỉ của ô
nhớ chọn làm gốc rồi nạp vào thanh ghi đã chọn, lệnh này
không tác động đến cờ
• Cú pháp: LEA đích, nguồn
• Trong đó:
• Đích thường là một trong các thanh ghi: BX,CX,DX,BP,SI,DI.
• Nguồn là tên biến trong đoạn DS được chỉ rõ trong lệnh hoặc ô
nhớ cụ thể.
• Thực hiện:
• Đích ← địa chỉ lệch của nguồn.
• Đích ← địa chỉ hiệu dụng của nguồn.
NHÓM CÁC LỆNH TRAO ĐỔI DỮ LIỆU
• PUSH:
• Cú pháp: PUSH Nguồn
• Thực hiện: Cất dữ liệu chỉ thị bởi toán hạng nguồn vào đỉnh ngăn xếp và tự động giảm
SP tùy theo số byte của toán hạng nguồn.
• Toán hạng sử dụng: là bộ nhớ hoặc thanh ghi.
• Ví dụ: PUSH AX
• POP:
• Cú pháp: POP đích
• Thực hiện: lấy dữ liệu từ đỉnh ngăn xếp ra toán hạng đích và tăng giá trị của SP lên một
lượng tương ứng với số byte chứa trong toán hạng đích
• Toán hạng sử dụng: là bộ nhớ hoặc thanh ghi.
• Ví dụ: POP BX
NHÓM CÁC LỆNH TRAO ĐỔI DỮ LIỆU
• Đặc điểm:
• Kết quả sau khi thực hiện lệnh chứa trong toán hạng đích.
• Trạng thái kết quả ảnh hưởng tới các cờ
• Nhóm các lệnh cộng:
• ADD: Cộng hai toán hạng
• Cú pháp: ADD đích, gốc
• Thực hiện: Đích ← đích + gốc
• Các toán hạng sử dụng trong lệnh: thanh ghi và bộ nhớ
• Ví dụ ADD AX, BX
• ADD DL,[SI]
• ADDCL, 09
• Các cờ bị thay đổi AF, CF, OF, PF, SF, ZF
• Viết câu lệnh thực cộng giá trị 08h vào thanh ghi AL.
Mov CL,08h
Add AL,CL
Add al,08h
NHÓM CÁC LỆNH TÍNH TOÁN SỐ HỌC
• JA/JNBE (nhảy nếu cao hơn/nhảy nếu không thấp hơn hoặc bằng)
• Cú pháp: JA nhan
JNBE nhan
• Thực hiện: IP ← IP + dịch chuyển
• Ví dụ: CMP AX, 12ABH; so sánh AX với 12ABH
JA THOI; nhảy đến THOI nếu AX cao hơn 12ABH
• JAE/JNB/JNC (nhảy nếu lớn hơn hoặc bằng/ nhảy nếu không thấp hơn/ nhảy nếu không có
nhớ
• Cú pháp: JAE nhan
JNB nhan
JNC nhan
• Thực hiện: IP ← IP + dịch chuyển
• Ví dụ: CMP AL, 10H; so sánh AL với 10H
JAE THOI; nhảy đến THOI nếu AL lớn hơn hoặc bằng 10H
NHÓM CÁC LỆNH NHẢY
• JB/JC/JNAE (nhảy nếu thấp hơn/ nhảy nếu có nhớ/ nhảy nếu không cao hơn hoặc bằng.
• Cú pháp: JB nhan
JC nhan
JNAE nhan
• Thực hiện: IP ← IP + dịch chuyển
• Ví dụ: CMP AL,10H
JB THOI
• JBE/JNA (nhảy nếu thấp hơn hoặc bằng/ nhảy nếu không cao hơn
• Cú pháp: JBE nhan
JNA nhan
• Thực hiện: IP ← IP + dịch chuyển
• Ví dụ: CMP AL,10H
JBE THOI
NHÓM CÁC LỆNH NHẢY
• JE/JZ ( nhảy nếu bằng nhau/ nhảy nếu kết quả bằng không)
• Cú pháp JE nhan
JZ nhan
• Thực hiện: IP ← IP + dịch chuyển
• Ví dụ: SUB AL,10H
JE THOI
• JNE/JNZ (nhảy nếu không bằng nhau/ nhảy nếu không bằng không)
• Cú pháp JNE nhan
JNZ nhan
• Thực hiện: IP ← IP + dịch chuyển
• Ví dụ: SUB AL,10H
JNE THOI
NHÓM CÁC LỆNH NHẢY
0
• SHR (dịch phải logic)
• Cú pháp SHR đích, CL
• Thực hiện MSB LSB CF
0 0
•
NHÓM CÁC LỆNH LẶP
Ví Dụ:
TIÊP: MOV AH,[BX] [SI]; nạp vào AH ô nhớ có địa chỉ DS:
[BX+SI]
Dữ liệu cho chương trình:
Dữ liệu chương trình đa dạng: có thể được cho dưới dạng hệ hai, hệ 10, hệ 16
hoặc dưới dạng kí tự. Khi cung cấp số liệu cho chương trình, số cho ở hệ nào
phải được kèm đuôi của hệ đó.
Biến
Biến trong chương trình hợp ngữ được định nghĩa kiểu dữ liệu là kiểu byte hay kiểu
từ và sẽ được chương trình dịch gán cho một địa chỉ nhất định trong bộ nhớ.
Ví Dụ: B1 DB 4
B2 DB ?
Ví dụ: W1 DW 40
Biến mảng: Biến mảng là biến hình thành từ một dãy liên tiếp các phần tử cùng loại byte hoặc
từ.
Ví dụ: M1 DB 4,5,6,7,8,9
M2 DB 100 DUP(0)
Biến kiểu sâu kí tự: Biến kiểu xâu kí tự là một trường hợp đặc biệt của biến mảng, trong đó
các phần tử của mảng là các kí tự. Một xâu kí tự có thể được định nghĩa bằng các kí tự hoặc
bằng mã ASCII của các kí tự đó.
Ví dụ: STR1 DB ‘string
STR DB 73h,74h,72h,69h,6Eh,67h
Hằng có tên: Các hằng trong chương trình hợp ngữ thường được gán tên để làm cho
chương trình trở nên dễ đọc hơn. Hằng có thể là kiểu số hay kiểu kí tự. Việc gán tên
hằng nhờ lệnh giả EQU
• Ví dụ: CR EQU 0DH
CHAO EQU ‘hello’
Một số toán tử:
Toán tử DUP
Cú pháp: <Số lần> DUP (<giá trị>)
Ý nghĩa: Giá trị sẽ được lặp lại n lần, thường dùng toán tử DUP để khai
báo một dãy (mảng).
VD: Mang1 DB 10 DUP(0)
Mảng 2 DB 12,13,5 DUP(10)
Mảng 3 DB 5,4,2 DUP (2,3 DUP(0),1)
Toán tử PTR:
Cú pháp: <Kiểu> PTR <biểu thức>
Ý nghĩa: Thay đổi dạng của <biểu thức> sang <kiểu>
Toán tử LABEL:
Cú pháp: <Tên biến> Label <byte/word)
Ý nghĩa: Dùng để khai báo biến giúp người sử dụng tránh được mâu thuẫn
kiểu khi sử dụng.
Toán tử $: Cho giá trị hiện thời của bộ đếm và giá trị bộ nhớ. Thường dùng
để tính độ dài của một chuỗi.
• Khung của một chương trình hợp ngữ: Một chương trình mã máy trong bộ nhớ
thường bao gồm các vùng nhớ khác nhau để chứa mã lệnh, chứa dữ liệu của chương
trình và một vùng nhớ khác được dùng làm ngăn xếp phục vụ hoạt động của chương
trình.
• Khai báo quy mô sử dụng bộ nhớ:
• Cú pháp: .Model kiểu_kích_thước_bộ nhớ
• Các kiểu kích thước bộ nhớ trong chương trình hợp ngữ:
Kiểu kích thước Mô tả
Tiny(hẹp) Mã lệnh và dữ liệu gói gọn trong một đoạn
Small(nhỏ) Mã lệnh gói gọn trong một đoạn. Dữ liệu nằm trong 1 đoạn
Medium Mã lệnh không gói gọn trong một một đoạn. Dữ liệu nằm trong một đoạn
Compact Mã lệnh gói gọn trong một đoạn. Dữ liệu không gói gọn trong một đoạn
Large Mã lệnh không gói gọn trong một đoạn. Dữ liệu không gói gọn trong một đoạn.
Không có mảng nào lớn hơn 64KB
Huge Mã lệnh không gói gọn trong một đoạn. Dữ liệu không gói gọn trong một đoạn.
Các mảng có thể lớn hơn 64KB
Khai báo đoạn ngăn xếp: Việc khai báo đoạn ngăn xếp cốt
để dành ra một vùng nhớ đủ lớn dùng làm ngăn xếp phục
vụ cho hoạt động của chương trình khi có chương trình con
Cú pháp: .Stack kích_thước
Ví dụ: . Stack 100
Khai báo dữ liệu: Đoạn dữ liệu chứa toàn bộ các định
nghĩa cho các biến của chương trình. Các hằng cũng nên
được định nghĩa ở đây để đảm bảo tính hệ thống mặc dù ta
có thể để chúng ở trong chương trình như đã nói ở phần
trên.
Ví dụ:.Data
MSG DB ‘hello!$’
CR DB 13
LF EQU 10
• Khai báo dữ liệu: Đoạn dữ liệu chứa toàn bộ các định nghĩa cho các
biến của chương trình. Các hằng cũng nên được định nghĩa ở đây để
đảm bảo tính hệ thống mặc dù ta có thể để chúng ở trong chương
trình như đã nói ở phần trên.
• Ví dụ:.Data
MSG DB ‘hello!$’
CR DB 13
LF EQU 10
Khai báo đoạn mã:Đoạn mã chứa mã lệnh của chương
trình. Việc khai báo đoạn mã được thực hiện nhờ hướng
dẫn chương trình dịch.
Cú pháp: .Code
Chương trình mẫu:
tên_CTC Proc
; các lệnh của thân chương trình chính
…
Call tên_ctc
…
tên_CTC Endp
• Khung chương trình hợp ngữ để dịch ra chương trình .EXE:
.Model small
.Stack 100
.Data
; các định nghĩa cho biến và hằng
.Code
Main Proc
; Khởi đầu cho DS
MOV AX,@DaTa
MOV DS,AX
; Các lệnh của chương trình chính để tại đây
; trở về DOS dùng hàm 4CH của ngắt int 21H
MOV AH,4CH
INT 21H
MAIN ENDP
; các chương trình con để tại đây
END MAIN
• Khung chương trình hợp ngữ để dịch ra chương trình .COM
.Model Tiny
.Code
Org 100h
Start: JMP Continue
; các định nghĩa cho biến và hằng đặt tại đây
Continue:
Main Proc
; Các lệnh chương trình đặt tại đây.
INT 20H; Trở về DOS
Main Endp
; Các chương trình con (nếu có) đặt tại đây.
END Start
Các cấu trúc lập trình cơ bản thực hiện bằng hợp ngữ:
Cấu trúc tuần tự.
Cấu trúc lựa chọn (IF-THEN-ELSE)
Cấu trúc lặp (WHILE-DO)
Ngoài ra còn có 4 kiểu cấu trúc khác khi thay đổi 3 kiểu cấu
trúc trúc trên:
• Cấu trúc chọn kiểu IF-THEN
• Cấu trúc chọn kiểu CASE
• Cấu trúc lặp kiểu REPEAT-UNTIL
• Cấu trúc lặp kiểu FOR-DO
Cấu trúc tuần tự
Cách thực hiện: Lệnh được sắp xếp tuần tự, lệnh này kế tiếp lệnh
kia cho đến khi công việc được hoàn thành.
Lệnh 1
Lệnh 2
Lệnh 3
…..
Lệnh n
Ví dụ: Các thanh ghi CX và BX chứa các giá trị biến c và b. Hãy tính
giá trị biểu thức a = 2x(c+b) và chứa kết quả trong thanh ghi AX.
Bài làm:
XOR AX,AX
ADD AX,BX
ADD AX,CX
SHL AX,1
RA:
Cấu trúc IF – THEN:
Cú Pháp: If Điều kiện Then Công việc
Lưu đồ thuật toán
Điều
kiện Ví dụ: Gán cho BX giá trị tuyệt đối của AX
Giải:
CMP AX,0
JNLGAN
NEG AX
Công việc
GAN: MOV BX,AX
Cấu trúc IF – THEN – ELSE
IF Điều kiện THEN Công việc 1 ELSE Công việc 2
Điều Kiện