Tìm kiếm theo tiêu đề

Tin tức cộng đồng

[MỜI HỢP TÁC] Các kỳ thi Olympic Quốc tế 2026 (IMO - IEO - ISO)

Kính gửi Quý Lãnh đạo, Ban Giám hiệu và Quý Thầy/Cô, FermatTech (Đối tác Google tại VN) phối hợp cùng SCO Ấn Độ trân trọng kính mời tham gia 3 kỳ thi uy tín dành cho HS từ lớp 1 - 12: - IMO: Olympic Toán Quốc tế. - IEO: Olympic Tiếng Anh Quốc tế. - ISO: Olympic Khoa học...
Xem tiếp

Tin tức thư viện

Chức năng Dừng xem quảng cáo trên violet.vn

12087057 Kính chào các thầy, cô! Hiện tại, kinh phí duy trì hệ thống dựa chủ yếu vào việc đặt quảng cáo trên hệ thống. Tuy nhiên, đôi khi có gây một số trở ngại đối với thầy, cô khi truy cập. Vì vậy, để thuận tiện trong việc sử dụng thư viện hệ thống đã cung cấp chức năng...
Xem tiếp

Hỗ trợ kĩ thuật

  • (024) 62 930 536
  • 0919 124 899
  • hotro@violet.vn

Liên hệ quảng cáo

  • (024) 66 745 632
  • 096 181 2005
  • contact@bachkim.vn

Vi xử lý

Wait
  • Begin_button
  • Prev_button
  • Play_button
  • Stop_button
  • Next_button
  • End_button
  • 0 / 0
  • Loading_status
Nhấn vào đây để tải về
Báo tài liệu có sai sót
Nhắn tin cho tác giả
(Tài liệu chưa được thẩm định)
Nguồn: ĐH Bách Khoa Tp.HCM
Người gửi: Vũ Ngọc Thanh
Ngày gửi: 09h:45' 14-03-2013
Dung lượng: 1.5 MB
Số lượt tải: 89
Số lượt thích: 0 người
Z80
Tập lệnh
ĐHBK Tp HCM-Khoa Đ-ĐT
BMĐT
Vi Xử Lý - Hồ Trung Mỹ
Hợp ngữ và Mã máy
Ngôn ngữ gợi nhớ (Mnemonic language) = hợp ngữ (assembly language)
Ngôn ngữ máy (Machine language) = mã máy (machine code)
TD: org 1000h
LD A, 20
Address
Content
1000H
1001H
1002H
1003H
Memory
Op_code
Operand
Cấu trúc lệnh
Mọi lệnh gồm có mã lệnh và nếu cần, 1 phần địa chỉ của (các) toán hạng.
OP-Code của Z80 thường thì 1 Byte (ngoại trừ trong các tác vụ dùng các thanh ghi chỉ số thì mã lệnh chiếm 2 byte)
Số địa chỉ: 0 R1 op R2  R3
1 (A) op R  R
2 (A1) op (A2)  R
3 (A1) op (A2)  (A3)

Chú ý: (A): nd của A, op: tác vụ, : chuyển, A: địa chỉ, R: thanh ghi
Các ký hiệu được dùng trong tập lệnh
d = độ dời (số có dấu 8 bit = -128  +127)
n = hằng số 8 bit
nn = hằng số 16 bit
r,r’ = thanh ghi 8 bit
dd, qq, ss, rr = thanh ghi 16 bit


Các nhóm lệnh
Z80 có 158 lệnh và 10 cách định địa chỉ
Có thể chia các lệnh thành các nhóm sau:
Chuyển dữ liệu (data transfer group)
Số học và logic (arithmetic and logical group)
Xoay và dịch (rotate and shift group)
Rẽ nhánh (branch group)
Điều khiển CPU
Truy cập port xuất/nhập
Xử lý bit (bit manipulation group)
Hoán đổi, chuyển khối và tìm kiếm
(exchange, block transfer, and search group)
Dạng tổng quát: LD op1, op2
Sao chép nội dung của toán hạng 2 (op2) vào toán hạng 1 (op1)
2 toán hạng phải cùng chiều dài (8 hay 16 bit)
Có nhiều cách định địa chỉ cho các toán hạng
toán hạng op1 không thể là hằng số

