12
Chương 3 Tp lnh hMSC-51 Hiu đính tbài ging ca Thy HTrung MGV: Trương Công Dung Nghi Ký hiu viết tt trong tp lnh 2 Ký hiu Ý nghĩa Rn hay Rr Định địa chthanh ghi bng các thanh ghi R0 đến R7 direct Địa chni 8 bits (00H - FFH) @Ri Định địa chgián tiếp dùng thanh ghi R0 hoc R1 #data8 Hng s8 bits ngay trong lnh #data16 Hng s16 bits ngay trong lnh bit Địa chtrc tiếp (8 bits) ca bit byte Mt trong các kiu: direct, @Ri, Rn hoc #data8 rel Offset 8 bits có du trong định địa chtương đối addr11 Địa chtuyt đối 11 bits trong trang 2K hin hành addr16 Địa ch16 bits GV: Trương Công Dung Nghi Ký hiu viết tt trong tp lnh 3 Ký hiu Ý nghĩa src Toán hng ngun (source) (có thlà Rn, direct hoc @Ri) dest Toán hng đích (destination) (có thlà Rn, direct hoc @Ri) (X) Ni dung ca X (vd: (A) nghĩa là ni dung thanh ghi A) ((X)) Ni dung ô nhđịa chlà ni dung ca X DIR Cách định địa chtrc tiếp (direct) IN Cách định địa chgián tiếp (indirect) REG Cách định địa chthanh ghi (register) IMM Cách định địa chtc thi (immediate) GV: Trương Công Dung Nghi Các lnh nh hưởng thanh ghi trng thái PSW 4 Flag Flag Instruction C OV AC Instruction 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

Ký hiệu Ý nghĩa Chương 3 p l nh họ MSC-51tcdungnghi/MPU_MCU/MCU_8051... · Hiệu đính từ bài giảng của Thầy Hồ Trung Mỹ ... MO V Rn , A Mo ve a ccu mu la

  • Upload
    others

  • View
    1

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Ký hiệu Ý nghĩa Chương 3 p l nh họ MSC-51tcdungnghi/MPU_MCU/MCU_8051... · Hiệu đính từ bài giảng của Thầy Hồ Trung Mỹ ... MO V Rn , A Mo ve a ccu mu la

Chương 3Tập lệnh họ MSC-51

Hiệu đính từ bài giảng của Thầy Hồ Trung MỹGV: Trương Công Dung Nghi

Ký hiệu viết tắt trong tập lệnh

2

Ký hiệu Ý nghĩa

Rn hay Rr Định địa chỉ thanh ghi bằng các thanh ghi R0 đến R7

direct Địa chỉ nội 8 bits (00H - FFH)

@Ri Định địa chỉ gián tiếp dùng thanh ghi R0 hoặc R1

#data8 Hằng số 8 bits ở ngay trong lệnh

#data16 Hằng số 16 bits ở ngay trong lệnh

bit Địa chỉ trực tiếp (8 bits) của bit

byte Một trong các kiểu: direct, @Ri, Rn hoặc #data8

rel Offset 8 bits có dấu trong định địa chỉ tương đối

addr11 Địa chỉ tuyệt đối 11 bits trong trang 2K hiện hành

addr16 Địa chỉ 16 bits

GV: Trương Công Dung Nghi

Ký hiệu viết tắt trong tập lệnh

3

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)

IMM Cách định địa chỉ tức thời (immediate)

GV: Trương Công Dung Nghi

Các lệnh ảnh hưởng thanh ghitrạng thái PSW

4

8051 Instruction Set Summary Rn Register R7-R0 of the currently selected Register Bank. Data 8-bit internal data location’s address. This could be an internal Data

RAM location (0-127) or a SFR [i.e. I/O port, control register, status register, etc. (128-255)].

@Ri 8-bit Internal Data RAM location (0-255) addressed indirectly through register R1 or R0.

#data 8-bit constant included in instruction. #data16 16-bit constant included in instruction. addr16 16-bit destination address. Used by LCALL and LJMP. A branch can be

