Download Chapter 2: instruction set

Survey
yes no Was this document useful for you?
   Thank you for your participation!

* Your assessment is very important for improving the workof artificial intelligence, which forms the content of this project

Document related concepts
no text concepts found
Transcript
Microcontroller Intel 8051
[Instruction Set]
Structure of Assembly Language
[ label: ]
mnemonic [operands] [ ;comment ]
Example:
MOV
R1, #25H ; load data 25H into R1
2
8051 Assembly Language
• Registers
MOV Instruction:
MOV
destination, source
Example:
1. MOV A, $55H
2. MOV R0, A
3. MOV A, R3
3
Instruction Groups
• The 8051 has 255 instructions
– Every 8-bit opcode from 00 to FF is used except for
A5.
• The instructions are grouped into 5 groups
– Arithmetic
– Logic
– Data Transfer
– Boolean
– Branching
Arithmetic Instructions
• ADD
– 8-bit addition between the accumulator (A) and a
second operand.
• The result is always in the accumulator.
• The CY flag is set/reset appropriately.
• ADDC
– 8-bit addition between the accumulator, a second
operand and the previous value of the CY flag.
• Useful for 16-bit addition in two steps.
• The CY flag is set/reset appropriately.
Arithmetic Instructions
•
DA
– Decimal adjust the accumulator.
• Format the accumulator into a proper 2 digit packed BCD number.
• Operates only on the accumulator.
• Works only after the ADD instruction.
•
SUBB
– Subtract with Borrow.
• Subtract an operand and the previous value of the borrow (carry)
flag from the accumulator.
– A  A - <operand> - CY.
– The result is always saved in the accumulator.
– The CY flag is set/reset appropriately.
Arithmetic Instructions
• INC
– Increment the operand by one.
• The operand can be a register, a direct address, an indirect
address, the data pointer.
• DEC
– Decrement the operand by one.
• The operand can be a register, a direct address, an indirect
address.
• MUL AB / DIV AB
– Multiply A by B and place result in A:B.
– Divide A by B and place result in A:B.
Logical Operations
• ANL / ORL
– Work on byte sized operands or the CY flag.
• ANL A, Rn
• ANL A, direct
• ANL A, @Ri
• ANL A, #data
• ANL direct, A
• ANL direct, #data
• ANL C, bit
• ANL C, /bit
Logical Operations
• XRL
– Works on bytes only.
• CPL / CLR
– Complement / Clear.
– Work on the accumulator or a bit.
• CLR P1.2
Logical Operations
• RL / RLC / RR / RRC
– Rotate the accumulator.
• RL and RR without the carry
• RLC and RRC rotate through the carry.
• SWAP A
– Swap the upper and lower nibbles of the accumulator.
• No compare instruction.
– Built into conditional branching instructions.
Data Transfer Instructions
• MOV
– 8-bit data transfer for internal RAM and the SFR.
• MOV A, Rn
MOV A, direct
• MOV A, @Ri
MOV A, #data
• MOV Rn, A
MOV Rn, direct
• MOV Rn, #data
MOV direct, A
• MOV direct, Rn
MOV direct, direct
• MOV direct, @Ri
MOV direct, #data
• MOV @Ri, A
MOV @Ri, direct
• MOV @Ri, #data
Data Transfer Operations
• MOV
– 1-bit data transfer involving the CY flag
• MOV C, bit
• MOV bit, C
• MOV
– 16-bit data transfer involving the DPTR
• MOV DPTR, #data
Data Transfer Instructions
• MOVC
– Move Code Byte
• Load the accumulator with a byte from program
memory.
• Must use indexed addressing
 MOVC
 MOVC