Chỉ có 1 toán hạng: với stack
PUSH rp
-> cất nội dung của thanh ghi 16 bit vào stack qua con trỏ SP
POP rp
-> lấy nội dung của phần tử đỉnh stack (qua con trỏ SP) cất vào thanh ghi 16 bit
1. Nhóm chuyển dữ liệu
Nhóm chuyển dữ liệu – nạp hằng số cho thanh ghi
Nạp hằng số 8 bit cho thanh ghi 8 bit: LD r, n
Nạp hằng số 16 bit cho thanh ghi 16 bit: LD rr, nn
A
B
C
D
E
H
L
{
}
LD
, n
BC
DE
HL
SP
IX
IY
{
}
LD
, nn
LD r, n
LD rr, nn
TD:
LD A, –24; decimal LD A, ‘B’; ASCII
LD A, 15; decimal LD A, 11001010b; binary
LD A, 0F7H; hex LD A, 123Q ; Octal

TD: Hãy viết mã máy cho lệnh LD A, –24
ĐS: Tra tập lệnh ta thấy lệnh này có 2 byte và opcode như sau: ( r = A = 111, và n = –24 = bù 2 của 24 = ECh)


Như vậy mã máy là: byte 1 = 00111110 = 3Eh
byte 2 = ECh
Nạp hằng số 8 bit cho thanh ghi
byte 1
byte 2
TD:
LD HL, –24 LD B, ‘A’
LD DE, 11001010b LD C, ‘8’ ; BC = ‘A8’
LD SP, 3FFFH LD IX, 1234h
TD: Hãy viết mã máy cho lệnh LD HL, –24






–24 biểu diễn sang số 16 bit bù 2 là FFE8h
Như vậy mã máy là: byte 1 = 0010 0001 = 21h
byte 2 = E8h
byte 3 = FFh
Nạp hằng số 16 bit cho thanh ghi 16 bit (cặp thanh ghi 8 bit)
Nhóm chuyển dữ liệu – sao chép giữa các thanh ghi
Sao chép nội dung thanh ghi 8 bit (r  r’) : LD r, r’
Sao chép nội dung thanh ghi 16 bit (SP  rr): LD SP, rr
A
B
C
D
E
H
L
{
}
LD
HL
IX
IY
{
}
LD SP,
LD r, r’
LD SP, rr
A
B
C
D
E
H
L
,{
}
TD: LD A, A
LD E, L
TD: LD SP, HL
LD SP, IX
Nhóm chuyển dữ liệu – đọc/ghi bộ nhớ dữ liệu 8 bit
Đọc bộ nhớ dữ liệu 8 bit cất vào thanh ghi 8 bit với con trỏ là thanh ghi 16 bit rp có thể là HL, IX,và IY:
LD r, (HL)
LD r, (IX+d)
LD r, (IY+d)
Riêng với r = A có thêm:
LD A, (BC)
LD A, (DE)
LD A, (nn)
Ghi vào bộ nhớ nội dung thanh ghi 8 bit (r) hoặc dữ liệu 8 bit (n) với con trỏ là thanh ghi 16 bit rp có thể là HL, IX,và IY:
LD (HL), r LD (HL), n
LD (IX+d), r LD (IX+d), n
LD (IY+d), r LD (IY+d), n
Riêng với r = A có thêm:
LD (BC), A
LD (DE), A
LD (nn), A
Chú ý:
r là 1 trong các thanh ghi A, B, C, D, E, H và L
(rp) : định địa chỉ gián tiếp qua thanh ghi HL, BC, hoặc DE
(IX+d) hay (IY+d) : định địa chỉ chỉ số với d là hằng số có dấu 8 bit  tra bảng
(nn) : định địa chỉ trực tiếp
TD: LD A, (9000H); mã máy là 3AH,00H,90H
Đọc/ghi bộ nhớ dữ liệu 8 bit
8000H
8001H
8002H
8003H

9000H
Memory
OP_code
Operand
33H
A
Operand
Sao chép
8000H
8001H

9000H
Memory
90H
HL
00H
56H
A
OP_code
TD: LD A, (HL); mã máy là 7Eh
Đọc/ghi bộ nhớ dữ liệu 8 bit – tra bảng
TD: LD A, (IX + 3) có mã máy là DDH,7EH,03H
8000H
8001H
98002H

