Bài giảng Vi xử lý - Z80 Tập lệnh - Hồ Trung Mỹ
TD: 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
; Thu lenh ADD voi toan hang 16 bit dung cap thanh ghi HL, DE
LD DE,BIN16_1
LD HL,BIN16_2
ADD HL,DE ; HL <- HL + DE = 1289 + 2578 = 3867 = 0F1BH
; Thu lenh SBC voi toan hang 16 bit dung cap 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
ó 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! 3/26/2011 21 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 bang cach dich DE ; sang trai n bit (dat trong C) SHIFT_N: SRL C RET C SLA E ; Dich 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 3/26/2011 22 4. Nhóm rẽ nhánh chương trình Tác vụ Dạng lệnh Ý nghĩa Nhảy tuyệt đối không điều điện JP target PC target Nhảy tuyệt đối có điều điện JP cc, nn Nếu cc đúng thì PC nn ngược lại thì PC địa chỉ lệnh kế 4.1. 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, C, 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 Điều kiện Ý nghĩa Z Đúng khi Z=1 (Zero) NZ Đúng khi Z=0 (Non Zero) C Đúng khi C=1 (Carry) NC Đúng khi C=0 (No Carry) P Đúng khi S=0 (Positive=dương) M Đúng khi S=1 (Minus = âm) PE Đúng khi PV=1 (Parity Even = parity chẵn hay có tràn) PO Đúng khi PV=0 (Parity Odd= parity lẻ hay không có tràn) 3/26/2011 23 4.2. Các lệnh nhảy tương đối Tác vụ Dạng lệnh Ý nghĩa Nhảy tương đối không điều điện JR target_N PC PC + offset Nhảy tương đối có điều điện JR cond, target_N Nếu cond đúng thì PC nn ngược lại thì PC địa chỉ lệnh kế Nhảy tương đối có điều điện với B DJNZ target_N B B – 1 Nếu B 0 thì PC offset ngược lại thì PC địa chỉ lệnh kế 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 TD: 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ế DECB ; 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? 3/26/2011 24 Phân tích mã máy của lệnh JR Địa chỉ Mã máy Dòng Hợp ngữ 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) TD: 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 3/26/2011 25 4.3. Các lệnh liên quan chương trình con Tác vụ Dạng lệnh Ý nghĩa Gọi chương trình con CALL nn CALL cc, nn SP SP – 1, (SP) PC_H SP SP – 1, (SP) PC_L PC nn Quay về từ chương trình con RET RET cc PC_L (SP) , SP SP + 1 PC_H (SP) , SP SP + 1 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ế TD: Đ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 3/26/2011 26 TD: 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 3/26/2011 27 5. Nhóm điều khiển CPU Tác vụ Dạng lệnh Ý nghĩa Không làm gì NOP CPU không làm gì cả. Lệnh này thường dùng để làm trễ bằng phần mềm. Dừng CPU HALT Đưa CPU vào trạng thái chờ và khi đó nó không làm gì cả. Trạng thái này sẽ bị phá vỡ khi có ngắt (INT, NMI) hoặc reset Chú ý: Ở đây ta không khảo sát các lệnh liên quan về ngắt. 3/26/2011 28 6. Nhóm truy cập cổng xuất/nhập Tác vụ Dạng lệnh Ý nghĩa Đọc cổng nhập với địa chỉ trực tiếp IN A, (n) A (n) Đọc cổng nhập với địa chỉ ở thanh ghi C IN r, (C) r (C) Ghi ra cổng xuất với địa chỉ trực tiếp OUT (n), A (n) A Ghi ra cổng xuất với địa chỉ ở thanh ghi C OUT (C), r (C) r 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 3/26/2011 29 TD: 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 ; Dung RRC C se chay sang phai! CALL DELAY JR LOOP ; Chuong trinh con DELAY lam tre DELAY: LD B,0 ; vong lap voi B la 256 lan! L1: LD D,0 ; vong lap voi D la 256 lan! L2: DEC D JR NZ,L2 DJNZ L1 RET Chú ý: Trong thí dụ này, cổng 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 TD: Đ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 cổng 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 ; Chuong trinh con DELAY lam tre DELAY: LD B,0 ; vong lap voi B la 256 lan! L1: LD D,0 ; vong lap voi D la 256 lan! 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 3/26/2011 30 TD: 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 3/26/2011 31 3/26/2011 32 7. Nhóm xử lý bit Phép toán Dạng lệnh Ý nghĩa Lấy đảo 1 bit trong toán hạng 8 bit BIT b, m Z NOT(mb) Z = phủ định của bit thứ b trong m Xóa 1 bit trong toán hạng 8 bit về 0 RES b, m mb 0 Bit thứ b trong m bị xóa (RESet) Đặt 1 bit trong toán hạng 8 bit lên 1 SET b, m mb 1 Bit thứ b trong m được gán 1 (SET) 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) TD: 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 3/26/2011 33 3/26/2011 34 8. Nhóm hoán đổi, chuyển khối và tìm kiếm OP Code Hex Mnemonic Tác vụ Mô tả D9 EXX BC B'C' DE D'E' HL H'L' Hoán đổi các cặp thanh ghi ED B8 LDDR (DE) (HL) DE DE - 1 HL HL - 1 BC BC - 1 Nạp ô nhớ ở (DE) với ô nhớ ở (HL), giảm DE, HL, và BC đi 1, lặp lại cho tới khi BC = 0 ED A1 CPI A - (HL) HL HL + 1 BC BC - 1 So sánh ô nhớ (HL) với A, tăng HL thêm 1, giảm BC đi 1, đặt các cờ, A giữ nguyên 3/26/2011 35 3/26/2011 36 Tóm tắt tập lệnh Z80 với các cờ
File đính kèm:
- bai_giang_vi_xu_ly_z80_tap_lenh_ho_trung_my.pdf