anywhere within the 64k byte Program Memory address space. addr11 11-bit destination address. Used by ACALL and AJMP. The branch will

be within the same 2k byte page of Program Memory as the first byte of the following instruction.

rel Signed (two’s component) 8-bit offset byte. Used by SJMP and all conditional jumps. Range is –128 to +127 bytes relative to first byte of the following instruction.

bit Direct Addressed bit in Internal Data RAM or Special Function Register.

Flag FlagInstruction C OV AC

Instruction C OV AC

ADD X X X CLR C OADDC X X X CPL C XSUBB X X X ANL C,bit XMUL O X ANL C,/bit XDIV O X ORL C,bit XDA X ORL C,/bit XRRC X MOV C,bit XRLC X CJNE XSETB C 1 Note that operations on SFR byte address 206 or bit addresses 209-215 (i.e. the PSW or bits in the PSW) will also affect flag settings.

Mnemonic Description Byte Cycle

Arithmetic operations

ADD A,Rn Add register to accumulator 1 1 ADD A,direct Add direct byte to accumulator 2 1 ADD A,@Ri Add indirect RAM to accumulator 1 1 ADD A,#data Add immediate data to accumulator 2 1 ADDC A,Rn Add register to accumulator with carry flag 1 1 ADDC A,direct Add direct byte to A with carry flag 2 1 ADDC A,@Ri Add indirect RAM to A with carry flag 1 1 ADDC A,#data Add immediate data to A with carry flag 2 1 SUBB A,Rn Subtract register to accumulator with borrow 1 1 SUBB A,direct Subtract direct byte to A with carry borrow 2 1 SUBB A,@Ri Subtract indirect RAM to A with carry borrow 1 1 SUBB A,#data Subtract immediate data to A with carry borrow 2 1 INC A Increment accumulator 1 1INC Rn Increment register 1 1INC direct Increment direct byte 2 1INC @Ri Increment indirect RAM 1 1 DEC A Decrement accumulator 1 1DEC Rn Decrement register 1 1DEC direct Decrement direct byte 2 1DEC @Ri Decrement indirect RAM 1 1 INC DPTR Increment data pointer 1 2MUL AB Multiply A and B -> [B hi]:[A lo] 1 4 DIV AB Divide A by B -> A=result, B=remainder 1 4 DA A Decimal adjust accumulator 1 1CLR A Clear accumulator 1 1

Mnemonic Description Byte Cycle

CPL A Complement accumulator 1 1RL A Rotate accumulator left 1 1 RLC A Rotate accumulator left through carry 1 1 RR A Rotate accumulator right 1 1 RRC A Rotate accumulator right through carry 1 1 SWAP A Swap nibbles within the accumulator 1 1

Logic operations

ANL A,Rn AND register to accumulator 1 1 ANL A,direct AND direct byte to accumulator 2 1 ANL A,@Ri AND indirect RAM to accumulator 1 1 ANL A,#data AND immediate data to accumulator 2 1 ANL direct,A AND accumulator to direct byte 2 1 ANL direct,#data AND immediate data to direct byte 3 2 ORL A,Rn OR register to accumulator 1 1 ORL A,direct OR direct byte to accumulator 2 1 ORL A,@Ri OR indirect RAM to accumulator 1 1 ORL A,#data OR immediate data to accumulator 2 1 ORL direct,A OR accumulator to direct byte 2 1 ORL direct,#data OR immediate data to direct byte 3 2 XRL A,Rn Exclusive OR register to accumulator 1 1 XRL A,direct Exclusive OR direct byte to accumulator 2 1 XRL A,@Ri Exclusive OR indirect RAM to accumulator 1 1 XRL A,#data Exclusive OR immediate data to accumulator 2 1 XRL direct,A Exclusive OR accumulator to direct byte 2 1 XRL direct,#data Exclusive OR immediate data to direct byte 3 2

Boolean variable manipulation