9000H
9001H
9002H
9003H
Memory
90H
IX
00H
56H
A
OP_code
OP_code
Operand
IX + d
9000H + 03H = 9003H
Với cùng sơ đồ trên, hãy cho biết nội dung của thanh ghi A sau khi thực thi các lệnh sau:
LD IX, 9003H
LD A, (IX – 2)
Nhóm chuyển dữ liệu – đọc/ghi bộ nhớ dữ liệu 16 bit
Đọc bộ nhớ dữ liệu 16 bit cất vào thanh ghi 16 bit với địa chỉ 16 bit:
LD rp, (nn)
nghĩa là
rp_L  (nn) và rp_H  (nn+1)
Định địa chỉ hiểu ngầm qua SP:
POP rp
Nghĩa là
rp_L  (SP), SP  SP + 1
rp_H  (SP), SP  SP + 1
Chú ý:
rp_L là byte thấp của rp và rp_H là byte cao của rp
rp là 1 trong các thanh ghi 16 bit: BC, DE, HL, SP, IX, và IY
(nn) : định địa chỉ [trực tiếp] mở rộng (vì dữ liệu 16 bit)
Ghi vào bộ nhớ dữ liệu 16 bit (ở thanh ghi 16 bit rp) với địa chỉ 16 bit:
LD (nn), rp
nghĩa là
(nn)  rp_L và (nn+1)  rp_H
Định địa chỉ hiểu ngầm qua SP:
PUSH rp
Nghĩa là
SP  SP – 1, (SP)  rp_H
SP  SP – 1, (SP)  rp_L
rp
rp_L
rp_H
15 8 7 0
Đọc/ghi bộ nhớ dữ liệu 16 bit
9000H
9001H
Memory
34H
BC
56H
LD BC, (9000H) có mã máy là EDH, 4BH, 00H, 90H
Memory
56H
BC
78H
9000H
9001H
LD (9000H), BC có mã máy là EDH, 43H, 00H, 90H
FEFAH
FEFBH
FEFCH
FEFDH
Memory
56H
BC
78H
FEFBH
SP
PUSH BC có mã máy là C5H (giả sử trước khi thực thi: SP = FEFDH)
Nhóm số học và logic
Đa số các lệnh thuộc nhóm này ảnh hưởng đến các cờ (mã điều kiện) trong thanh ghi F (Flag)
S (Sign) : sau phép toán thì S = MSB của kết quả = 1(âm)/0(dương)
• Z (Zero) : nếu kết quả là 0 thì Z = 1, ngược lại Z = 0
• H (Half carry) : số nhớ tại vị trí bit thứ 3 trong phép toán +/–
• P/V (Parity/Overflow) (kiểm tra chẵn lẻ/tràn)
P (với phép toán Logic): 1 (nếu số bit 1 trong A là chẵn = Even parity), ngược lại thì P = 0 (Odd parity)
V (với phép toán số học): = 1 khi có tràn với phép toán +/–
• N (Negation) : 1(sub)/0(add)
• C (Carry) : số nhớ tại vị trí bit thứ 7 trong phép toán +/–
Nhóm số học 8 bit
Chú ý:
source có thể là hằng số, thanh ghi 8 bit (A,B,C,D,E,H,L), 16 bit (HL), (IX+d), (IY+d)
Các lệnh INC và DEC: source không được là hằng số và cờ C không bị ảnh hưởng
Cờ N = 1 sau các lệnh SUB, SBC, và DEC
Cộng/trừ 8 bit
; Định nghĩa các hằng số
NUM1 EQU 25 ; NUM1 = 19H
NUM2 EQU –17 ; NUM2 = EFH (bù 2 của 17)

; Thử lệnh ADD với toán hạng 8 bit
LD A, NUM1
LD B, NUM2
ADD A, B ; A  A + B = 25 + (–17) = 8

; Thử lệnh SUB với toán hạng 8 bit
LD A, NUM1
LD B, NUM2
SUB B ; A  A – B = 25 – (–17) = 42
Thí dụ: Điền các số 0 vào các ô nhớ có địa chỉ từ 8100H đến 817FH.
ORG 8000H
LD HL, 8100H
LD A, 00H ; hằng số cần nạp
LD C, 80H ; 817Fh – 8100h +1 = 80h
LOOP: LD (HL), A
INC HL
DEC C
JP NZ, LOOP; nếu C 0 quay lại LOOP
HALT
END
Nhóm số học 16 bit
Chú ý:
source có thể là 1 trong các thanh ghi 16 bit (BC,DE,HL, SP, IX và IY)
ss có thể là 1 trong các thanh ghi 16 bit (BC,DE,H,L, SP)
pp có thể là 1 trong các thanh ghi 16 bit (BC,DE,IX, SP)
rr có thể là 1 trong các thanh ghi 16 bit (BC,DE,IY, SP)
Cờ C không bị ảnh hưởng bởi các lệnh INC và DEC

