Ký hiệu viết tắt trong tập lệnh Chương 3 Tập lệnh họ MSC-51 Hiệu đính từ bài giảng của Thầy Hồ Trung Mỹ Ký hiệu Rn hay Rr direct @Ri #data8 #data16 bit byte rel addr11 addr16 Ý nghĩa Định địa chỉ thanh ghi bằng các thanh ghi R0 đến R7 Địa chỉ nội 8 bits (00H - FFH) Định địa chỉ gián tiếp dùng thanh ghi R0 hoặc R1 Hằng số 8 bits ở ngay trong lệnh Hằng số 16 bits ở ngay trong lệnh Địa chỉ trực tiếp (8 bits) của bit Một trong các kiểu: direct, @Ri, Rn hoặc #data8 Offset 8 bits có dấu trong định địa chỉ tương đối Địa chỉ tuyệt đối 11 bits trong trang 2K hiện hành Địa chỉ 16 bits 2 Ký hiệu viết tắt trong tập lệnh Ký hiệu Ý nghĩa src Toán hạng nguồn (source) (có thể là Rn, direct hoặc @Ri) dest Toán hạng đích (destination) (có thể là Rn, direct hoặc @Ri) (X) Nội dung của X (vd: (A) nghĩa là nội dung thanh ghi A) ((X)) Nội dung ô nhớ có địa chỉ là nội dung của X DIR Cách định địa chỉ trực tiếp (direct) IN Cách định địa chỉ gián tiếp (indirect) REG Cách định địa chỉ thanh ghi (register) Các lệnh ảnh hưởng thanh ghi trạng thái PSW Instruction Flag Instruction Flag C OV AC C OV AC ADD X X X CLR C O ADDC X X X CPL C X SUBB X X X ANL C,bit X MUL O X ANL C,/bit X DIV O X ORL C,bit X DA X ORL C,/bit X RRC X MOV C,bit X RLC X CJNE X SETB C 1 Note that operations on SFR byte address 206 or bit addresses 209-215 (i.e. the PSW or bits IMM Cách định địa chỉ tức thời (immediate) 3 4
Mnemonic (từ gợi nhớ) Các lệnh số học Operation (tác vụ) 5 Addressing modes (cách định địa chỉ) DIR IND REG IMM Execution time (µs) (thời gian thực thi) ADD A, byte (A) = (A) + (byte) x x x x 1 ADDC A, byte (A) = (A) + (byte) +(C) x x x x 1 SUBB A, byte (A) = (A) - (byte) - (C) x x x x 1 INC A (A) = (A) + 1 Chỉ với ACC 1 INC byte (byte) = (byte) + 1 x x x 1 INC DPTR (DPTR) = (DPTR) + 1 Chỉ với DPTR 2 DEC A (A) = (A) - 1 Chỉ với ACC 1 DEC byte (byte) = (byte) - 1 x x x 1 MUL AB (B:A) = (B) x (A) Chỉ với ACC và B 4 DIV AB (A) = Int[(A)/(B)] (B) = Mod[(A)/(B)] Chỉ với ACC và B 4 DA A Điều chỉnh thập phân Chỉ với ACC 1 Lệnh cộng (ADD, ADDC) Ví dụ : add a, byte ; a a + byte addc a, byte ; a a + byte + C Các lệnh này ảnh hưởng đến 3 bits trong PSW: C = 1 nếu kết quả cộng > FF. AC = 1 nếu có nhớ tại bit 3. OV = 1 nếu có nhớ từ bit 7 mà không từ bit 6 hoặc ngược lại. 6 Lệnh cộng (ADD, ADDC) Ví dụ : hãy xác định giá trị của các cờ C, AC, OV sau khi thực hiện các lệnh sau. mov a, #3Fh add a, #D3h 0011 1111 1101 0011 0001 0010 C = 1 AC = 1 OV = 0 Cộng trừ có dấu và tràn Trường hợp không tràn: cộng một số âm và một số dương. trừ hai số cùng dấu. Trường hợp tràn: cộng hai số dương cho kết quả là số âm. cộng hai số âm cho kết quả là số dương. trừ một số âm từ một số dương và nhận kết quả là số âm. trừ một số dương từ một số âm và nhận kết quả là số dương. 7 8
Cộng trừ có dấu và tràn Số bù 2: 0000 0000 00 0 0111 1111 7F 127 1000 0000 80-128 1111 1111 FF -1 0111 1111 (+127) 0111 0011 (+115) 1111 0010 (+242 : tràn) 1000 1111 (-113) 1101 0011 (-45) 0110 0010 (tràn) 0011 1111 (dương) 1101 0011 (âm) 0001 0010 (không tràn) Lệnh cộng Tính Z = X + Y với Z, X, Y là số 1 byte trong RAM nội. Giả sử X được cất ở 78h, Y ở 79h và Z ở 7Ah. ;------------------------------------------------------------------ X equ 78h Y equ 79h Z equ 7Ah ;----------------------------------------------------------------- org 00h ljmp Main ;----------------------------------------------------------------- org 100h Main: mov a, X add a, Y mov Z, a end 9 10 Lệnh cộng Tính Z = X + Y với Z, X, Y là số 2 bytes (16 bits) trong RAM nội. Giả sử X được cất ở 78h, Y ở 7Ah và Z ở 7Ch. ;------------------------------------------------------------------ X equ 78h Y equ 7Ah Z equ 7Ch ;----------------------------------------------------------------- org 00h ljmp Main ;----------------------------------------------------------------- org 100h Main: mov a, X add a, Y mov Z, a mov a, X+1 adc addc a, a,y+1 mov Z+1, a end 11 Lệnh trừ (SUBB) SUBB A, byte : phép trừ có mượn. Ví dụ: SUBB A, #04Fh ; A A - 4F - C Chú ý: Không có phép trừ không mượn. Nếu muốn thực hiện phép trừ không mượn, cần phải xóa cờ C. Ví dụ: CLR C SUBB A, #04Fh ; A A - 4F 12
Lệnh tăng (INC) và giảm (DEC) INC A INC byte INC DPTR DEC A DEC byte increment A increment byte in memory increment data pointer decrement accumulator decrement byte Ghi chú: Lệnh tăng 1 và giảm 1 không ảnh hưởng đến cờ C. Đối với con trỏ dữ liệu DPTR, chỉ có lệnh tăng (INC), không có lệnh giảm (DEC). Lệnh nhân (MUL) MUL AB ; BA A * B Ví dụ: MOV A, #25H MOV B, #65H MUL AB Chú ý: B giữ giá trị byte cao A giữ giá trị byte thấp ; 25H * 65H = 0E99 ; B = 0EH, A = 99H 13 14 DIV AB Ví dụ: Lệnh chia (DIV) MOV A, #25 MOV B, #10 ; A = A/B, B = A mod B DIV AB ; A = 2, B = 5 Chú ý: Trường hợp chia cho 0 (thanh ghi B chứa 00H), giá trị trả về trong thanh ghi A và B không xác định. Cờ tràn (OV) được dùng để báo hiệu phép chia cho 0 (phép chia cho 0, OV được set lên bằng 1). Cờ nhớ C luôn được xóa về 0 trong mọi trường hợp. Hiệu chỉnh thập phân (DA) Lệnh hiệu chỉnh thập phân (Decimal Adjust) DA a được dùng để hiệu chỉnh giá trị 8-bit trong thanh ghi a. Được dùng để hiệu chỉnh kết quả phép cộng BCD. MOV a, #23h MOV b, #29h ADD a, b ; a 23h + 29h = 4Ch (giá trị đúng = 52) DA a ; a a + 6 = 52 15 16
Các lệnh logic Mnemonic Addressing modes (cách định địa chỉ) Execution time (µs) Operation (tác vụ) (từ gợi nhớ) DIR IND REG IMM (thời gian thực thi) ANL A, byte (A) = (A) AND (byte) x x x x 1 ANL byte, A (byte) = (byte) AND (A) x 1 ANL byte, #data8 (byte) = (byte) AND #data8 x 2 ORL A, byte (A) = (A) OR (byte) x x x x 1 ORL byte, A (byte) = (byte) OR (A) x 1 ORL byte, #data8 (byte) = (byte) OR #data8 x 2 XRL A, byte (A) = (A) XOR (byte) x x x x 1 XRL byte, A (byte) = (byte) XOR (A) x 1 XRL byte, #data8 (byte) = (byte) XOR #data8 x 2 CLR A (A) = 00H Chỉ với ACC 1 CPL A (A) = NOT(A) Chỉ với ACC 1 RL A Xoay ACC qua trái 1 bit Chỉ với ACC 1 RLC A Xoay trái qua cờ nhớ Chỉ với ACC 1 RR A Xoay ACC qua phải 1 bit Chỉ với ACC 1 RRC A Xoay phải qua cờ nhớ Chỉ với ACC 1 SWAP A Hoán đổi 2 nửa byte trong A Chỉ với ACC 1 17 anl PSW, #0xE7!! Các lệnh logic orl PSW, #0x18!! xrl P1, #0x40!!! 18 Các lệnh logic anl PSW, #0xE7!! ;PSW AND 11100111 orl PSW, #0x18!! xrl P1, #0x40!!! Các lệnh logic anl PSW, #0xE7!! ;PSW AND 11100111 orl PSW, #0x18!! ;PSW OR 00011000 xrl P1, #0x40!!! 19 20
Các lệnh logic anl PSW, #0xE7!! ;PSW AND 11100111 orl PSW, #0x18!! ;PSW OR 00011000 xrl P1, #0x40!!! ;P1 XRL 01000000 Các lệnh logic anl PSW, #0xE7!! ;PSW AND 11100111 orl PSW, #0x18!! ;PSW OR 00011000 xrl P1, #0x40!!! ;P1 XRL 01000000 Một số lệnh logic có thể được dùng với các toán hạng 1 bit. Ví dụ: ANL C, bit ORL C, bit CLR C CLR bit CPL C CPL bit SETB C SETB bit bit có thể là một vị trí được định địa chỉ trong RAM hoặc SFRs. 21 22 Các lệnh logic Hãy xác định nội dung của thanh ghi A sau khi thực hiện đoạn chương trình sau: MOV A, #3CH MOV R4, #66H ANL A, R4 A = 0011 1100 R4 = 0110 0110 A AND R4 = 0010 0100 = 24H Lệnh xoay (rotate) Các lệnh xoay chỉ được dùng với thanh ghi A. RL a Mov a,#0xf0 ; a% 11110000 RR a ; a% 11100001 RR a Mov a,#0xf0 ; a% 11110000 RR a ; a% 01111000 23 24
Lệnh xoay qua cờ nhớ RRC a mov a, #0A9h ; a % A9 add a, #14h ; a % BD (10111101), C%0 rrc a ; a % 01011110, C%1 RLC a C C Lệnh xoay và phép nhân/chia Quay trái 1 bit = nhân 2. Quay phải 1 bit = chia 2. mov a, #3 ; A% 00000011 (3) clr C ; C% 0 rlc a ; A% 00000110 (6) rlc a ; A% 00001100 (12) rrc a ; A% 00000110 (6) mov a, #3ch ; a % 3ch(00111100) setb c ; c % 1 rlc a ; a % 01111001, C%1 25 26 Lệnh xoay Hãy xác định giá trị của thanh ghi A sau khi thực hiện đoạn chương trình sau: CLR C MOV A, #0C3H RLC A C = 0 A = 1100 0011 Xoay trái thông qua cờ nhớ C A = 1000 0110, C = 1 Lệnh SWAP SWAP A : trao đổi nội dung hai nửa thấp và cao của thanh ghi A. mov a, #72h!! ; a 72h swap a!!!! ; a 27h 27 28
truy cập vùng nhớ dữ liệu nội: Mnemonic (từ gợi nhớ) Operation (tác vụ) 29 Addressing modes (cách định địa chỉ) Executio n time DIR IND REG IMM (µs) MOV A, (src) (A) = (src) x x x x 1 MOV dest, A (dest) = (A) x x x 1 MOV dest, src (dest) = (src) x x x x 2 MOV DPTR, #data16 (DPTR) = hằng số 16 bits x 2 PUSH direct POP direct INC SP MOV @SP, direct MOV direct, @SP DEC SP x 2 x 2 XCH A, byte Hoán đổi (A) và (byte) x x x 1 XCHD A, @Ri Hoán đổi 2 nửa byte thấp của (A) và ((Ri)) x 1 truy cập vùng nhớ dữ liệu ngoài: Address width (độ rộng địa chỉ) Các lệnh tra bảng: Mnemonic (từ gợi nhớ) 30 Operation (tác vụ) Execution time (µs) 8 bits MOVX A, @Ri Đọc RAM ngoài gián tiếp qua Ri 2 8 bits MOVX @Ri, A Ghi RAM ngoài gián tiếp qua Ri 2 16 bits MOVX A, @DPTR Đọc RAM ngoài qua DPTR 2 16 bits MOVX @DPTR, A Ghi RAM ngoài qua DPTR 2 Mnemonic (từ gợi nhớ) Operation (tác vụ) Execution time (µs) MOVC A, @A + DPTR Đọc bộ nhớ tại ((A) + (DPTR)) 2 MOVC A, @A+PC Đọc bộ nhớ tại ((A) + (PC)) 2 Xác định giá trị của thanh ghi A và B sau đoạn chương trình sau: Xác định giá trị của thanh ghi A và B sau đoạn chương trình sau: MOV 0F0H, #12H MOV R0, #0F0H MOV A, #34H XCH A, 0F0H XCHD A, @R0 MOV 0F0H, #12H MOV R0, #0F0H MOV A, #34H XCH A, 0F0H XCHD A, @R0 ; B=12H 31 32
Xác định giá trị của thanh ghi A và B sau đoạn chương trình sau: Xác định giá trị của thanh ghi A và B sau đoạn chương trình sau: MOV 0F0H, #12H ; B=12H MOV 0F0H, #12H ; B=12H MOV R0, #0F0H ; R0 = F0H MOV R0, #0F0H ; R0 = F0H MOV A, #34H MOV A, #34H ; A = 34H XCH A, 0F0H XCH A, 0F0H XCHD A, @R0 XCHD A, @R0 33 34 Xác định giá trị của thanh ghi A và B sau đoạn chương trình sau: Xác định giá trị của thanh ghi A và B sau đoạn chương trình sau: MOV 0F0H, #12H ; B=12H MOV 0F0H, #12H ; B=12H MOV R0, #0F0H ; R0 = F0H MOV R0, #0F0H ; R0 = F0H MOV A, #34H ; A = 34H MOV A, #34H ; A = 34H XCH A, 0F0H ; A = 12H, B = 34H XCH A, 0F0H ; A = 12H, B = 34H XCHD A, @R0 XCHD A, @R0 ; A = 14H, B = 32H a[7..4] a[3..0] R0[7..4] R0[3..0] Only 4 bits exchanged 35 36
Hãy viết đoạn chương trình chuyển nội dung chứa tại các địa chỉ 10F4H và 10F5H vào hai thanh ghi R6 và R7. MOV MOVX MOV INC MOVX MOV DPTR,#10F4H A,@DPTR R6,A DPTR A,@DPTR R7,A PUSH và POP Sau khi reset hệ thống thì SP=07H. Có 3 cách để truy cập: PUSH (cất vào ngăn xếp), POP (lấy ra khỏi ngăn xếp) và CALL (chuyển điều khiển chương trình và quay về [RET, RETI]). Để cất thông tin vào ngăn xếp, ta sử dụng lệnh PUSH. Khi đó các bước sau xảy ra: SP được tăng thêm 1. Thông tin được đặt vào địa chỉ được trỏ bởi SP. Để lấy thông tin ra khỏi ngăn xếp, ta sử dụng lệnh POP. Khi đó các bước sau xảy ra SP được giảm đi 1. Thông tin có địa chỉ được trỏ bởi SP được lấy ra. 37 38 PUSH và POP PUSH và POP MOV R6,#25h MOV R1,#12h MOV R4,#0F3h PUSH 6 PUSH 1 PUSH 4 POP 3 POP 5 POP 2 39 40
PUSH và POP Chú ý: Ngăn xếp trong 8051 tăng theo hướng địa chỉ tăng (08H, 09H,...) Ngăn xếp chiếm cùng vị trí với băng thanh ghi 1, do đó khi sử dụng ngăn xếp phải cẩn thận khi sử dụng băng thanh ghi 1 (không thể sử dụng được lúc này). Có thể giải quyết vấn đề này bằng cách ghi lại trị bắt đầu mới cho SP (các trị từ 30H đến 7FH). Ví dụ: mov sp, #0x40 ; khởi tạo SP push 0x55 ; SP SP+1, M[SP] M[55] ; M[41] M[55] pop b ; b M[55] Khi ngăn xếp tăng trưởng có khả năng lọt vào vùng có địa chỉ bit (từ byte có địa chỉ 30H). PUSH và POP Push a Push r0 Push r1 Push acc Push psw Push b Push 13h Push 0 Push 1 Pop 7 Pop 8 Push 0e0h Pop 0f0h ; không hợp lệ ; không hợp lệ ; không hợp lệ ; acc ; b 41 42 Hãy viết một đoạn chương trình liên tục lấy giá trị x từ P1 và đưa giá trị x 2 ra P2. Các lệnh rẽ nhánh không điều kiện ORG 0 MOV DPTR, #LUT ; 300H là địa chỉ đầu bảng MOV A, #0FFH MOV P1, A ; Lập trình cổng P1 để nhập dữ liệu Again: MOV A, P1 ; Đọc X MOVC A, @A+DPTR ; Lấy X 2 bằng tra bảng MOV P2, A ; Xuất X 2 ra P2 SJMP Again ; Lặp lại mãi mãi đoạn Again đến SJMP ORG 300H ; Bảng tra bắt đầu ở 0300H LUT: DB 0, 1, 4, 9, 16, 25, 36, 49, 64, 81 DB 100, 121, 144, 169, 196, 225 ; LUT=Look-Up Table=Bảng tra cứu 43 44
Các lệnh rẽ nhánh có điều kiện Mnemonic JZ <rel addr> Jump if a = 0 Description JNZ <rel addr> Jump if a!= 0 JC <rel addr> Jump if C = 1 JNC <rel addr> Jump if C!= 1 JB <bit>, <rel addr> Jump if bit = 1 JNB <bit>,<rel addr> Jump if bit!= 1 JBC <bir>, <rel addr> CJNE A, direct, <rel addr> Jump if bit =1, clear bit Compare A and memory, jump if not equal Các lệnh rẽ nhánh có điều kiện More Conditional Jumps Mnemonic CJNE A, #data <rel addr> CJNE Rn, #data <rel addr> CJNE @Rn, #data <rel addr> DJNZ Rn, <rel addr> DJNZ direct, <rel addr> Description Compare A and data, jump if not equal Compare Rn and data, jump if not equal Compare Rn and memory, jump if not equal Decrement Rn and then jump if not zero Decrement memory and then jump if not zero 45 46 Các lệnh rẽ nhánh có điều kiện if condition is true goto label else goto next instruction condition false true label if a = 0 is true send a 0 to LED else send a 1 to LED led_off: skipover: jz led_off setb C mov P1.6, C sjmp skipover clr C mov P1.6, C mov A, P0 47