A, @A+DPTR
A, @A+PC
Data Transfer Instructions
• MOVX
– Data transfer between the accumulator and a
byte from external data memory.
•
•
•
•
MOVX
MOVX
MOVX
MOVX
A, @Ri
A, @DPTR
@Ri, A
@DPTR, A
Data Transfer Instructions
• PUSH / POP
– Push and Pop a data byte onto the stack.
– The data byte is identified by a direct address
from the internal RAM locations.
• PUSH
• POP
DPL
40H
Data Transfer Instructions
• XCH
– Exchange accumulator and a byte variable
• XCH A, Rn
• XCH A, direct
• XCH A, @Ri
• XCHD
– Exchange lower digit of accumulator with the lower digit of the
memory location specified.
• XCHD A, @Ri
• The lower 4-bits of the accumulator are exchanged with the
lower 4-bits of the internal memory location identified
indirectly by the index register.
• The upper 4-bits of each are not modified.
Boolean Operations
• This group of instructions is associated with the single-bit
operations of the 8051.
• This group allows manipulating the individual bits of bit
addressable registers and memory locations as well as
the CY flag.
– The P, OV, and AC flags cannot be directly altered.
• This group includes:
– Set, clear, and, or complement, move.
– Conditional jumps.
Boolean Operations
• CLR
– Clear a bit or the CY flag.
• CLR P1.1
• CLR C
• SETB
– Set a bit or the CY flag.
• SETB A.2
• SETB C
• CPL
– Complement a bit or the CY flag.
• CPL 40H
; Complement bit 40 of the bit
addressable memory
Boolean Operations
• ORL / ANL
– OR / AND a bit with the CY flag.
• ORL C, 20H
; OR bit 20 of bit addressable
; memory with the CY flag
• ANL C, /34H ; AND complement of bit 34 of bit
addressable memory with the CY
flag.
• MOV
– Data transfer between a bit and the CY flag.
• MOV C, 3FH
; Copy the CY flag to bit 3F of the
bit addressable memory.
• MOV P1.2, C ; Copy the CY flag to bit 2 of P1.
Boolean Operations
• JC / JNC
– Jump to a relative address if CY is set / cleared.
• JB / JNB
– Jump to a relative address if a bit is set / cleared.
• JB ACC.2, <label>
• JBC
– Jump to a relative address if a bit is set and clear the bit.
Branching Instructions
• The 8051 provides four different types of
unconditional jump instructions:
– Short Jump – SJMP
• Uses an 8-bit signed offset relative to the 1st byte of the next
instruction.
– Long Jump – LJMP
• Uses a 16-bit address.
• 3 byte instruction capable of referencing any location in the
entire 64K of program memory.
Branching Instructions
– Absolute Jump – AJMP
• Uses an 11-bit address.
• 2 byte instruction
 The upper 3-bits of the address combine with the 5-bit
opcode to form the 1st byte and the lower 8-bits of the
address form the 2nd byte.
• The 11-bit address is substituted for the lower 11-bits of the
PC to calculate the 16-bit address of the target.
 The location referenced must be within the 2K Byte
memory page containing the AJMP instruction.
– Indirect Jump – JMP
• JMP @A + DPTR
Branching Instructions
• The 8051 provides 2 forms for the CALL instruction:
– Absolute Call – ACALL
• Uses an 11-bit address similar to AJMP
• The subroutine must be within the same 2K page.
– Long Call – LCALL
• Uses a 16-bit address similar to LJMP
• The subroutine can be anywhere.
– Both forms push the 16-bit address of the next instruction
on the stack and update the stack pointer.
Branching Instructions
• The 8051 provides 2 forms for the return instruction:
– Return from subroutine – RET
• Pop the return address from the stack and continue
execution there.
– Return from ISV – RETI
• Pop the return address from the stack.
• Restore the interrupt logic to accept additional
interrupts at the same priority level as the one just
processed.
• Continue execution at the address retrieved from the
stack.
• The PSW is not automatically restored.
Branching Instructions
• The 8051 supports 5 different conditional jump instructions.
– ALL conditional jump instructions use an 8-bit signed
offset.
– Jump on Zero – JZ / JNZ
• Jump if the A == 0 / A != 0
– The check is done at the time of the instruction
execution.
– Jump on Carry – JC / JNC
• Jump if the C flag is set / cleared.
Branching Instructions
– Jump on Bit – JB / JNB
• Jump if the specified bit is set / cleared.
• Any addressable bit can be specified.
– Jump if the Bit is set then Clear the bit – JBC
• Jump if the specified bit is set.
• Then clear the bit.
Branching Instructions
• Compare and Jump if Not Equal – CJNE
– Compare the magnitude of the two operands and
jump if they are not equal.
• The values are considered to be unsigned.
• The Carry flag is set / cleared appropriately.




CJNE
CJNE
CJNE
CJNE
A, direct, rel
A, #data, rel
Rn, #data, rel
@Ri, #data, rel
Branching Instructions
• Decrement and Jump if Not Zero – DJNZ
– Decrement the first operand by 1 and jump to the
location identified by the second operand if the
resulting value is not zero.
 DJNZ
 DJNZ