CLR C Clear carry flag 1 1 CLR bit Clear direct bit 2 1 SETB C Set carry flag 1 1 SETB bit Set direct bit 2 1CPL C Complement carry flag 1 1 CPL bit Complement direct bit 2 1ANL C,bit AND direct bit to carry flag 2 2 ANL C,/bit AND complement of direct bit to carry 2 2 ORL C,bit OR direct bit to carry flag 2 2 ORL C,/bit OR complement of direct bit to carry 2 2 MOV C,bit Move direct bit to carry flag 2 1 MOV bit,C Move carry flag to direct bit 2 2

Program and machine control

ACALL addr11 Absolute subroutine call 2 2 LCALL addr16 Long subroutine call 3 2 RET Return from subroutine 1 2RETI Return from interrupt 1 2AJMP addr11 Absolute jump 2 2 LJMP addr16 Long jump 3 2SJMP rel Short jump (relative address) 2 2 JMP @A+DPTR Jump indirect relative to the DPTR 1 2 JZ rel Jump if accumulator is zero 2 2 JNZ rel Jump if accumulator is not zero 2 2 JC rel Jump if carry flag is set 2 2 JNC rel Jump if carry flag is not set 2 2 JB bit,rel Jump if bit is set 3 2 JNB bit,rel Jump if bit is not set 3 2 JBC bit,rel Jump if direct bit is set and clear bit 3 2 CJNE A,direct,rel Compare direct byte to A and jump if not equal 3 2

Mnemonic Description Byte Cycle

CJNE A,#data,rel Compare immediate to A and jump if not equal 3 2 CJNE Rn,#data,rel Compare immed. to reg. and jump if not equal 3 2 CJNE @Rn,#data,rel Compare immed. to ind. and jump if not equal 3 2 DJNZ Rn,rel Decrement register and jump in not zero 2 2 DJNZ direct,rel Decrement direct byte and jump in not zero 3 2 NOP No operation 1 1

Data transfer

MOV A,Rn Move register to accumulator 1 1 MOV A,direct*) Move direct byte to accumulator 2 1 MOV A,@Ri Move indirect RAM to accumulator 1 1 MOV A,#data Move immediate data to accumulator 2 1 MOV Rn,A Move accumulator to register 1 1 MOV Rn,direct Move direct byte to register 2 2 MOV Rn,#data Move immediate data to register 2 1 MOV direct,A Move accumulator to direct byte 2 1 MOV direct,Rn Move register to direct byte 2 2 MOV direct,direct Move direct byte to direct byte 3 2 MOV direct,@Ri Move indirect RAM to direct byte 2 2 MOV direct,#data Move immediate data to direct byte 3 2 MOV @Ri,A Move accumulator to indirect RAM 1 1 MOV @Ri,direct Move direct byte to indirect RAM 2 2 MOV @Ri,#data Move immediate data to indirect RAM 2 1 MOV DPTR,#data16 Load data pointer with a 16-bit constant 3 2 MOVC A,@A+DPTR Move code byte relative to DPTR to accumulator 1 2 MOVC A,@A+PC Move code byte relative to PC to accumulator 1 2 MOVX A,@Ri Move external RAM (8-bit addr.) to A 1 2 MOVX A,@DPTR Move external RAM (16-bit addr.) to A 1 2 MOVX @Ri,A Move A to external RAM (8-bit addr.) 1 2 MOVX @DPTR,A Move A to external RAM (16-bit addr.) 1 2 PUSH direct Push direct byte onto stack 2 2 POP direct Pop direct byte from stack 2 2 XCH A,Rn Exchange register to accumulator 1 1 XCH A,direct Exchange direct byte to accumulator 2 1 XCH A,@Ri Exchange indirect RAM to accumulator 1 1 XCHD A,@Ri Exchange low-order nibble indir. RAM with A 1 1 *) MOV A,ACC is not a valid instruction

jne A,#data,@ (jump if A ! = data)

cjne A,#data,@

je A, #data,@ (jump if A == data)

add A,#low(�data) or cjne A,#(data),ne jz @ jmp @ ne: ...

ja, jnbe A,#data,@ (jump if A > data)

add A,#low(�data�1) or cjne A,#(data+1),ne jc @ ne: jnc @