Thí dụ: Viết chương trình con MULT10 để nhân 10 lần giá trị được cất trong cặp thanh ghi HL và kết quả cất lại vào HL (giả sử kết quả tính không bị tràn).

MULT10: ADD HL, HL ; HL  2 x HL
LD D, H ; (HL) => (DE)
LD E, L
ADD HL, HL ; 4 x HL
ADD HL, HL ; 8 x HL
ADD HL, DE ; (8+2) x HL = 10 x HL
RET
Cộng/trừ 16 bit với hằng số
; Định nghĩa hằng số
BIN16_1 EQU 2578 ; = 0A12H
BIN16_2 EQU 1289 ; = 0509H
; Thử lệnh ADD với toán hạng 16 bit dùng cặp thanh ghi HL, DE
LD DE, BIN16_1
LD HL, BIN16_2
ADD HL, DE ; HL <- HL + DE = 1289 + 2578 = 3867 = 0F1BH

; Thử lệnh SBC với toán hạng 16 bit dùng cặp thanh ghi HL, DE
SCF
CCF ; Xoa co Carry (CF = 0) hoặc có thể dùng 1 lệnh AND A
LD DE, BIN16_1
LD HL, BIN16_2
SBC HL, DE ; HL <- HL – DE = 1289 – 2578 = –1289 = FAF7H
Cộng/trừ 16 bit với biến số (1)
; Thử lệnh ADD với toán hạng 16 bit dùng thanh ghi 8 bit
LD IX, BIN16_1 ; Lấy byte thấp trước
LD A, (IX)
LD IY, BIN16_2
LD B, (IY)
ADD A,B
LD DE, RESULT
LD (DE), A
INC IX ; Pointer chỉ đến byte cao
INC IY
INC DE
LD A, (IX)
LD B, (IY)
ADC A, B
LD (DE), A
HALT
; Định nghĩa các biến
BIN16_1: DEFW 1289 ; 0509h
BIN16_2: DEFW 2578 ; 0A12h
RESULT: DEFS 2
END
Chú ý:
1 số assembler dùng DW thay cho DEFW
Cộng/trừ 16 bit với biến số (2)
; Thử lệnh ADD với toán hạng 16 bit dùng cặp thanh ghi HL, DE
LD DE, (BIN16_2) ; DE = 2578 = 0A12h
LD HL, (BIN16_1) ; HL = 1289 = 0509h
ADD HL, DE ; HL <- HL + DE = 1289 + 2578 = 3867 = 0F1BH
LD (RESULT_1), HL