• No Operation
– NOP
Rn, rel
direct, rel
Addressing Modes
• Five addressing modes are available:
– Immediate
– Register
– Direct
– Indirect
– Indexed
• There are three more modes:
– Relative
– Absolute
– Long
These are used with calls, branches and jumps and are handled
automatically by the assembler.
Immediate Addressing
• The data is directly specified in the instruction.
• Useful for getting constants into registers.
• Immediate data must be preceded with a “#” sign.
• MOV R0, #0F0H
; Load R0 with the value F0H
– The immediate value is a maximum of 8-bits.
• One exception, when dealing with the DPTR register it can
be 16-bits.
• MOV DPTR, #2000H ; Load the value 2000H into the
DPTR register
Register Addressing Mode
• Direct access to eight registers – R0 through R7.
• MOV A, R0
• MOV R1, A
• ADD A, R1
• Not all combinations are valid.
– MOV
R2, R1
; Invalid
• There are 4 banks of registers accessible through register
addressing.
– Only one bank can be accessed at a time controllable through bit
RS0 and RS1 of the PSW.
• MOV
PSW, #00011000B
• Set RS0:RS1 to 11, therefore, accessing register bank 3.
Direct Addressing
• Direct addressing can access any on-chip hardware register.
– All on-chip memory locations and registers have 8-bit
addresses.
– Can use the 8-bit address in the instruction.
• MOV
A, 4H
; Amem[04H]
– Or can use the register name.
• MOV
A, R4
– Don’t get confused with Immediate mode.
• No “#” sign.
Indirect Addressing
• R0 and R1 may be used as pointer registers
where their contents indicate an address in
internal RAM where the data is to be read or
written.
• MOV
R1, #40H ; Make R1 point to location 40
• MOV
A, @R1
; Move the contents of 40H to A
• MOV
@R0, R1
; Move contents of R1 into the
; memory location pointed to by R0.
Indirect Addressing
• Can also be used for accessing external memory:
– Can use R0 and R1 to point to external memory
locations 00H to FFH.
• MOVX A, @R1
; Move contents of external
memory location whose address
is in R1 into A
– Can also use DPTR to point to all 64k of external
memory.
• MOVX A, @DPTR
Indexed Addressing
• Use a register for storing a pointer to memory
and another register for storing an offset.
– The effective address is the sum of the two:
• EA = Pointer + Offset
• MOVC A, @A+DPTR
; Move byte from memory
located at DPTR+A to A.
Program Control Instructions
•
•
•
Unconditional Branch
– ajmp addr11
– ljmp addr16
– sjmp rel
– jmp @A+DPTR
; absolute jump
; long jump
; short jump to relative address
; jump indirect
Conditional branch
– jz, jnz rel
– djnz rel
– cjne rel
; short conditional jump to rel. addr
; decrement and jump if not zero
; compare and jump if not equal
Subroutine Call
– acall addr11
– lcall addr16
– ret
– reti
; absolute subroutine call
; long subroutine call
; return from subroutine call
; return from ISV
Target Address
• Target address can be,
– absolute: A complete physical address
• addr16: 16 bit address, anywhere in the 64k
• addr11: 11 bit address, anywhere within 2k page.
– rel: relative (forward or backward) -128 bytes to +127 bytes
from the current code location
• Target address calculation for relative jumps
– PC of next instruction + rel address
– For jump backwards, drop the carry
• PC = 15H, SJMP 0FEH
• Address is 15H + FEH = 13H
• Basically jump to next instruction minus two (current
instruction)
Conditional Jumps
• jz, jnz : Conditional on A=0
– Checks to see if A is zero
– jz jumps if A is zero and jnz jumps is A not zero
– No arithmetic op need be performed (unlike 8086/8085)
• djnz : dec a byte and jump if not equal to zero
– djnz Rn, rel
– djnz direct, rel
• jnc : Conditional on carry CY flag
– jc rel
– jnc rel
• cjne : compare and jump if not equal
– cjne A, direct, rel
– cjne Rn, #data, rel
– cjne @Rn, #data, rel
Loop using djnz
• Add 3 to A ten times
mov A, #0
; clear A
mov R2, #10 ; R2  10, can also say 0AH
AGAIN: add A, #03
; add 3 to A
djnz R2, AGAIN
; repeat until R2==0
mov R5, A
; save the result in R5
• Loop within loop using djnz
mov R3, #100
loop1:
loop2:
mov R2, #10
nop
djnz R2, loop2
djnz R3, loop1
; trying for 1000 loop iterations
; no operation
; repeat loop2 until R2==0
; repeat loop1 until R3==0
Unconditional Jumps
• LJMP addr16
– Long jump.
• Jump to a 2byte target address
– 3 byte instruction
• SJMP rel
– Jump to a relative address from PC+127 to PC-128
• Jump to PC + 127 (00H – 7FH)
• Jump to PC – 128 (80H – FFH)
Call Instructions
• Subroutines:
– Reusable code snippets
• LCALL addr16
– Long call.
• 3 byte instruction.
– Call any subroutine in entire 64k code space
– PC is stored on the stack
• ACALL addr11
– 2 byte instruction
– Call any subroutine within 2k of code space
– Other than this, same behavior as LCALL
– Saves code ROM for devices with less than 64K ROM
• RET
– Return from a subroutine call, Pops PC from stack