jae, jnb A,#data,@ (jump if A >= data)

add A,#low(�data) or cjne A,#(data),ne jc @ ne: jnc @

jb, jnae A,#data,@ (jump if A < data)

add A,#low,(�data) or cjne A,#(data),ne jnc @ ne: jc @

jbe, jna A,#data,@ (jump if A <= data)

add A,#low(�data�1) or cjne A,#(data+1),ne jnc @ ne: jc @

switch A <,==,> #data (no A modification)

cjne A,#data,ne ... ; execute code if A==data ne: jc is_below ; jump if A<data jnc is_above ; jump if A>data or exec. code

EEnnjjooyy IItt!! MMaatteess This paper was created by ŠtČpán MatČjka alias Mates for anybody who needs it. Mates, Prague – Czech Republic 1998,2002.

Page 2: Ký hiệu Ý nghĩa Chương 3 p l nh họ MSC-51tcdungnghi/MPU_MCU/MCU_8051... · Hiệu đính từ bài giảng của Thầy Hồ Trung Mỹ ... MO V Rn , A Mo ve a ccu mu la

GV: Trương Công Dung Nghi

Các lệnh số học

5

Mnemonic(từ gợi nhớ) Operation (tác vụ)

Addressing modes (cách định địa chỉ)

Addressing modes (cách định địa chỉ)

Addressing modes (cách định địa chỉ)

Addressing modes (cách định địa chỉ)

Execution time (µs) (thời gian

thực thi)

Mnemonic(từ gợi nhớ) Operation (tác vụ)

DIR IND REG IMM

Execution time (µs) (thời gian

thực thi)

ADD A, byte (A) = (A) + (byte) x x x x 1ADDC A, byte (A) = (A) + (byte) +(C) x x x x 1SUBB A, byte (A) = (A) - (byte) - (C) x x x x 1

INC A (A) = (A) + 1 Chỉ với ACCChỉ với ACCChỉ với ACCChỉ với ACC 1INC byte (byte) = (byte) + 1 x x x 1

INC DPTR (DPTR) = (DPTR) + 1 Chỉ với DPTRChỉ với DPTRChỉ với DPTRChỉ với DPTR 2DEC A (A) = (A) - 1 Chỉ với ACCChỉ với ACCChỉ với ACCChỉ với ACC 1

DEC byte (byte) = (byte) - 1 x x x 1MUL AB (B:A) = (B) x (A) Chỉ với ACC và BChỉ với ACC và BChỉ với ACC và BChỉ với ACC và B 4

DIV AB (A) = Int[(A)/(B)](B) = Mod[(A)/(B)] Chỉ với ACC và BChỉ với ACC và BChỉ với ACC và BChỉ với ACC và B 4

DA A Điều chỉnh thập phân Chỉ với ACCChỉ với ACCChỉ với ACCChỉ với ACC 1GV: Trương Công Dung Nghi

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.

6hsabaghianb @ kashanu.ac.ir Microprocessors 1-85

ADD Instructions add a, byte ; a % a + byte addc a, byte ; a % a + byte + C These instructions affect 3 bits in PSW: C = 1 if result of add is greater than FF AC = 1 if there is a carry out of bit 3 OV = 1 if there is a carry out of bit 7, but not from bit 6, or

visa versa.

GV: Trương Công Dung Nghi

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

7

hsabaghianb @ kashanu.ac.ir Microprocessors 1-87

ADD Examples

mov a, #3Fh add a, #D3h

! What is the value of the C, AC, OV flags after the second instruction is executed? 0011 1111

1101 0011 0001 0010 C = 1

AC = 1 OV = 0

hsabaghianb @ kashanu.ac.ir Microprocessors 1-87

ADD Examples

mov a, #3Fh add a, #D3h

! What is the value of the C, AC, OV flags after the second instruction is executed? 0011 1111

1101 0011 0001 0010 C = 1

AC = 1 OV = 0

GV: Trương Công Dung Nghi

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.

8

