tập lệnh 8086

You might also like

Download as pptx, pdf, or txt
Download as pptx, pdf, or txt
You are on page 1of 55

TẬP LỆNH CỦA 8086

• Khái niệm về lệnh: Lệnh của bộ VXL được ghi bằng


các ký tự dưới dạng gợi nhớ (mnemonic) để người sử
dụng có thể nhận biết. Lệnh được mã hóa dưới dạng
các bít nhị phân 0 và 1 và được gọi là mã máy. Một
lệnh có độ dài từ 1 đến 6 byte.
• Mã hóa lệnh:
• Ví dụ mã hóa lệnh MOV.
- Mã hóa câu lệnh:
- MOV CL,[BX]

Byte1 Byte 2 Byte 3 Byte 4


1 0 0 0 1 0

MOV D W Mod REG R/M


Bảng mã thanh ghi
Mã Thanh Ghi
W=0 W=1
000 AL AX
001 CL CX
010 DL DX
011 BL BX
100 AH SP
101 CH BP
110 BH SI
111 DH DI

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

000 [BX] + [SI] [BX] + [SI] +Add8 [BX] + [SI] +Add16 AX AL


001 [BX] + [DI] [BX] + [DI] +Add8 [BX] + [DI] +Add16 CX CL
010 [BP] +[ SI] [BP] +[ SI] + Add8 [BP] +[ SI] + Add16 DX DL
011 [BP] + [DI] [BP] + [DI] + Add8 [BP] + [DI] + Add16 BX BL
100 [SI] [SI] + Add8 [SI] + Add16 SP AH
101 [DI] [DI] + Add8 [DI] + Add16 BP CH
110 Addr16 Addr16 + Add8 Addr16 + Add16 SI DH
111 [BX] [BX] + Add 8 [BX] + Add 16 DI BH
CÁC CHẾ ĐỘ ĐỊA CHỈ CỦA 8086

• Chế độ địa chỉ (addressing mode) là cách để CPU tìm


thấy toán hạng cho các lệnh của nó khi hoạt động.
• Bộ VXL 8086 có 7 chế độ địa chỉ:
• Chế độ địa chỉ thanh ghi (register addressing mode)
• Chế độ địa chỉ tức thì (immediate addressing mode)
• Chế độ địa chỉ trực tiếp (direct addressing mode)
• Chế độ địa chỉ gián tiếp qua thanh ghi
• Chế độ địa chỉ tương đối cơ sở (based relative addressing
mode)
• Chế độ địa chỉ tương đối chỉ số (indexed relative addressing
mode)
• Chế độ địa chỉ tương đối chỉ số cơ sở (based indexed relative
addressing mode)
• Chế độ địa chỉ thanh ghi: Sử dụng thanh ghi bên trong CPU như là các toán
hạng để chứa dữ liệu cần thao tác.
• Ví dụ: MOV BX,DX; chuyển nội dung DX vào BX

• 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ớ

XCHG Chuyển đổi dữ liệu giữa 2 toán hạng đích và nguồn

XLAT Lấy dữ liệu trong bảng vào thanh ghi AL

LEA Nạp địa chỉ hiệu dụng


LDS Nạp con trỏ bộ nhớ vào thành ghi DS
LES Nạp con trỏ bộ nhớ vào thanh ghi ES
PUSH Cất dữ liệu vào ngăn xếp
POP Lấy dữ liệu ra khỏi ngăn xếp
IN,OUT Đọc ghi dữ liệu giữa cổng và thanh ghi
NHÓM CÁC LỆNH TRAO ĐỔI DỮ LIỆU

• 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

• OUT: Ghi dữ liệu từ Acc ra cổng