; Thử lệnh SBC với toán hạng 16 bit dùng cặp thanh ghi HL, DE
SCF
CCF ; Xóa cờ Carry (CF= 0) hoặc có thể dùng 1 lệnh AND A
LD DE, (BIN16_2)
LD HL, (BIN16_1)
SBC HL, DE ; HL <- HL - DE = 1289 - 2578 = -1289 = FAF7H
LD (RESULT_2), HL
HALT
; định nghĩa các biến
BIN16_1: DEFW 1289 ; 0509h
BIN16_2: DEFW 2578 ; 0A12h
RESULT_1: DEFS 2
RESULT_2: DEFS 2
END
Nhóm số học đa dụng
Cộng 2 số BCD 4 digit
; Cộng 2 số BCD 4 digits
LD IX, BIN16_1 ; Lấy byte thấp trước
LD A, (IX)
LD IY, BIN16_2
LD B, (IY)
ADD A, B
DAA
LD DE, RESULT
LD (DE), A ; Cất 2 ký số BCD thấp trước của kết quả
INC IX ; Pointer chỉ đến byte cao
INC IY
INC DE
LD A, (IX)
LD B, (IY)
ADC A, B
DAA
LD (DE), A ; Cất 2 ký số BCD cao trước của kết quả
HALT
BIN16_1: DEFW 1289H ; Biểu diễn BCD của 1289
BIN16_2: DEFW 2578H ; Biểu diễn BCD của 2578
RESULT: DEFS 2
END
Tính bù 2 của 1 số 16 bit trong bộ nhớ
org 100H
; Lấy bù 2 của 1 số 16 bit NUM1 trong bộ nhớ ở địa chỉ 200H
; va cất lại vào biến 16 bit NUM2 trong bộ nhớ ở địa chi 202H
LD HL, (NUM1) ; Nếu (NUM1) = 56D3H
LD A, L
CPL ; tính bù 1 cua byte thấp
LD L, A
LD A, H
CPL ; tính bù 1 của byte cao
LD H, A
INC HL
LD (NUM2), HL ; bù 2 ở (NUM2) = A92DH
HALT
org 200H
NUM1: defw 56D3H
NUM2: defs 2 ; bù 2 của 56D3H là A92DH
NUM3: defs 2
END
Nhóm Logic 8 bit
Chú ý:
Thanh ghi A là toán hạng hiểu ngầm
source có thể là hằng số, thanh ghi 8 bit (A,B,C,D,E,H,L) , 16 bit (HL), (IX+d),
(IY+d)
Thực hiện phép toán logic cho từng cặp bit tương ứng của 2 toán hạng
Cờ P/V cho biết trị parity chẵn (=1 nếu số bit 1 trong kết quả là số chẵn)
Cờ C luôn luôn = 0 sau lệnh logic => dùng để xóa cờ C
Các lệnh Logic
; Hiệu ứng cập nhật cờ Parity sau lệnh LOGIC
LD A, 1
AND 0FFH ; P/V=0 (do số bit 1 của kết quả AND là lẻ = 00000001b)
LD A, 3
AND 0FFH ; P/V=1 (do số bit 1 của kết quả AND là chẵn = 00000011b)

; Tính bù 1 của 1 số nhị phân trong thanh ghi A
LD A, 24 ; A = 18h
XOR 0FFh ; A = 18h XOR FFh = E7h

; Đặt 1 bit lên 1 bằng cách OR với 1 tại vị trí đó
LD A, 25h ; A = 00100101b
OR 01001000b ; A = A OR 48h = 01101101b = 6Dh
Nhóm xoay và dịch bit
3.1 Nhóm xoay bit
Chú ý:
X có thể là A, B, C, D, E, H, L, (HL), (IX+d), (IY+d)
Với xoay trái cờ C = MSB cũ của toán hạng
Với xoay phải cờ C = LSB cũ của toán hạng
Đổi số BCD 2 ký số (nén) sang biểu diễn ASCII tương ứng
; TD: A = 25H (BCD của 25) thì chuyển sang ASCII là 32H (‘2’) và 35H (‘5’)
; trong D và E (D = 32H và E = 35H)
BCD_ASCII:
LD C, A ; C = A = xyH với x,y = 0  9
AND 0F0H ; A = x0H
RRA
RRA
RRA
RRA ; lấy nửa byte cao: A = 0xH
OR 30H ; Đổi sang ASCII tương đương: A = 3xH
LD D, A ; D = 3xH
LD A, C ; A = xyH
AND 0FH ; lấy nửa byte thấp: A = 0yH
OR 30H ; Đổi sang ASCII tương đương: A = 3yH
LD E,A ; E = 3yH
RET
Chú ý:
Nội dung của thanh ghi A bị thay đổi trong chương trình con này!
Lệnh OR 30H có thể được thay bằng lệnh ADD A,30H có cùng kết quả!
; TD: Biểu diễn ASCII của 25 trong D và E ( D = 32H và E = 35H) được
; chuyển thành BCD nén 2 ký số ở A = 25H (BCD của 25)
ASCII_HEX:
LD A, D ; A = D = 3xH
AND 0FH ; A = 0xH
RLA
RLA
RLA
RLA
LD C, A ; C = A = x0H
LD A, E ; A = 3yH
AND 0FH ; A = 0yH
ADD A, C ; A = x0H + 0yH = xyH
RET
Chú ý:
Chương trình này làm thay đổi nội dung các thanh ghi A và C.
Đổi sang biểu diễn ASCII của 2 ký số BCD sang
số BCD 2 ký số (nén)
Nhóm xoay digit
Chú ý:
Tác động thanh ghi A và nội dung bộ nhớ có địa chỉ trong HL
Có ý nghĩa khi xoay trái/phải số BCD nén có 3 ký số (digit)
(HL)
(HL)
Nhóm dịch bit
Chú ý:
X có thể là A, B, C, D, E, H, L, (HL), (IX+d), (IY+d)
Không có lệnh dịch trái logic SLL vì hiệu ứng giống như SLA
Hiệu ứng của các lệnh dịch bit
LD A, 11 ; A = 0000 1011b = 11
SLA A ; A = 0001 0110b = 22 = 11 x 2
SLA A ; A = 0010 1100b = 44 = 22 x 2
SRA A ; A = 0001 0110b = 22 = 44 /2
SRA A ; A = 0000 1011b = 11 = 22 /2
SRA A ; A = 0000 0101b = 05 = 11 /2
LD A, -22 ; A = 1110 1010b = -22
SRA A ; A = 1111 0101b = -11 = -22/2
SRA A ; A = 1111 1010b = -6 = -11/2
SLA A ; A = 1111 0100b = -12 = -6x2
SRL A ; A = 0111 1010b = 123
SRL A ; A = 0011 1101b = 61 =123/2
NX:
Có thể chia nguyên cho 2: dùng dịch trái để nhân đôi hoặc dịch
phải để chia đôi.
Với có dấu thì phải dùng SLA và SRA
Có thể vận dụng phép toán dịch và cộng để thực hiện phép toán nhân/chia!