Page 3: Ký hiệu Ý nghĩa Chương 3 p l nh họ MSC-51tcdungnghi/MPU_MCU/MCU_8051... · Hiệu đính từ bài giảng của Thầy Hồ Trung Mỹ ... MO V Rn , A Mo ve a ccu mu la

GV: Trương Công Dung Nghi

Cộng trừ có dấu và tràn• Ví dụ:

Số bù 2:

9hsabaghianb @ kashanu.ac.ir Microprocessors 1-88

Signed Addition and Overflow 0111 1111 (positive 127) 0111 0011 (positive 115) 1111 0010 (overflow cannot represent 242 in 8 bits 2�s complement)

2�s complement: 0000 0000 00 0 … 0111 1111 7F 127 1000 0000 80 -128 … 1111 1111 FF -1

1000 1111 (negative 113) 1101 0011 (negative 45) 0110 0010 (overflow)

0011 1111 (positive) 1101 0011 (negative) 0001 0010 (never overflows)

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)

GV: Trương Công Dung Nghi

Lệnh cộng• Ví dụ: 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.

10

hsabaghianb @ kashanu.ac.ir Microprocessors 1-89

Addition Example ; Computes Z = X + Y ; Adds values at locations 78h and 79h and puts them in 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

GV: Trương Công Dung Nghi

Lệnh cộng• Ví dụ: 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.

11

hsabaghianb @ kashanu.ac.ir Microprocessors 1-90

The 16-bit ADD example ; Computes Z = X + Y (X,Y,Z are 16 bit) ;------------------------------------------------------------------ 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 a, Y+1 mov Z+1, a end

addc a,Y+1

GV: Trương Công Dung Nghi

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

Page 4: Ký hiệu Ý nghĩa Chương 3 p l nh họ MSC-51tcdungnghi/MPU_MCU/MCU_8051... · Hiệu đính từ bài giảng của Thầy Hồ Trung Mỹ ... MO V Rn , A Mo ve a ccu mu la

GV: Trương Công Dung Nghi

Lệnh tăng (INC) và giảm (DEC)

• 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).

13

Increment and DecrementINC A increment AINC byte increment byte in memoryINC DPTR increment data pointerDEC A decrement accumulatorDEC byte decrement byte

• The increment and decrement instructions do NOTaffect the C flag.

• Notice we can only INCREMENT the data pointer, not decrement.

18

GV: Trương Công Dung Nghi

Lệnh nhân (MUL)• MUL AB ; BA ← A * B

Ví dụ: MOV A, #25H MOV B, #65H MUL AB ; 25H * 65H = 0E99 ; B = 0EH, A = 99H

• Chú ý:‣ B giữ giá trị byte cao‣ A giữ giá trị byte thấp

14

GV: Trương Công Dung Nghi

Lệnh chia (DIV)• DIV AB ; A = A/B, B = A mod B

Ví dụ: MOV A, #25 MOV B, #10 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.

15 GV: Trương Công Dung Nghi

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.• Ví dụ:

MOV a, #23h MOV b, #29h ADD a, b ; a ← 23h + 29h = 4Ch (giá trị đúng = 52) DA a ; a ← a + 6 = 52

16

Page 5: Ký hiệu Ý nghĩa Chương 3 p l nh họ MSC-51tcdungnghi/MPU_MCU/MCU_8051... · Hiệu đính từ bài giảng của Thầy Hồ Trung Mỹ ... MO V Rn , A Mo ve a ccu mu la

GV: Trương Công Dung Nghi

Các lệnh logic

17

Mnemonic(từ gợi nhớ) Operation (tác vụ)

Addressing modes (cách định địa chỉ)Addressing modes (cách định địa chỉ)Addressing modes (cách định địa chỉ)Addressing modes (cách định địa chỉ) Execution time (µs) (thời gian thực thi)

Mnemonic(từ gợi nhớ) Operation (tác vụ)

