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