Nhân số không dấu X cho với 1 số có dạng 2n + 1
; X * (2n + 1) = X*2n + X = dịch X sang trái n bit + X
; Giả sử kết quả của phép nhân sẽ đặt trong 1 số 16 bit.
; Chương trình con MUL_2NA1 nhân 1 số ở thanh ghi A với 1 số có dạng 2n + 1 ở B
; và kết quả 16 bit được đặt̉ trong cặp thanh ghi DE
ORG 100H
LD A, 27
LD C,17
CALL MUL_2NA1
HALT
MUL_2NA1:
LD D, 0
LD E, A
DEC C
RET Z
CALL SHIFT_N
ADD A, E
LD E, A
LD A, 0
ADC A, D
RET
; Tinh DE = A x 2^n bằng cách dịch DE
; sang trái n bit (đặt trong C)
SHIFT_N:
SRL C
RET C
SLA E ; Dịch trái DE
RL D
JR SHIFT_N
Chú ý:
SV hãy thêm các lệnh để bảo toàn AF và BC khi gọi MUL_2NA1
Nhóm rẽ nhánh chương trình
Các lệnh nhảy (jump) tuyệt đối
Chú ý:
target là giá trị địa chỉ 16 bit có thể là hằng số, (HL), (IX), IY)
cc (codition code = mã điều kiện) có thể là Z,N Z, C, NC, P, M, PE, PO,
TD:
LOOP: JP NEXT ; có mã máy là C3h, byte thấp của NEXT, và byte cao của NEXT
JP (HL) ; PC  HL
JP (IX) ; PC  IX
JP (IY) ; PC  IY
NEXT: JP PO, LOOP
JP NC, CONTINUE
Ý nghĩa của các [mã] điều kiện cc
Các lệnh nhảy tương đối
Chú ý:
target_N là nhãn mà cách xa tương đối với địa chỉ lệnh kế trong dải (-128 +127)
offset là giá trị có dấu 8 bit (-128 +127) được tính theo công thức sau
offset = target_N – địa chỉ lệnh kế
cond (condition = điều kiện) có thể là Z, NZ, C, NC.
Kết hợp DJNZ với các lệnh nhảy khác ta có tạo nên các cấu trúc điều khiển:
repeat-until, while-do
Xóa 1 phần bộ nhớ
Ta muốn xóa nội dung bộ nhớ từ địa chỉ BASE đến địa chỉ BASE + LENGTH – 1 với LENGTH (có giá trị từ 0 đến 255).
TD: Với BASE và LENGTH cụ thể như sau
ORG 100H
BASE EQU 400h
LENGTH EQU 32
LD B, LENGTH ; Nạp vào B chiều dài LENGTH
LD A, 0 ; xóa ô nhớ với giá trị trong A
LD HL, BASE ; chỉ đến BASE
CLEAR:
LD (HL), A ; xóa ô nhớ có địa chỉ chứa trong HL
INC HL ; HL = HL + 1 để chỉ đến ô nhớ kế
DEC B ; B = B – 1 giảm bộ đếm số ô nhớ
JR NZ, CLEAR
HALT
Chú ý:
Có thể thay 2 lệnh DEC B và JR bằng 1 lệnh: DJNZ CLEAR
Khi B = 0 thì số byte cần xóa là bao nhiêu?
Phân tích mã máy của lệnh JR
JR NZ, CLEAR có mã máy có 2 byte là 20h, offset (8bit)
Offset là byte thấp của phép trừ:
địa chỉ tại CLEAR – địa chỉ lệnh kế = 0107h – 010Ch = FFFBh
Chú ý: Nếu thay JR.. bằng JP NZ, CLEAR thì tại đó ta có mã máy là 3 byte:
C2 07 01 (vì địa chỉ tại CLEAR là 0107h)