DIR IND REG IMMExecution time (µs) (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 ACCChỉ với ACCChỉ với ACCChỉ với ACC 1

CPL A (A) = NOT(A) Chỉ với ACCChỉ với ACCChỉ với ACCChỉ với ACC 1

RL A Xoay ACC qua trái 1 bit Chỉ với ACCChỉ với ACCChỉ với ACCChỉ với ACC 1

RLC A Xoay trái qua cờ nhớ Chỉ với ACCChỉ với ACCChỉ với ACCChỉ với ACC 1

RR A Xoay ACC qua phải 1 bit Chỉ với ACCChỉ với ACCChỉ với ACCChỉ với ACC 1

RRC A Xoay phải qua cờ nhớ Chỉ với ACCChỉ với ACCChỉ với ACCChỉ với ACC 1

SWAP A Hoán đổi 2 nửa byte trong A Chỉ với ACCChỉ với ACCChỉ với ACCChỉ với ACC 1GV: Trương Công Dung Nghi

Các lệnh logic• Ví dụ:

anl PSW, #0xE7 ! ! orl PSW, #0x18 ! ! xrl P1, #0x40 ! ! !

18

GV: Trương Công Dung Nghi

Các lệnh logic• Ví dụ:

anl PSW, #0xE7 ! ! ;PSW AND 11100111

orl PSW, #0x18 ! ! xrl P1, #0x40 ! ! !

19 GV: Trương Công Dung Nghi

Các lệnh logic• Ví dụ:

anl PSW, #0xE7 ! ! ;PSW AND 11100111

orl PSW, #0x18 ! ! ;PSW OR 00011000

xrl P1, #0x40 ! ! !

20

Page 6: Ký hiệu Ý nghĩa Chương 3 p l nh họ MSC-51tcdungnghi/MPU_MCU/MCU_8051... · Hiệu đính từ bài giảng của Thầy Hồ Trung Mỹ ... MO V Rn , A Mo ve a ccu mu la

GV: Trương Công Dung Nghi

Các lệnh logic• Ví dụ:

anl PSW, #0xE7 ! ! ;PSW AND 11100111

orl PSW, #0x18 ! ! ;PSW OR 00011000

xrl P1, #0x40 ! ! ! ;P1 XRL 01000000

21 GV: Trương Công Dung Nghi

Các lệnh logic• Ví dụ:

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.

22

GV: Trương Công Dung Nghi

Các lệnh logic• Ví dụ: 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

23

A = 0011 1100R4 = 0110 0110A AND R4 = 0010 0100 = 24H

GV: Trương Công Dung Nghi

Lệnh xoay (rotate)• Các lệnh xoay chỉ được dùng với thanh ghi A.• Ví dụ:

24hsabaghianb @ kashanu.ac.ir Microprocessors 1-103

Rotate ! Rotate instructions operate only on a

RL a

Mov a,#0xF0 ; a% 11110000 RR a ; a% 11100001

RR a

Mov a,#0xF0 ; a% 11110000 RR a ; a% 01111000

Page 7: Ký hiệu Ý nghĩa Chương 3 p l nh họ MSC-51tcdungnghi/MPU_MCU/MCU_8051... · Hiệu đính từ bài giảng của Thầy Hồ Trung Mỹ ... MO V Rn , A Mo ve a ccu mu la

GV: Trương Công Dung Nghi

Lệnh xoay qua cờ nhớ

25

hsabaghianb @ kashanu.ac.ir Microprocessors 1-104

Rotate through Carry

RRC a mov a, #0A9h ; a % A9 add a, #14h ; a % BD (10111101), C%0 rrc a ; a % 01011110, C%1 RLC a mov a, #3ch ; a % 3ch(00111100) setb c ; c % 1 rlc a ; a % 01111001, C%1

C

C

GV: Trương Công Dung Nghi

Lệnh xoay và phép nhân/chia• Quay trái 1 bit = nhân 2.• Quay phải 1 bit = chia 2.

26

hsabaghianb @ kashanu.ac.ir Microprocessors 1-105

Rotate and Multiplication/Division

! Note that a shift left is the same as multiplying by 2, shift right is divide by 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)

GV: Trương Công Dung Nghi

Lệnh xoay• Ví dụ: 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

