INSTRUCTION SET
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
                    INSTRUCTION SET
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 (carry) flag.
       • Useful for 16-bit addition in two steps.
       • The CY flag is set/reset appropriately.
                 INSTRUCTION SET
Example – 16-bit Addition
Add 1E44H to 56CAH
CLR C ; Clear the CY flag
MOV A, 44H ; The lower 8-bits of the 1st number
ADD A, CAH ; The lower 8-bits of the 2nd number
MOV R1, A ; The result 0EH will be in R1. CY = 1.
MOV A, 1EH ; The upper 8-bits of the 1st number
ADDC A, 56H ; The upper 8-bits of the 2nd number
MOV R2, A ; The result of the addition is 75H
The overall result : 750EH will be in R2:R1. CY = 0.
                     INSTRUCTION SET
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.
             INSTRUCTION SET
Example – BCD addition
Add 34 to 49 BCD
CLR C      ; Clear the CY flag
MOV A, #34H ; Place 1st number in A
ADD A, #49H ; Add the 2nd number.
               ; A = 7DH
DA A       ; A = 83H
                  INSTRUCTION SET
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.
              INSTRUCTION SET
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 – direct bit Carry
   • ANL C, /bit –complement direct bit Carry
               INSTRUCTION SET
Logical Operations
• XRL
– Works on bytes only.
• CPL / CLR
– Complement / Clear.
– Work on the accumulator or a bit.
   • CLR P1.2
               INSTRUCTION SET
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.
                  INSTRUCTION SET
Data Transfer Instructions
• MOV
– 8-bit data transfer for internal RAM and the SFR.
• MOV A, Rn • MOV direct, Rn
• MOV A, direct • MOV direct, direct
• MOV A, @Ri • MOV direct, @Ri
• MOV A, #data • MOV direct, #data
• MOV Rn, A • MOV @Ri, A
• MOV Rn, direct • MOV @Ri, direct
• MOV Rn, #data • MOV @Ri, #data
• MOV direct, A
               INSTRUCTION SET
Data Transfer Operations
• MOV
  – 1bit data transfer involving the CY flag
      • MOV C, bit
      • MOV bit, C
• MOV
  – 16-bit data transfer involving the DPTR
      • MOV DPTR, #data
              INSTRUCTION SET
Data Transfer Instructions
• MOVC
  – Move Code Byte
    • Load the accumulator with a byte from
      program memory.
    • Must use indexed addressing
       • MOVC A, @A+DPTR
       • MOVC A, @A+PC
              INSTRUCTION SET
Data Transfer Instructions
• MOVX
  – Data transfer between the accumulator and
    a byte from external data memory.
       • MOVX A, @Ri
       • MOVX A, @DPTR
       • MOVX @Ri, A
       • MOVX @DPTR, A
               INSTRUCTION SET
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 DPL
          • POP 40H
                    INSTRUCTION SET
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.
               INSTRUCTION SET
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.
                  INSTRUCTION SET
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
                INSTRUCTION SET
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.
                INSTRUCTION SET
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.
                       INSTRUCTION SET
Program Control Instructions
• Unconditional Branch
– ajmp addr11 ; absolute jump
– ljmp addr16 ; long jump
– sjmp rel ; short jump to relative address
– jmp @A+DPTR ; jump indirect
• Conditional branch
– jz, jnz rel ; short conditional jump to rel. addr
– djnz rel ; decrement and jump if not zero
– cjne rel ; compare and jump if not equal
• Subroutine Call
– acall addr11 ; absolute subroutine call
– lcall addr16 ; long subroutine call
– ret ; return from subroutine call
– reti ; return from ISV
                     INSTRUCTION SET
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)
                     INSTRUCTION SET
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.
    • 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)
– Long Jump – LJMP
   • Uses a 16-bit address.
   • 3 byte instruction capable of referencing any location in
          the entire 64K of program memory.
                     INSTRUCTION SET
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
                     INSTRUCTION SET
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.
   • 2 byte instruction.
– Long Call – LCALL
   • Uses a 16-bit address similar to LJMP
   • The subroutine can be anywhere.
   • 3 byte instruction.
– Both forms push the 16-bit address of the next
  instruction on the stack and update the stack pointer.
                    INSTRUCTION SET
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.
                    INSTRUCTION SET
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.
                INSTRUCTION SET
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.
                INSTRUCTION SET
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 A, direct, rel
      • CJNE A, #data, rel
      • CJNE Rn, #data, rel
      • CJNE @Ri, #data, rel
                 INSTRUCTION SET
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 Rn, rel
        • DJNZ direct, rel
• No Operation
   – NOP
                    INSTRUCTION SET
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:    mov R2, #10 ; trying for 1000 loop iterations
loop2:    nop       ; no operation
   djnz R2, loop2 ; repeat loop2 until R2==0
   djnz R3, loop1 ; repeat loop1 until R3==0