Tính tổng của 1 mảng dữ liệu trong bộ nhớ
org 100H
; Chương trình tính tổng 1 mảng các số 8 bit không dấu với số phần tử
; trong B và với địa chỉ bắt đầu trong HL
; Kết quả tổng (Sum) được cất vào trong DE
LD A, (N)
LD B, A ; Lấy số phần tử đặt vào B
LD HL, DATA
LD A, 0
LD DE, 0 ; Sum <- 0
LOOP: ADD A, (HL)
LD E, A ; Cập nhật byte thấp của Sum
JR NC, NEXT
INC D ; Cập nhật byte cao của Sum
NEXT: INC HL
DJNZ LOOP
HALT
DATA: defb 10
defb 20
defb 30
defb 40
defb 50
defb 60
defb 70
defb 80
N: defb $-DATA
; $ la dia chi hien tai
; do đó $ - DATA = 8

Các lệnh liên quan chương trình con
Chú ý:
cc (codition code= mã điều kiện) có thể là Z, N Z, C, NC, P, M, PE, PO
Với CALL và RET có điều kiện thì lệnh chỉ được thực thi nếu cc đúng, ngược lại thì tiếp lục lệnh kế
Điền các khối bộ nhớ với giá trị ở thanh ghi A
HL= Địa chỉ bắt đầu
B = chiều dài của khối cần điền
org 100h
LD HL, 400H
LD B, 32
LD A,0FFH
CALL FILL_PROC ; Điền FFh vào 32 byte từ địa chỉ 0400h
LD HL, 440H
LD B, 16
LD A,055H
CALL FILL_PROC ; Điền 55h vào 16 byte từ địa chỉ 0440h
HALT
FILL_PROC:
LD (HL), A
INC HL; tăng con trỏ
DJNZ FILL_PROC
RET
Kiểm tra 1 ký tự có thuộc 1 dãi trị số không
Viết chương trình con kiểm tra xem 1 ký tự ASCII ở ô nhớ LOC có phải
là số trong dãi số từ 0 đến 9, nếu đúng thì cho cờ Z=1.
Bài giải.
IS_NUMBER:
LD A, (LOC) ; lấy ký tự vào A
CP 30H ; so sánh với ASCII của số 0
JR C, EXIT ; nếu A < 30H thì thoát
CP 3AH ; so sánh với ‘9’ + 1
JR NC, EXIT ; nếu A > 39H thì thoát
CP A ; làm cho cờ Z = 1
EXIT: RET
Cách 2: Dùng RET cc
IS_NUMBER:
LD A, (LOC) ; lấy ký tự vào A
CP 30H ; so sánh với ASCII của số 0
RET C ; nếu A < 30H thì thoát
CP 3AH ; so sánh với ‘9’ + 1
RET NC ; nếu A > 39H thì thoát
CP A ; làm cho cờ Z=1
RET
Nhóm điều khiển CPU
Chú ý: Ở đây ta không khảo sát các lệnh liên quan về ngắt.
Nhóm truy cập port xuất/nhập
Chú ý:
Z80 dùng 8 bit địa chỉ thấp (A7..A0) cho các cổng I/O => có tối đa 256 cổng nhập và 256 cổng xuất
r có thể là A, B, C, D, E, H, L
LED sáng lần lượt từ phải sang trái và lặp lại
org 100h
PATTERN EQU 01H
LD C, PATTERN
LOOP: LD A, C
OUT (03H), A
RLC C ; Dùng RRC, C sẽ chạy sang phải!
CALL DELAY
JR LOOP
; Chương trình con DELAY làm trễ
DELAY:
LD B, 0 ; vòng lặp với B là 256 lần!
L1: LD D, 0 ; vòng lặp với D là 256 lần!
L2: DEC D
JR NZ, L2
DJNZ L1
RET
Chú ý:
Trong thí dụ này, port xuất với địa chỉ 03H có gắn 8 LED đơn và khi xuất ra 1 tại bit
đó thì LED sẽ sáng
Điều khiển LED sáng chạy sang trái/phải theo trị số 0/1 ở công tắc 0 (LSB của port nhập 02H)
PATTERN EQU 01H
ORG 100h
LD C, PATTERN
LOOP: IN A, (02H)
BIT 0, A
JR NZ, RIGHT
RLC C ; chạy sang trái
JR NEXT
RIGHT: RRC C ; chạy sang phải
NEXT: CALL DELAY
LD A, C
OUT (03H), A
JR LOOP