• Cú pháp: OUT port, ACC.
• Thực hiện: Port←ACC
• Port có giá trị trong khoảng 00 đến FFH. Các trường hợp:
• Nếu Acc là AL thì dữ liệu 8 bit được đua ra Port.
• Nếu Acc là AX thì dữ liệu 16 bit được đưa ra Port và Port +1.
• Ví dụ: OUT [45H],AL
• IN: Đọc dữ liệu từ cổng vào thanh ghi Acc.
• Cú pháp: IN Acc,port
• Thực hiện: Acc ← port.
• Port có giá trị trong khoảng từ 00 đến FFH. Các trường hợp:
• Nếu Acc là AL thì dữ liệu 8 bit được đưa vào từ port.
• Nếu Acc là AX thì dữ liệu 16 bit được đưa vào từ port và port +1.
• Ví dụ: IN AL,[45H]
NHÓM CÁC LỆNH TÍNH TOÁN SỐ HỌC

• Đặ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

• Nhóm các lệnh cộng


• ADC: cộng có nhớ
• Cú pháp: ADC đích, gốc
• Thực hiện: đích ← đích + gốc + CF
• Các toán hạng: thanh ghi và ô nhớ
• Các cờ thay đổi giống lệnh cộng
• Ví dụ ADC AL, 74H
• INC:
• Cú pháp: INC đích
• Thực hiện: đích ← đích + 1
• Các toán hạng: thanh ghi và ô nhớ.
• Các cờ thay đổi: AF, OF, PF, SF, ZF
• Ví dụ INC AL; AL + 1
NHÓM CÁC LỆNH TÍNH TOÁN SỐ HỌC

• AAA: Chỉnh sau khi cộng hai số dạng ASCII


• Cú pháp: AAA
• Thực hiện: Chỉnh kết quả trong AL bằng lệnh AAA để thu được kết quả là số
BCD không gói.
• Nếu giá trị 4 bit thấp của thanh ghi AL>9, AF = 1 thì tiến hành cộng giá trị 06
vào AL, sau đó cộng 1 vào giá trị của thanh ghi AH và dựng AF = 1. Tiếp đó
đưa 4 bit cao của thanh ghi AL xuống 0.
• Nếu giá trị 4 bit thấp của thanh ghi AL <= 9, giá trị AF = 0 thì cần đưa 4 bit
cao của thanh ghi AL xuống 0.
NHÓM CÁC LỆNH TÍNH TOÁN SỐ HỌC
• Nhóm các lệnh trừ:
• SUB:
• Cú pháp: SUB đích, gốc
• Thực hiện: đích ← đích – gốc
• Các toán hạng giống lệnh cộng.
• Các cờ thay đổi giống lệnh cộng.
• Ví dụ: SUB AL, 78H
• SBB:
• Cú pháp: SBB đích, gốc
• Thực hiện: Đích ← đích – gốc + CF
• Ví dụ: SBB AL,74H
• DEC:
• Cú pháp: DEC đích
• Thực hiện: đích ← đích -1; giảm đích đi một
• Các toán hạng và các cờ thay đổi giống lệnh cộng
• Ví dụ: MOV BX, 1200H
DEC BX
• NEG: Lấy bù hai toán hạng đích
• Cú pháp: NEG đích
• Thực hiện : Đích ← 0 – đích
• Ví dụ: NEG AL; 0-AL
NHÓM CÁC LỆNH TÍNH TOÁN SỐ HỌC
• Nhóm các lệnh nhân:
• MUL (lệnh nhân):
• Cú pháp: MUL nguồn
• Thực hiện: AX ← AL * nguồn 8bit; khi toán hạng nguồn 8
bít
DXAX← AX* nguồn 16bit; khi toán hạng nguồn
16 bít
Ví dụ: MUL CX; AX*CX→DXAX
MUL BL;AL*BL → AX
• IMUL (nhân số nguyên có dấu)
• Cú pháp: IMUL nguồn
• Thực hiện: tương tự như lệnh nhân với các số nguyên ngoài
ra còn thực hiện nhân các số nguyên có dấu khác
NHÓM CÁC LỆNH TÍNH TOÁN SỐ HỌC

• Nhóm các lệnh chia:


• DIV (Lệnh chia)
• Cú pháp: DIV nguồn
• Thực hiên: + Với nguồn 8 bit, số bị chia trong AX, thương số trong AL, số dư trong AH.
+ Với nguồn 16 bít, số bị chia trong DXAX, thương số trong AX, số dư chứa trong DX
Ví dụ: MOV AX,0033H
MOV BL,25
DIV BL
• IDIV (Lệnh chia số nguyên có dấu):
• Cú pháp: IDIV nguồn
• Thực hiện: tương tự như lệnh chia với các số nguyên không dấu, ngoài ra còn thực hiện chia
các số nguyên có dấu khác
NHÓM CÁC LỆNH TÍNH TOÁN LOGIC

• AND (Phép và logic):


• Cú pháp: AND đích, nguồn
• Thực hiện: đích ← đích^nguồn
• Các cờ bị thay đổi: CF, OF, PF, SF, ZF
• Ví dụ: AND DX,CX; DX and CX theo từng bít
AND AL, 0FH; che 4 bit cao của AL
• NOT (phủ định logic)
• Cú pháp: NOTđích
• Thực hiện: đảo các giá trị của các bit của toán hạng đích.
• Các cờ bị thay đổi không.
Viết đoạn câu lệnh thực hiện đảo các bit trong thanh ghi AL = 1101101
Mov al, 1101101
Not al
NHÓM CÁC LỆNH TÍNH TOÁN LOGIC

• OR (Phép hoặc logic):


• Cú pháp: OR đích, nguồn
• Thực hiện: đích ← đích ν nguồn
• Các cờ bị thay đổi: CF, OF, PF, SF, ZF.
• Ví dụ: OR AX,BX; AX← AX ν BX theo từng bit
OR CL,30H; lập bit b4 và b5 của CL lên 1.
• XOR (hoặc đảo)

• Cú pháp: XOR đích, nguồn
• Thực hiện: đích ← đích nguồn
• Các cờ bị thay đổi: CF, OF, PF, SF, ZF.
• Ví dụ: XOR AX,AX
XOR BX,BX
MOV AX,5857H
MOV BX,58A8H
XOR AX,BX
NHÓM CÁC LỆNH SO SÁNH

• CMP (so sánh):


• Cú pháp: CMP đích, nguồn
• CMP trừ toán hạng đích cho toán hạng nguồn, chúng có thể là các byte hoặc
các từ, nhưng không lưu trữ kết quả.
• Các cờ bị thay đổi: AF, CF, OF, PF, SF, ZF.
• Các cờ chính theo quan hệ đích và nguồn khi so sánh hai số không dấu:
So sánh CF ZF
Đích = nguồn 0 1
Đích >nguồn 0 0
Đích <nguồn 1 0
NHÓM CÁC LỆNH NHẢY

• 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

• JMP (Lệnh nhảy không điều kiện):


• Cú pháp: JMP nhan
• Thực hiện: chuyển điều khiển chương trình tới vị trí xác định bởi “nhan” chỉ
thị trong lệnh
• Nhảy ngắn và nhảy gần: lệnh sẽ chuyển điều khiển tới nhãn cách lệnh nhảy
trong khoảng từ -128 tới 127. Toán hạng sử dụng tính theo giá trịnh tương đối,
giá trị IP thay đổi, CS không thay đổi.
• Với mem16 và Reg16: lệnh sẽ chuyển điều khiển tương đối trong khoảng từ -
32678 tới 32767. Giá trị IP thay đổi.
• Với Mem32 và nhảy xa: Lệnh sẽ chuyển điều khiển qua đoạn 64KB khác của
bộ nhớ. Cả CS và IP đều được gán giá trị mới.
NHÓM CÁC LỆNH DỊCH – QUAY TOÁN HẠNG
• Nhóm các lệnh quay toán hạng:
• RCL (Quay trái thông qua cờ nhớ)
• Cú pháp: RCL đích,CL
• Trong đó CL chứa sẵn số lần quay.
• Thực hiện
CF MSB LSB

• RCR (Quay phải thông qua cờ nhớ)