27

C = 0A = 1100 0011Xoay trái thông qua cờ nhớ CA = 1000 0110, C = 1

GV: Trương Công Dung Nghi

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

28

hsabaghianb @ kashanu.ac.ir Microprocessors 1-106

Swap

SWAP a mov a, #72h ; a % 27h swap a ; a % 27h

Page 8: Ký hiệu Ý nghĩa Chương 3 p l nh họ MSC-51tcdungnghi/MPU_MCU/MCU_8051... · Hiệu đính từ bài giảng của Thầy Hồ Trung Mỹ ... MO V Rn , A Mo ve a ccu mu la

GV: Trương Công Dung Nghi

Các lệnh chuyển dữ liệu• Các lệnh chuyển dữ liệu truy cập vùng nhớ dữ liệu nội:

29

Mnemonic(từ gợi nhớ) Operation (tác vụ)

Addressing modes (cách định địa chỉ)

Addressing modes (cách định địa chỉ)

Addressing modes (cách định địa chỉ)

Addressing modes (cách định địa chỉ) Executio

n time (µs)

Mnemonic(từ gợi nhớ) Operation (tác vụ)

DIR IND REG IMM

Execution time (µs)

MOV A, (src) (A) = (src) x x x x 1

MOV dest, A (dest) = (A) x x x 1MOV dest, src (dest) = (src) x x x x 2

MOV DPTR, #data16 (DPTR) = hằng số 16 bits x 2

PUSH direct INC SPMOV “@SP”, direct x 2

POP direct MOV direct, “@SP”DEC SP 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

GV: Trương Công Dung Nghi

Các lệnh chuyển dữ liệu• Các lệnh chuyển dữ liệu truy cập vùng nhớ dữ liệu ngoài:

• Các lệnh tra bảng:

30

Address width(độ rộng địa chỉ)

Mnemonic(từ gợi nhớ) 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

GV: Trương Công Dung Nghi

Các lệnh chuyển dữ liệu• Ví dụ: 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

31 GV: Trương Công Dung Nghi

Các lệnh chuyển dữ liệu• Ví dụ: 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 R0, #0F0H MOV A, #34H XCH A, 0F0H XCHD A, @R0

32

Page 9: Ký hiệu Ý nghĩa Chương 3 p l nh họ MSC-51tcdungnghi/MPU_MCU/MCU_8051... · Hiệu đính từ bài giảng của Thầy Hồ Trung Mỹ ... MO V Rn , A Mo ve a ccu mu la

GV: Trương Công Dung Nghi

Các lệnh chuyển dữ liệu• Ví dụ: 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 R0, #0F0H ; R0 = F0H MOV A, #34H XCH A, 0F0H XCHD A, @R0

33 GV: Trương Công Dung Nghi

Các lệnh chuyển dữ liệu• Ví dụ: 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 R0, #0F0H ; R0 = F0H MOV A, #34H ; A = 34H XCH A, 0F0H XCHD A, @R0

34

GV: Trương Công Dung Nghi

Các lệnh chuyển dữ liệu• Ví dụ: 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 R0, #0F0H ; R0 = F0H MOV A, #34H ; A = 34H XCH A, 0F0H ; A = 12H, B = 34H XCHD A, @R0

35 GV: Trương Công Dung Nghi

Các lệnh chuyển dữ liệu• Ví dụ: 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 R0, #0F0H ; R0 = F0H MOV A, #34H ; A = 34H XCH A, 0F0H ; A = 12H, B = 34H XCHD A, @R0 ; A = 14H, B = 32H

36

hsabaghianb @ kashanu.ac.ir Microprocessors 1-79

Exchange Instructions

two way data transfer XCH a, 30h ; a %& M[30] XCH a, R0 ; a %& R0 XCH a, @R0 ; a %& M[R0] XCHD a, R0 ; exchange “digit”

R0[7..4] R0[3..0] a[7..4] a[3..0]

Only 4 bits exchanged