; Chương trình con DELAY làm trễ
DELAY: LD B, 0 ; vòng lặp với B là 256 lần!
L1: LD D, 0 ; vòng lặp với D là 256 lần!
L2: DEC D
JR NZ, L2
DJNZ L1
RET
Khi Z = 0 = NOT (LSB của A) hay công tắc 0 có trị là 1 thì LED sáng chạy sang phải
Hiển thị liên tục các số từ 0  9 trên LED 7 đoạn
Giả sử các LED 7 đoạn trong hiển thị 4 ký số lần lượt có các địa chỉ là
0AH, 0BH, 0CH, và 0DH cho các ký số tương ứng từ vị trí cao xuống
thấp. Trong TD này ta xuất LED 7 đoạn ở vị trí tận cùng bên phải, nên
dùng địa chỉ 0DH!
ORG 100h
LD L,0 ; chứa số sẽ hiện ra
LOOP: LD A,L
CALL DEC2LED ; chương trình con đổi BCD sang mã 7 đoạn OUT (0DH),A ; Xuat ra LED 7 doan tai digit don vi!
CALL DELAY
INC L
LD A,9
CP L
JR NC,LOOP
LD L,0
JR LOOP
; Chuong trinh con DELAY lam tre
DELAY: LD B, 0 ; vong lap voi B la 256 lan!
L1: LD C, 100; vong lap voi C la 100 lan!
L2: DEC C
JR NZ, L2
DJNZ L1
RET
Chương trình con đổi BCD sang mã 7 đoạn
DEC2LED:
PUSH DE
PUSH IX
AND 0FH
LD E, A
LD D, 0
LD IX, XLAT_TAB
ADD IX, DE
LD A, (IX+0)
POP IX
POP DE
RET
XLAT_TAB:
; LED 7 doan trong mo phong nay co thu
; tu cac doan nhu sau
; ( 0=LED tắt, 1=LED sáng )
; -hgfedcba
DEFB 00111111B; 0
DEFB 00000110B; 1
DEFB 01011011B; 2
DEFB 01001111B; 3
DEFB 01100110B; 4
DEFB 01101101B; 5
DEFB 01111101B; 6
DEFB 00000111B; 7
DEFB 01111111B; 8
DEFB 01101111B; 9
Chương trình con này bão toàn nội dung của DE và IX
IX = địa chỉ đầu bảng tra + chỉ số
DE = chỉ số (được truyền từ chương trình gọi nó đặt trong A)
Trị trả về là mã 7 đoạn tương ứng trong thanh ghi A
Nhóm xử lý bit
Chú ý:
b có trị là vị trí của bit đang xét, thuộc dải 0  7 (7 = ở MSB và 0 = ở LSB)
m có thể là A, B, C, D, E, H, L, (HL), (IX+d), (IY+d)
Mạch so sánh bằng nhau
Mô phỏng mạch số so sánh 2 toán hạng 8 bit (trong A và B), nếu chúng
bằng nhau thì đặt LSB của D lên 1, ngược lại thì xóa nó về 0

org 100H
LD A, 12
LD B, 11
CALL COMP ; kết quả = 0
LD A, 11
CALL COMP ; kết quả = 1
HALT

COMP:
CP B
JR Z, A_EQ_B
RES 0, D
RET
A_EQ_B:
SET 0, D
RET
Nhóm hoán đổi, chuyển khối và tìm kiếm
Tóm tắt tập lệnh Z80 với các cờ
 
Gửi ý kiến