• Cú pháp: RCR đích,CL
• Trong đó CL chứa sẵn số lần quay
• Thực hiện
CF MSB LSB
• Viết câu lệnh thực hiện quay trái thông qua cờ nhớ thanh ghi AL 3 lần.
• Mov cl,3
RCL al,cl
NHÓM CÁC LỆNH DỊCH – QUAY TOÁN HẠNG

• Nhóm các lệnh quay toán hạng:


• ROL (Quay vòng trái)
• Cú pháp: ROL đích, CL
• Trong đó CL chứa số lần quay
• Thực hiện CF MSB LSB

ROR (Quay vòng sang phải)


Cú pháp: ROR đích, CL
Trong đó CL chứa số lần quay
Thực hiện: MSB LSB CF
NHÓM CÁC LỆNH DỊCH – QUAY TOÁN HẠNG

• SAL/SHL (dịch trái số học/dịch trái logic)


• Cú pháp: SAL đích, CL
SHL đích, CL
• Thực hiện: CF MSB LSB

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

• LOOP (lặp nếu CX ≠0)


• Cú pháp: LOOP nhan
• Thực hiện: Lệnh này dùng để lặp lại đoạn chương trình cho đến khi số lần lặp
CX = 0. Điều này có nghĩa là trước khi vào vòng lặp ta phải đưa số lần lặp
mong muốn vào CX, sau mỗi lần lặp CX giảm đi 1.
• Ví dụ: MOV AL,0; xóa AL
MOV CX,10; nạp số lần lặp vào CX
LAP: INC AL;tăng AL lên 1
LOOP LAP
NHÓM CÁC LỆNH LẶP

• LOOPE/LOOPZ (lặp lại đoạn chương trình cho đến khi CX = 0,


ZF = 0)
• Cú pháp: LOOPE nhan
LOOPZ nhan
• Thực hiện: Lệnh này dùng để lặp đoàn chương trình cho đến khi số lần
lặp CX = 0 hoặc cờ ZF = 0. Điều này có nghĩa là trước khi vào vòng lặp
ta phải đưa số lần lặp mong muốn vào CX, sau mỗi lần lặp CX giảm đi 1
• Ví dụ: MOV AL,AH; AL = AH
MOV CX,50; NẠP SỐ LẦN LẶP VÀO CX
LAP: INC AL; TĂNG AL
CMP AL,16; SO SÁNH AL VỚI 16
LOOPE LAP
NHÓM CÁC LỆNH ĐIỀU KHIỂN ĐẶC BIỆT

• CALL (gọi chương trình con)


