8052 Instr Set
8052 Instr Set
8052 Instr Set
? A C A L L :Absolute Call
? A DD,A DDC:Add Accum ulator(W ith Carry)
? A JM P :Absolute Jum p
? A N L :Bitw ise AN D
? CJN E:Com pare and Jum p ifN ot Equal
? CL R :ClearR egister
? CP L :Com plem ent R egister
? DA :Decim alAdjust
? DEC:Decrem ent R egister
? DIV:Divide Accum ulatorby B
? DJN Z:Decrem ent R egisterand Jum p ifN ot Zero
? IN C:Increm ent R egister
? JB:Jum p ifBit S et
? JBC:Jum p ifBit S et and ClearBit
? JC:Jum p ifCarry S et
? JM P :Jum p to Address
? JN B:Jum p ifBitN ot S et
? JN C:Jum p ifCarry N ot S et
? JN Z:Jum p ifAccum ulatorN ot Zero
? JZ:Jum p ifAccum ulatorZero
? L C A L L :L ong Call
? L JM P :L ong Jum p
? M O V:M ove M em ory
? M O VC:M ove Code M em ory
? M O VX :M ove Extended M em ory
? M U L :M ultiply Accum ulatorby B
? N O P :N o O peration
? O R L :Bitw ise O R
? P O P :P op Value From S tack
? P U S H:P ush Value O nto S tack
? R ET :R eturn From S ubroutine
? R ET I:R eturn From Interrupt
? R L :R otate Accum ulatorL eft
? R L C:R otate Accum ulatorL eftT hrough Carry
? R R :R otate Accum ulatorR ight
? R R C:R otate Accum ulatorR ight T hrough Carry
? S ET B:S et Bit
? S JM P :S hort Jum p
? S U BB:S ubtract From A ccum ulatorW ith Borrow
? S W A P :S w ap Accum ulatorN ibbles
? X CH: Exchange Bytes
? X CHD: Exchange Digits
? X R L :Bitw ise ExclusiveO R
Operation: ACALL
Function: Absolute Call Within 2K Block
Syntax: ACALL code address
Description: ACALL unconditionally calls a subroutine at the indicated code address. ACALL pushes the address
of the instruction that follows ACALL onto the stack, least-significant-byte first, most-significant-byte second. The
Program Counter is then updated so that program execution continues at the indicated address.
The new value for the Program Counter is calculated by replacing the least-significant-byte of the Program Counter
with the second byte of the ACALL instruction, and replacing bits 0-2 of the most-significant-byte of the Program
Counter with 3 bits that indicate the page. Bits 3-7 of the most-significant-byte of the Program Counter remain
unchaged.
Since only 11 bits of the Program Counter are affected by ACALL, calls may only be made to routines located
within the same 2k block as the first byte that follows ACALL.
C, AC, C, AC,
ADD A,#data 0x24 2 1 ADDC A,#data 0x34 2 1
OV OV
C, AC, C, AC,
ADD A,@R0 0x26 1 1 ADDC A,@R0 0x36 1 1
OV OV
C, AC, C, AC,
ADD A,@R1 0x27 1 1 ADDC A,@R1 0x37 1 1
OV OV
C, AC, C, AC,
ADD A,R0 0x28 1 1 ADDC A,R0 0x38 1 1
OV OV
C, AC, C, AC,
ADD A,R1 0x29 1 1 ADDC A,R1 0x39 1 1
OV OV
C, AC, C, AC,
ADD A,R2 0x2A 1 1 ADDC A,R2 0x3A 1 1
OV OV
C, AC, C, AC,
ADD A,R3 0x2B 1 1 ADDC A,R3 0x3B 1 1
OV OV
C, AC, C, AC,
ADD A,R4 0x2C 1 1 ADDC A,R4 0x3C 1 1
OV OV
C, AC, C, AC,
ADD A,R5 0x2D 1 1 ADDC A,R5 0x3D 1 1
OV OV
C, AC, C, AC,
ADD A,R6 0x2E 1 1 ADDC A,R6 0x3E 1 1
OV OV
C, AC, C, AC,
ADD A,R7 0x2F 1 1 ADDC A,R7 0x3F 1 1
OV OV
Description: Description: ADD and ADDC both add the value operand to the value of the Accumulator, leaving the
resulting value in the Accumulator. The value operand is not affected. ADD and ADDC function identically except
that ADDC adds the value of operand as well as the value of the Carry flag whereas ADD does not add the Carry
flag to the result.
The Carry bit (C) is set if there is a carry-out of bit 7. In other words, if the unsigned summed value of the
Accumulator, operand and (in the case of ADDC) the Carry flag exceeds 255 Carry is set. Otherwise, the Carry bit
is cleared.
The Auxillary Carry (AC) bit is set if there is a carry-out of bit 3. In other words, if the unsigned summed value of
the low nibble of the Accumulator, operand and (in the case of ADDC) the Carry flag exceeds 15 the Auxillary
Carry flag is set. Otherwise, the Auxillary Carry flag is cleared.
The Overflow (OV) bit is set if there is a carry-out of bit 6 or out of bit 7, but not both. In other words, if the
addition of the Accumulator, operand and (in the case of ADDC) the Carry flag treated as signed values results in a
value that is out of the range of a signed byte (-128 through +127) the Overflow flag is set. Otherwise, the Overflow
flag is cleared.
See Also: SUBB, DA, INC, DEC, Instruction Set
Operation: AJMP
Function: Absolute Jump Within 2K Block
Syntax: AJMP code address
Description: AJMP unconditionally jumps to the indicated code address. The new value for the Program Counter is
calculated by replacing the least-significant-byte of the Program Counter with the second byte of the AJMP
instruction, and replacing bits 0-2 of the most-significant-byte of the Program Counter with 3 bits that indicate the
page of the byte following the AJMP instruction. Bits 3-7 of the most-significant-byte of the Program Counter
remain unchaged.
Since only 11 bits of the Program Counter are affected by AJMP, jumps may only be made to code located within
the same 2k block as the first byte that follows AJMP.
Operation: ANL
Function: Bitwise AND
Syntax: ANL operand1, operand2
Description: ANL does a bitwise "AND" operation between operand1 and operand2, leaving the resulting value in
operand1. The value of operand2 is not affected. A logical "AND" compares the bits of each operand and sets the
corresponding bit in the resulting byte only if the bit was set in both of the original operands, otherwise the resulting
bit is cleared.
Operation: CJNE
Function: Compare and Jump If Not Equal
Syntax: CJNE operand1,operand2,reladdr
Description: CJNE compares the value of operand1 and operand2 and branches to the indicated relative address if
operand1 and operand2 are not equal. If the two operands are equal program flow continues with the instruction
following the CJNE instruction.
The Carry bit (C) is set if operand1 is less than operand2, otherwise it is cleared.
Operation: CLR
Function: Clear Register
Syntax: CLR register
CLR C 0xC3 1 1 C
Description: CLR clears (sets to 0) all the bit(s) of the indicated register. If the register is a bit (including the carry
bit), only the specified bit is affected. Clearing the Accumulator sets the Accumulator’s value to 0.
Operation: CPL
Function: Complement Register
Syntax: CPL operand
CPL C 0xB3 1 1 C
Operation: DA
Function: Decimal Adjust Accumulator
Syntax: DA A
DA 0xD4 1 1 C
Description: DA adjusts the contents of the Accumulator to correspond to a BCD (Binary Coded Decimal) number
after two BCD numbers have been added by the ADD or ADDC instruction. If the carry bit is set or if the value of
bits 0-3 exceed 9, 0x06 is added to the accumulator. If the carry bit was set when the instruction began, or if 0x06
was added to the accumulator in the first step, 0x60 is added to the accumulator.
The Carry bit (C) is set if the resulting value is greater than 0x99, otherwise it is cleared.
Operation: DEC
Function: Decrement Register
Syntax: DEC register
Description: DEC decrements the value of register by 1. If the initial value of register is 0, decrementing the value
will cause it to reset to 255 (0xFF Hex). Note: The Carry Flag is NOT set when the value "rolls over" from 0 to 255.
Operation: DIV
Function: Divide Accumulator by B
Syntax: DIV AB
Description: Divides the unsigned value of the Accumulator by the unsigned value of the "B" register. The resulting
quotient is placed in the Accumulator and the remainder is placed in the "B" register.
The Overflow flag (OV) is set if division by 0 was attempted, otherwise it is cleared.
Operation: DJNZ
Function: Decrement and Jump if Not Zero
Syntax: DJNZ register,reladdr
Description: DJNZ decrements the value of register by 1. If the initial value of register is 0, decrementing the value
will cause it to reset to 255 (0xFF Hex). If the new value of register is not 0 the program will branch to the address
indicated by relative addr. If the new value of register is 0 program flow continues with the instruction following
the DJNZ instruction.
Operation: INC
Function: Increment Register
Syntax: INC register
Description: INC increments the value of register by 1. If the initial value of register is 255 (0xFF Hex),
incrementing the value will cause it to reset to 0. Note: The Carry Flag is NOT set when the value "rolls over" from
255 to 0.
In the case of "INC DPTR", the value two-byte unsigned integer value of DPTR is incremented. If the initial value
of DPTR is 65535 (0xFFFF Hex), incrementing the value will cause it to reset to 0. Again, the Carry Flag is NOT
set when the value of DPTR "rolls over" from 65535 to 0.
Description: JB branches to the address indicated by reladdr if the bit indicated by bit addr is set. If the bit is not
set program execution continues with the instruction following the JB instruction.
Operation: JBC
Function: Jump if Bit Set and Clear Bit
Syntax: JB bit addr, reladdr
Description: JBC will branch to the address indicated by reladdr if the bit indicated by bit addr is set. Before
branching to reladdr the instruction will clear the indicated bit. If the bit is not set program execution continues with
the instruction following the JBC instruction.
Operation: JC
Function: Jump if Carry Set
Syntax: JC reladdr
Description: JC will branch to the address indicated by reladdr if the Carry Bit is set. If the Carry Bit is not set
program execution continues with the instruction following the JC instruction.
Description: JMP jumps unconditionally to the address represented by the sum of the value of DPTR and the value
of the Accumulator.
Operation: JNC
Function: Jump if Carry Not Set
Syntax: JNC reladdr
Description: JNC branches to the address indicated by reladdr if the carry bit is not set. If the carry bit is set
program execution continues with the instruction following the JNB instruction.
Operation: JNZ
Function: Jump if Accumulator Not Zero
Syntax: JNZ reladdr
Description: JNZ will branch to the address indicated by reladdr if the Accumulator contains any value except 0. If
the value of the Accumulator is zero program execution continues with the instruction following the JNZ instruction.
Description: JZ branches to the address indicated by reladdr if the Accumulator contains the value 0. If the value of
the Accumulator is non-zero program execution continues with the instruction following the JZ instruction.
Operation: LCALL
Function: Long Call
Syntax: LCALL code addr
Description: LCALL calls a program subroutine. LCALL increments the program counter by 3 (to point to the
instruction following LCALL) and pushes that value onto the stack (low byte first, high byte second). The Program
Counter is then set to the 16-bit value which follows the LCALL opcode, causing program execution to continue at
that address.
Operation: LJMP
Function: Long Jump
Syntax: LJMP code addr
** Note: In the case of "MOV iram addr,iram addr", the operand bytes of the instruction are stored in reverse order.
That is, the instruction consisting of the bytes 0x85, 0x20, 0x50 means "Move the contents of Internal RAM location
0x20 to Internal RAM location 0x50" whereas the opposite would be generally presumed.
See Also: MOVC, MOVX, XCH, XCHD, PUSH, POP, Instruction Set
Operation: MOVC
Function: Move Code Byte to Accumulator
Syntax: MOVC A,@A+register
Description: MOVC moves a byte from Code Memory into the Accumulator. The Code Memory address from
which the byte will be moved is calculated by summing the value of the Accumulator with either DPTR or the
Program Counter (PC). In the case of the Program Counter, PC is first incremented by 1 before being summed with
the Accumulator.
Operation: MOVX
Function: Move Data To/From External Memory (XRAM)
Syntax: MOVX operand1,operand2
If operand1 is @DPTR, the Accumulator is moved to the 16-bit External Memory address indicated by DPTR. This
instruction uses both P0 (port 0) and P2 (port 2) to output the 16-bit address and data. If operand2 is DPTR then the
byte is moved from External Memory into the Accumulator.
If operand1 is @R0 or @R1, the Accumulator is moved to the 8-bit External Memory address indicated by the
specified Register. This instruction uses only P0 (port 0) to output the 8-bit address and data. P2 (port 2) is not
affected. If operand2 is @R0 or @R1 then the byte is moved from External Memory into the Accumulator.
(C) C
Operation: MUL
Function: Multiply Accumulator by B
Syntax: MUL AB
MUL AB 0xA4 1 4 C, OV
Description: Multiples the unsigned value of the Accumulator by the unsigned value of the "B" register. The least
significant byte of the result is placed in the Accumulator and the most-significant-byte is placed in the "B" register.
The Overflow Flag (OV) is set if the result is greater than 255 (if the most-significant byte is not zero), otherwise it
is cleared.
Operation: NOP
Function: None, waste time
Syntax: No Operation
Description: NOP, as it’s name suggests, causes No Operation to take place for one machine cycle. NOP is
generally used only for timing purposes. Absolutely no flags or registers are affected.
Operation: ORL
Function: Bitwise OR
Syntax: ORL operand1,operand2
Description: ORL does a bitwise "OR" operation between operand1 and operand2, leaving the resulting value in
operand1. The value of operand2 is not affected. A logical "OR" compares the bits of each operand and sets the
corresponding bit in the resulting byte if the bit was set in either of the original operands, otherwise the resulting bit
is cleared.
Operation: POP
Function: Pop Value From Stack
Syntax: POP
Description: POP "pops" the last value placed on the stack into the iram addr specified. In other words, POP will
load iram addr with the value of the Internal RAM address pointed to by the current Stack Pointer. The stack pointer
is then decremented by 1.
See Also: PUSH, Instruction Set
Operation: PUSH
Function: Push Value Onto Stack
Syntax: PUSH
Description: PUSH "pushes" the value of the specified iram addr onto the stack. PUSH first increments the value of
the Stack Pointer by 1, then takes the value stored in iram addr and stores it in Internal RAM at the location pointed
to by the incremented Stack Pointer.
Operation: RET
Function: Return From Subroutine
Syntax: RET
Description: RET is used to return from a subroutine previously called by LCALL or ACALL. Program execution
continues at the address that is calculated by popping the topmost 2 bytes off the stack. The most-significant-byte is
popped off the stack first, followed by the least-significant-byte.
Operation: RETI
Function: Return From Interrupt
Syntax: RETI
Description: RETI is used to return from an interrupt service routine. RETI first enables interrupts of equal and
lower priorities to the interrupt that is terminating. Program execution continues at the address that is calculated by
popping the topmost 2 bytes off the stack. The most-significant-byte is popped off the stack first, followed by the
least-significant-byte.
RL A 0x23 1 1 C
Description: Shifts the bits of the Accumulator to the left. The left-most bit (bit 7) of the Accumulator is loaded into
bit 0.
Operation: RLC
Function: Rotate Accumulator Left Through Carry
Syntax: RLC A
Description: Shifts the bits of the Accumulator to the left. The left-most bit (bit 7) of the Accumulator is loaded into
the Carry Flag, and the original Carry Flag is loaded into bit 0 of the Accumulator. This function can be used to
quickly multiply a byte by 2.
Operation: RR
Function: Rotate Accumulator Right
Syntax: RR A
RR A 0x03 1 1 None
Description: Shifts the bits of the Accumulator to the right. The right-most bit (bit 0) of the Accumulator is loaded
into bit 7.
Operation: RRC
Function: Rotate Accumulator Right Through Carry
Syntax: RRC A
Instructions OpCode Bytes Cycles Flags
RRC A 0x13 1 1 C
Description: Shifts the bits of the Accumulator to the right. The right-most bit (bit 0) of the Accumulator is loaded
into the Carry Flag, and the original Carry Flag is loaded into bit 7. This function can be used to quickly divide a
byte by 2.
Operation: SETB
Function: Set Bit
Syntax: SETB bit addr
SETB C 0xD3 1 1 C
Operation: SJMP
Function: Short Jump
Syntax: SJMP reladdr
Description: SJMP jumps unconditionally to the address specified reladdr. Reladdr must be within -128 or +127
bytes of the instruction that follows the SJMP instruction.
Operation: SUBB
Function: Subtract from Accumulator With Borrow
Syntax: SUBB A,operand
Description: SUBB subtract the value of operand from the value of the Accumulator, leaving the resulting value in
the Accumulator. The value operand is not affected.
The Carry Bit (C) is set if a borrow was required for bit 7, otherwise it is cleared. In other words, if the unsigned
value being subtracted is greater than the Accumulator the Carry Flag is set.
The Auxillary Carry (AC) bit is set if a borrow was required for bit 3, otherwise it is cleared. In other words, the
bit is set if the low nibble of the value being subtracted was greater than the low nibble of the Accumulator.
The Overflow (OV) bit is set if a borrow was required for bit 6 or for bit 7, but not both. In other words, the
subtraction of two signed bytes resulted in a value outside the range of a signed byte (-128 to 127). Otherwise it is
cleared.
Operation: SWAP
Function: Swap Accumulator Nibbles
Syntax: SWAP A
Description: SWAP swaps bits 0-3 of the Accumulator with bits 4-7 of the Accumulator. This instruction is
identical to executing "RR A" or "RL A" four times.
Operation: XCH
Function: Exchange Bytes
Syntax: XCH A,register
Description: Exchanges the value of the Accumulator with the value contained in register.
Operation: XCHD
Function: Exchange Digit
Syntax: XCHD A,[@R0/@R1]
Description: Exchanges bits 0-3 of the Accumulator with bits 0-3 of the Internal RAM address pointed to indirectly
by R0 or R1. Bits 4-7 of each register are unaffected.
Operation: XRL
Function: Bitwise Exclusive OR
Syntax: XRL operand1,operand2
Description: XRL does a bitwise "EXCLUSIVE OR" operation between operand1 and operand2, leaving the
resulting value in operand1. The value of operand2 is not affected. A logical "EXCLUSIVE OR" compares the bits
of each operand and sets the corresponding bit in the resulting byte if the bit was set in either (but not both) of the
original operands, otherwise the bit is cleared.
Description: The "Undefined" instruction is, as the name suggests, not a documented instruction. The 8051 supports
255 instructions and OpCode 0xA5 is the single OpCode that is not used by any documented function. Since it is not
documented nor defined it is not recommended that it be executed. However, based on my research, executing this
undefined instruction takes 1 machine cycle and appears to have no effect on the system except that the Carry Bit
always seems to be set.
Note: We received input from an 8052.com user that the undefined instruction really has a format of Undefined
bit1,bit2 and effectively copies the value of bit2 to bit1. In this case, it would be a three-byte instruction. We haven't
had an opportunity to verify or disprove this report, so we present it to the world as "additional information."