8051 Instruction Set: Opcode, Operand, Size, and M-Cycle
This page covers the 8051 instruction set, detailing the opcode, operand, size in bytes, and M-cycle (number of machine cycles) for each instruction. Remember that one machine cycle consists of 12 oscillator periods.
Table 1 explains the terms used in the instruction tables, along with their addressing modes.
Table 1: Instruction Terminology
Instructions | Description |
---|
Rn | Register R7 to R0. |
direct | 8-bit address of the internal data location. |
@Ri | 8-bit address of internal RAM indicated by register R1 or R0. |
#data | 8-bit constant included in the instruction. |
#data16 | 16-bit constant included in the instruction. |
addr16 | 16-bit destination address. |
addr11 | 11-bit destination address. |
rel | Signed (2’s complement) 8-bit offset byte. |
bit | Direct addressed bit in internal data RAM or SFR (Special Function Register). |
8051 Instruction Set Categories
The 8051 instruction set is divided into the following categories:
- Arithmetic instructions
- Logical instructions
- Data transfer instructions
- Boolean instructions
- Branching instructions
Arithmetic Instructions
Instruction | Opcode | Operand | Size (Bytes) | Machine Cycles | Description |
---|
ADD A,Rn | | | 1 | 1 | Add register to accumulator |
ADDC A,Rn | | | 1 | 1 | Add register to accumulator with carry |
SUBB A,Rn | | | 1 | 1 | Subtract register from ACC with borrow |
INC A | | | 1 | 1 | Increment accumulator |
DEC A | | | 1 | 1 | Decrement accumulator |
INC DPTR | | | 1 | 2 | Increment data pointer |
MUL AB | | | 1 | 4 | Multiply A and B (48 Oscillator periods) |
DIV AB | | | 1 | 4 | Divide A by B (Oscillator periods) |
Logical Instructions
Instruction | Opcode | Operand | Size (Bytes) | Machine Cycles | Description |
---|
ANL A,Rn | | | 1 | 1 | AND register to Accumulator |
ANL A,direct | | | 2 | 1 | AND direct byte to accumulator |
ANL A,@Ri | | | 1 | 1 | AND indirect RAM to accumulator |
ANL A,#data | | | 2 | 1 | AND immediate data to accumulator |
ANL direct,A | | | 2 | 1 | AND accumulator to direct byte |
ANL direct,#data | | | 3 | 2 | AND immediate data to direct byte |
ORL A,Rn | | | 1 | 1 | OR register to accumulator |
XRL A,Rn | | | 1 | 1 | Exclusive-OR register to accumulator |
CLR A | | | 1 | 1 | Clear accumulator |
CPL A | | | 1 | 1 | Complement accumulator |
RL A | | | 1 | 1 | Rotate accumulator left |
RLC A | | | 1 | 1 | Rotate accumulator left through the carry |
RR A | | | 1 | 1 | Rotate accumulator right |
RRC A | | | 1 | 1 | Rotate accumulator right through the carry |
SWAP A | | | 1 | 1 | Swap nibbles within the accumulator |
Data Transfer Instructions
Instruction | Opcode | Operand | Size (Bytes) | Machine Cycles | Description |
---|
MOV A,Rn | | | 1 | 1 | Move register to accumulator |
MOV A,direct | | | 2 | 1 | Move direct byte to accumulator |
MOV A,#data | | | 2 | 1 | Move immediate data to accumulator |
MOVC A,@A+DPTR | | | 1 | 2 | Move code byte relative to DPTR to Acc |
MOVX A,@Ri | | | 1 | 2 | Move external RAM (8-bit address) to Acc. |
PUSH direct | | | 2 | 2 | Push direct byte onto stack |
POP direct | | | 2 | 2 | POP direct byte from stack |
XCH A,Rn | | | 1 | 1 | Exchange register with accumulator |
XCH A,direct | | | 2 | 1 | Exchange direct byte with accumulator |
XCH A,@Ri | | | 1 | 1 | Exchange indirect RAM with accumulator |
XCHD A,@Ri | | | 1 | 1 | Exchange low order digit of indirect RAM with ACC |
Boolean Instructions
Instruction | Opcode | Operand | Size (Bytes) | Machine Cycles | Description |
---|
CLR C | | | 1 | 1 | Clear Carry |
CLR bit | | | 2 | 1 | Clear direct bit |
SETB C | | | 1 | 1 | Set carry |
SETB bit | | | 2 | 1 | Set direct bit |
CPL C | | | 1 | 1 | Complement carry |
CPL bit | | | 2 | 1 | Complement direct bit |
ANL C,bit | | | 2 | 2 | AND direct bit to carry |
ANL C,/bit | | | 2 | 2 | AND complement of direct bit to carry |
ORL C,bit | | | 2 | 2 | OR direct bit to carry |
MOV C,bit | | | 2 | 1 | Move direct bit to carry |
MOV bit,C | | | 2 | 2 | Move carry to direct bit |
JC rel | | | 2 | 2 | Jump if carry is set |
JNC rel | | | 2 | 2 | Jump if carry is not set |
JB bit,rel | | | 3 | 2 | Jump if direct bit is set |
JNB bit,rel | | | 3 | 2 | Jump if direct bit is not set |
JBC bit,rel | | | 3 | 2 | Jump if direct bit is set and clear bit |
Branching Instructions
Instruction | Opcode | Operand | Size (Bytes) | Machine Cycles | Description |
---|
ACALL addr11 | | | 2 | 2 | Absolute subroutine call |
LCALL addr16 | | | 3 | 2 | Long subrouting call |
RET | | | 1 | 2 | Return from subroutine |
RETI | | | 1 | 2 | Return from interrupt |
AJMP addr11 | | | 2 | 2 | Absolute Jump |
LJMP addr16 | | | 3 | 2 | Long Jump |
JMP @A+DPTR | | | 1 | 2 | Jump indirect relative to the DPTR |
JZ rel | | | 2 | 2 | Jump if accumulator is zero |
JNZ rel | | | 2 | 2 | Jump if accumulator is non-zero |
CJNE A,direct,rel | | | 3 | 2 | Compare direct byte to acc and jump if not equal |
DJNZ Rn,rel | | | 2 | 2 | Decrement register and jump if not zero |
DJNZ direct,rel | | | 3 | 2 | Decrement direct byte and jump if not zero |
NOP | | | 1 | 1 | No Operation (12 oscillator periods implied, but listed as 1 cycle) |