• INT (Lệnh gọi ngắt)
• IRET (Trở về chương trình chính từ chương trình con phục vụ ngắt)
• NOP (CPU không làm gì)
• RET (Trở về chương trình chính từ chương trình con
BÀI TẬP
1. Hãy cho biết chế độ địa chỉ và mô tả hoạt động của 8086 khi
thực hiện các lệnh sau:
a. MOV AX, BX k. MOV CX,[1234H]
b. SUB AX,DX l. XOR CL,BH
c. AND AH,CH m. SHL DX,CL
d. DEC BP n. POP DS
e. MOV BX,6783H o. LEA CX,[BX+DI]
f. NEG AH p.PUSH AX
g. XLATq. XCHGDX,CX
h. ROR BL,1 r. MUL CX
i. DIV CL
2. Viết các lệnh hợp ngữ thực hiện công các công việc sau:
a. Nạp số 3654H vào thanh ghi BP.
b. Sao chép nội dung thanh ghi BP vào thanh ghi SP.
c. Sao chép nội dung thanh ghi AX tới ô nhớ có địa chỉ offset = 9876H.
d. Tăng nội dung thanh ghi CX lên 1.
e. Cộng 07H vào DL.
f. Lập bit MSB của AX lên 1 nhưng không làm ảnh hưởng tới các bit
khác,
g. Lập bit LSB của AX lên 1 nhưng không làm ảnh hưởng tới các bit
khác.
h. Che 4 bit cao của CL
i. Nhân giá trị AH với 08
j. Nghịch đảo 4 bit thấp của thanh ghi DX mà không làm ảnh hưởng
tới các bit khác.
k. Lấy bù 2 nội dung thanh ghi BP
LẬP TRÌNH HỢP NGỮ CHO 8086

Cú pháp của chương trình hợp ngữ:


Một chương trình hợp ngữ bao gồm các dòng lệnh, một lệnh
có thể là một lệnh thật dưới dạng kí hiệu, mà đôi khi còn được
gọi là dạng gợi nhớ của bộ vi xử lý, hoặc hướng dẫn cho
chương trình dịch.
Cú pháp:
TÊN MÃ LỆNH CÁC TOÁN HẠNG CHÚ GIẢI

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ớ.

 Biến byte (DB): chiếm một byte trong bộ nhớ


TÊN DB GIÁ TRỊ KHỞI ĐẦU

Ví Dụ: B1 DB 4
B2 DB ?

 Biến từ (DW): chiếm hai byte trong bộ nhớ


TÊN DW GIÁ TRỊ KHỞI ĐẦU

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

Công việc 1 Công việc 2


 Các hàm ngắt:
 Ngắt INT 20H dành riêng cho kết thúc chương trình loại .COM
Hàm 1 ngắt INT 21H: đọc 1 kí tự từ bàn phím
• Vào AH = 1
• Ra AL = mã ASCII của kí tự
AL = 0 khi kí tự ngõ vào là các phím chức năng
 Hàm 2 ngắt INT 21H: hiện kí tự lên màn hình
• Vào AH = 2
DL = mã ASCII của kí tự cần hiện thị
 Hàm 9 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ị
 Hàm 4CH ngắt INT 21H: kết thúc chương trình loại EXE
• Vào AH = 4CH
MỘT SỐ VÍ DỤ
1. Giải thích các câu lệnh và cho biết ý nghĩa của đoạn chương trình
trên.
MOV SI, 0
MOV CX, 10
LAP:
MOV AH, 1
INT 21H
INC SI
MOV AH, 2
INT 21H
LOOP LAP
b. MOV BH,41H
MOV BL,4
MOV AH,2
LAP:
MOV CX,5
MT:
MOV DL,BH
INT 21H
LOOP MT
MOV DL,’_’
INT 21H
INT 21H
INT 21H
INC BH
DEC BL
JNZ LAP
c. MOV BH,41H
MOV BL,4
MOV AH,2
LAP:
MOV CX,5
MT:
MOV DL,BH
INT 21H
ADD DL,20H
INT 21H
LOOP MT
MOV DL,’_’
INT 21H
INT 21H
INT 21H
INC BH
DEC BL
JNZ LAP
2. Viết chương trình nhập một chữ cái viết thường và in chữ đó ra dưới
dạng viết hoa ở dòng tiếp theo.
3. Viết chương trình in nội dung bảng mã ASCII ra màn hình.
4. Viết chương trình nhập vào từ bàn phím 5 chữ cái thường sau đó hiển
thị lên màn hình theo thứ tự ngược lại.
5. Viết chương trình nhập vào một xâu kí tự, sau đó in ra các kí tự số (‘0’
đến ‘9’) trong sâu đã nhập.
6. Viết chương trình nhập vào hai số có tổng nhỏ hơn 10 và in tổng của
hai số vừa nhập.
7. Viết chương trình chuyển số 128 sang số nhị phân và hiển thị lên màn
hình.
8. Viết chương trình nhận từng byte dữ liệu từ cổng có địa chỉ 20h và gửi
ra cổng có địa chỉ 30h cho tới khi gặp 2 byte liên tiếp bằng 0 thì dừng.
9. Viết chương trình nhập vào từ bàn phìm hai số có một chữ số, sau đó
tính tổng và hiển thị kết quả lên màn hình.
10. Viết chương trình 2 số có một chữ số, sau đó hiển thị lên màn hình giá
trị max của chúng.

You might also like