Microsoft Word vxl bt ch2 doc BT VXL Ch 2 – trang 1 ÑHBK Tp HCM–BMÑT GVPT Hoà Trung Myõ Baøi taäp Vi Xöû Lyù – Chöông 2 Giôùi thieäu moät soá nhoùm leänh trong taäp leänh Z80 VXL Z80 coù 158 kieåu leä[.]
Trang 1ĐHBK Tp HCM–BMĐT
GVPT: Hồ Trung Mỹ
Bài tập Vi Xử Lý – Chương 2
Giới thiệu một số nhóm lệnh trong tập lệnh Z80
VXL Z80 có 158 kiểu lệnh; nó bao gồm tất cả những lệnh của VXL
8085 (Intel) Mỗi lệnh có 2 phần: một là tác vụ (công việc) sẽ được thực hiện (như nạp [Load], cộng [Add], nhảy [Jump] ) và được gọi là mã tác vụ hay mã lệnh (opcode); phần thứ hai chỉ dữ liệu làm việc với tác vụ và được gọi là toán hạng (toán hạng)
Các lệnh 1 byte
Trong lệnh 1 byte thì mã lệnh và toán hạng trong cùng 1 byte
Tác vụ opcode operand Mã nhị phân (mã máy)
sao chép nội dung của thanh
ghi B vào thanh ghi A
LD A, B 01111000 (78H)
Các lệnh 2 byte
Trong lệnh 2 byte thì byte đầu chỉ mã lệnh và byte thứ hai chỉ toán hạng
Tác vụ opcode operand Mã nhị phân (mã máy)
Nạp vào thanh ghi B số hex
32
LD B, 32H 0000 0110 (06H) Byte1
0011 0010 (32H) Byte2
Các lệnh 3 byte
Trong lệnh 3 byte thì byte đầu chỉ mã lệnh và 2 byte tiếp theo chỉ địa chỉ hay dữ liệu 16 bit theo thứ tự ngược: byte thấp trước rồi mới tới byte cao
Tác vụ opcode operand Mã nhị phân (mã máy)
Nạp vào cặp thanh ghi BC giá trị
16 bit là 2080H LD BC, 2080H 0000 0001 (01H) Byte 1 1000 0000 (80H) Byte 2
0010 0000 (20H) Byte 3
Các lệnh 4 byte
Tác vụ opcode operand Mã nhị phân (mã máy)
Nạp vào thanh ghi chỉ số IX với
địa chỉ 16 bit là 2000H LD IX, 2000H 0010 0001 (21H) Byte2 1101 1101 (DDH) Byte1
0000 0000 (00H) Byte3
0010 0000 (20H) Byte4
Trang 2Tập lệnh Z80 có thể được chia làm 6 nhóm chính:
1 Các tác vụ nạp (Load) hoặc sao chép dữ liệu (chuyển dữ liệu)
2 Các tác vụ số học
3 Các tác vụ logic
4 Xử lý bit
5 Tác vụ rẽ nhánh chương trình
6 Các tác vụ điều khiển máy
Các tác vụ sao chép dữ liệu
– Từ thanh ghi này sang thanh ghi khác (Td: LD A, B)
(a) Byte dữ liệu cụ thể vào thanh ghi hay ô nhớ (Td: LD B, 32H) (b) Dữ liệu cụ thể 16 bit vào cặp thanh ghi (Td: LD HL, 2050H) – Từ ô nhớ vào thanh ghi hoặc ngược lại (Td: LD A, (2080H))
– Từ cổng nhập có địa chỉ 8 bit vào thanh ghi A (Td: IN A, (01H)) – Từ thanh ghi A ra cổng xuất có địa chỉ 8 bit (Td: OUT (07H), A) – Từ các thanh ghi Z80 vào các ô nhớ stack và ngược lại (Td: PUSH BC)
– Hoán đổi nội dung giữa những thanh ghi (Td: EX DE, HL)
Nhóm sao chép 8 bit (nạp 8 bit)
Dạng lệnh: LD op1, op2
Lệnh này thực hiện sao chép giá trị của toán hạng op2 vào toán hạng op1 Với op1 và op2 có thể là:
• r hay r’ chỉ thanh ghi 8 bit (như A, B, )
• n chỉ hằng số nguyên 1 byte (như 20H) (chỉ có với op2)
• ô nhớ có địa chỉ nn (như (2050H)) hoặc được chỉ bởi cặp thanh ghi (như (HL), (BC), (DE)) hoặc được chỉ bởi thanh ghi chỉ số (IX hoặc IY) với độ dời d
Thí dụ: LD A, B
LD B, (IX+19H) ; địa chỉ ô nhớ là trị của IX cộng với 19H
LD (1010H), A
Nhóm sao chép 16 bit (nạp 16 bit)
Dạng lệnh: LD op1, op2
Lệnh này thực hiện sao chép giá trị của toán hạng op2 vào toán hạng op1 Với op1 và op2 có thể là:
Trang 3• dd chỉ cặp thanh ghi 16 bit (như BC, DE, HL, SP)
• nn chỉ hằng số nguyên 2 byte (như 2030H) (chỉ có với op2)
• 2 ô nhớ 8 bit có địa chỉ đầu là nn (như (2050H))
• cặp thanh ghi chỉ số (như IX, IY)
Thí dụ: LD HL, 5000H
LD HL, (4545H) ; nếu ô nhớ ở 4545H chứa trị 37H và ô nhớ
ở 4546H chứa A1H thì HL sẽ chứa giá trị 16 bit là A137H
LD (4392H), HL ; nếu HL chứa A530H thì ô nhớ ở 4392H sẽ chứa trị 30H và ô nhớ ở 4393H sẽ chứa trị A5H
Các thí dụ lập trình:
Thí dụ 1: Xoá 1 phần bộ nhớ
Ta muốn xóa nội dung bộ nhớ từ địa chỉ BASE đến địa chỉ BASE +
LENGTH với LENGTH nhỏ hơn 256
Bài giải
ZEPROM: LD B, LENGTH ; Nạp vào B chiều dài LENGTH
LD A, 0 ; xóa 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ớ
RET
Chú ý:
• Sau khi thực thi lệnh DEC B thì cờ Z sẽ được đặt theo giá trị ở B (Z=1 nếu B là 0 và Z=0 nếu B khác 0)
• Lệnh JR NZ, CLEAR là lệnh nhảy tương đối (R=Relative=tương đối) đến nhãn chương trình CLEAR khi điều kiện NZ đúng
(NZ=Not Zero, nghĩa là khi Z=0)
• RET là lệnh return (quay về từ chương trình con)
Ta có thể viết lại đoạn chương trình trên gọn hơn:
ZEPROM: LD B, LENGTH ; Nạp vào B chiều dài LENGTH
LD HL, BASE ; chỉ đến BASE LOOP: LD (HL), 0 ; xóa ô nhớ có địa chỉ chứa trong HL
INC HL ; HL = HL + 1 để chỉ đến ô nhớ kế
Trang 4RET
Chú ý:
Ý nghĩa của lệnh DJNZ LOOP tương đương với nhóm lệnh DEC B rồi JR NZ, LOOP Nghĩa là trước hết cho B = B – 1, sau đó kiểm tra nếu B=0 (Z=1) thì thực thi lệnh kế, nếu B ≠ 0 (Z=0) thì nhảy đến nhãn LOOP
Thí dụ 2: Kiểm tra 1 ký tự
Ta sẽ kiểm tra xem ký tự ở ô nhớ LOC có bằng 0, 1, hoặc 2 không?
Bài giải
Đoạn chương trình sau sẽ thực hiện việc kiểm tra trị số ở ô nhớ LOC có bằng 0, 1, hoặc 2 hay không?
ZOT: LD A, (LOC) ; lấy nội dung ô nhớ LOC chép vào A
CP 0 ; so sánh A với 0?
JP Z, ZERO ; nếu A = 0 thì nhảy đến nhãn ZERO
CP 1 ; so sánh A với 1?
JP Z, ONE ; nếu A = 1 thì nhảy đến nhãn ZERO
CP 2 ; so sánh A với 1?
JP Z, TWO ; nếu A = 2 thì nhảy đến nhãn ZERO
JP NOTFND ; nếu khác 0, 1, 2 thì nhảy đến nhãn NOTFND Chú ý:
• Lệnh CP operand thực hiện so sánh toán hạng operand (có
thể là thanh ghi 1 byte khác như B, C, hoặc hằng số 1 byte) với thanh ghi A: nếu A = operand thì cờ Z=1, nếu A < operand thì cờ C=1
• Lệnh JP cond, true là lệnh nhảy (JP=Jump=nhảy) đến nhãn
true khi điều kiện cond đúng và thực hiện lệnh kế khi điều kiện
cond sai Với điều kiện có thể là NZ (Not Zero=khác không), Z (Zero=bằng không), NC (No Carry=không có nhớ), C (Carry=có nhớ), PO (Parity Odd=parity lẽ), PE (Parity Even = parity chẳn),
P (Positive hay Plus, khi cờ S=0: số dương), M (Minus, khi cờ S=1: số âm)
Thí dụ 3: 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
BRACK: 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
Trang 5CP 39H ; so sánh với ASCII của số 9
JR NC, EXIT ; nếu A > 39H thì thoát
EXIT: RET
Thí dụ: Tìm phần tử lớn nhất trong bảng
Địa chỉ bắt đầu của bảng được chứa ở địa chỉ BASE Phần tử đầu của bảng là số byte có trong bảng Chương trình sau sẽ tìm phần tử lớn nhất trong bảng (giả sử bảng chứa các số nguyên dương) Giá trị lớn nhất được cất vào A, và vị trí của nó được cất vào ô nhớ INDEX
Chương trình này sử dụng các thanh ghi A, F, B, H và L, và sẽ sử dụng định địa chỉ chỉ số để có thể tìm kiếm bảng ở bất cứ chỗ nào trong bộ nhớ
MAX: LD HL, BASE ; Địa chỉ bảng
LD B, (HL) ; số byte trong bảng
LD A, 0 ; xóa giá trị max INC HL ; khởi trị cho chỉ số là phần tử thứ nhất
LD (INDEX), HL ; phần tử kế LOOP: CP (HL) ; so sánh với phần tử kế
JR NC, NOSW ; nhảy nếu nhỏ hơn A
LD A, (HL) ; nạp giá trị max mới
LD (INDEX), HL ; nạp chỉ số mới NOSW: INC HL ; chỉ đến phần tử kế
JR NZ, LOOP ; lặp lại nếu chưa duyệt hết bảng RET
2.1 Viết chương trình kiểm tra bộ nhớ như sau: đầu tiên xóa 1 khối 256
byte (nghĩa là gán trị 00H), sau đó kiểm tra lại xem các ô nhớ đó có bằng không? Lần 2: Lặp lại công việc trên với các số 1 (nghĩa là gán trị FFH) Lần 3: Lặp lại công việc trên với các số 01010101 (nghĩa là gán trị 55H) Và cuối cùng lần 4 với các số 10101010 (nghĩa là gán trị AAH)
2.2 Viết lại chương trình 2.1 với trị kiểm tra lần lượt là byte 00H và FFH xen kẻ nhau
2.3 Đoạn chương trình sau có tương đương với đoạn chương trình trong thí dụ 3:
Trang 6SUB 30H
2.4 Viết chương trình con kiểm tra xem 1 ký tự ASCII ở ô nhớ LOC có phải là chữ trong dãi ký tự chữ từ A đến Z, nếu đúng thì cho cờ Z=1
2.5 Viết chương trình con kiểm tra xem 1 ký tự ASCII ở ô nhớ LOC có phải là chữ trong dãi ký tự chữ từ A đến Z hoặc từ a đến z, nếu đúng thì cho cờ Z=1
2.6 Sửa lại thí dụ tìm kiếm phần tử lớn nhất trong bảng để làm việc với cả các số âm dạng bù 2
2.7 Sửa lại thí dụ tìm kiếm phần tử lớn nhất trong bảng để thành chương trình tìm phần tử nhỏ nhất trong bảng
2.8 Viết chương trình sắp thứ tự các số trong bảng theo thứ tự tăng dần