Page 10: Ký hiệu Ý nghĩa Chương 3 p l nh họ MSC-51tcdungnghi/MPU_MCU/MCU_8051... · Hiệu đính từ bài giảng của Thầy Hồ Trung Mỹ ... MO V Rn , A Mo ve a ccu mu la

GV: Trương Công Dung Nghi

Các lệnh chuyển dữ liệu• Ví dụ: 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.

37

MOV DPTR,#10F4HMOVX A,@DPTRMOV R6,AINC DPTRMOVX A,@DPTR MOV R7,A

GV: Trương Công Dung Nghi

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.

38

GV: Trương Công Dung Nghi

PUSH và POP• Ví dụ:

39

MOV R6,#25h MOV R1,#12h MOV R4,#0F3h PUSH 6PUSH 1PUSH 4POP 3POP 5POP 2

Ảnh hưởng của các lệnh PUSH với ngăn xếp

44

Ảnh hưởng của các lệnh PUSH với ngăn xếp

44

GV: Trương Công Dung Nghi

PUSH và POP

40

Ảnh hưởng của các lệnh POP với ngăn xếp

45

Page 11: Ký hiệu Ý nghĩa Chương 3 p l nh họ MSC-51tcdungnghi/MPU_MCU/MCU_8051... · Hiệu đính từ bài giảng của Thầy Hồ Trung Mỹ ... MO V Rn , A Mo ve a ccu mu la

GV: Trương Công Dung Nghi

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).

41 GV: Trương Công Dung Nghi

PUSH và POP

42

Push a ; không hợp lệPush r0 ; không hợp lệPush r1 ; không hợp lệPush acc Push psw Push bPush 13hPush 0Push 1Pop 7Pop 8Push 0e0h ; accPop 0f0h ; b

GV: Trương Công Dung Nghi

Các lệnh chuyển dữ liệu• Ví dụ: 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ị x2 ra P2.

43

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ệuAgain: MOV A, P1 ; Đọc X MOVC A, @A+DPTR ; Lấy X2 bằng tra bảng MOV P2, A ; Xuất X2 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 ở 0300HLUT: 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

GV: Trương Công Dung Nghi

Các lệnh rẽ nhánh không điều kiện

44

Page 12: Ký hiệu Ý nghĩa Chương 3 p l nh họ MSC-51tcdungnghi/MPU_MCU/MCU_8051... · Hiệu đính từ bài giảng của Thầy Hồ Trung Mỹ ... MO V Rn , A Mo ve a ccu mu la

GV: Trương Công Dung Nghi

Các lệnh rẽ nhánh có điều kiện

45

Conditional jumpsMnemonic Description

JZ <rel addr> Jump if a = 0JNZ <rel addr> Jump if a != 0JC <rel addr> Jump if C = 1JNC <rel addr> Jump if C != 1JNC <rel addr> Jump if C != 1JB <bit>, <rel addr> Jump if bit = 1JNB <bit>,<rel addr> Jump if bit != 1JBC <bir>, <rel addr> Jump if bit =1, clear bitCJNE A, direct, <rel addr> Compare A and memory,

jump if not equal

61GV: Trương Công Dung Nghi

Các lệnh rẽ nhánh có điều kiện

46

More Conditional JumpsMnemonic Description

CJNE A, #data <rel addr> Compare A and data, jump if not equal

CJNE Rn, #data <rel addr> Compare Rn and data, jump if not equal

CJNE @Rn, #data <rel addr> Compare Rn and memory, CJNE @Rn, #data <rel addr> Compare Rn and memory, jump if not equal

DJNZ Rn, <rel addr> Decrement Rn and then jump if not zero

DJNZ direct, <rel addr> Decrement memory and then jump if not zero

64

GV: Trương Công Dung Nghi

Các lệnh rẽ nhánh có điều kiện

47

Conditional Jumps for Branchingif condition is true

goto label

elsegoto next instruction

condition

true

false

label

jz led_offsetb Cmov P1.6, Csjmp skipoverclr Cmov P1.6, Cmov A, P0

led_off:

skipover:

if a = 0 is truesend a 0 to LED

elsesend a 1 to LED

62