Syntax: |
Operation: |
Operands: |
Program Counter: |
Opcode |
Comment |
Stack |
ADC Rd,Rr |
Rd = Rd + Rr + C |
0 <= d <= 31, 0 <= r <= 31 |
PC = PC + 1 |
000111rdddddrrrr |
Adds two registers and the contents of the C flag and places the result in the destination register Rd.
I |
– |
||
T |
– |
||
H |
⇔ |
Rd3 AND Rr3 OR Rr3 AND ~R3 OR ~R3 AND Rd3 |
Set if there was a carry from bit 3; cleared otherwise. |
S |
⇔ |
N XOR V, for signed tests. |
|
V |
⇔ |
Rd7 AND Rr7 AND ~R7 OR ~Rd7 AND ~Rr7 AND R7 |
Set if two's complement overflow resulted from the operation; cleared otherwise. |
N |
⇔ |
R7 |
Set if MSB of the result is set; cleared otherwise. |
Z |
⇔ |
~R7 AND ~R6 AND ~R5 AND ~R4 AND ~R3 AND ~R2 AND ~R1 AND ~R0 |
Set if the result is 0x00; cleared otherwise. |
C |
⇔ |
Rd7 AND Rr7 OR Rr7 AND ~R7 OR ~R7 AND Rd7 |
Set if there was a carry from the MSB of the result; cleared otherwise. |
R (Result) |
R (Result) equals Rd after the operation. |
; Add R1:R0 to R3:R2 add r2,r0 ; Add low byte adc r3,r1 ; Add with carry high byte
1 (2 bytes)
Name |
Cycles |
AVRe |
1 |
AVRxm |
1 |
AVRxt |
1 |
AVRrc |
1 |
Syntax: |
Operation: |
Operands: |
Program Counter: |
Opcode |
Comment |
Stack |
ADD Rd,Rr |
Rd = Rd + Rr |
0 <= d <= 31, 0 <= r <= 31 |
PC = PC + 1 |
000011rdddddrrrr |
Adds two registers without the C flag and places the result in the destination register Rd.
I |
– |
||
T |
– |
||
H |
⇔ |
Rd3 AND Rr3 OR Rr3 AND ~R3 OR ~R3 AND Rd3 |
Set if there was a carry from bit 3; cleared otherwise. |
S |
⇔ |
N XOR V, for signed tests. |
|
V |
⇔ |
Rd7 AND Rr7 AND ~R7 OR ~Rd7 AND ~Rr7 AND R7 |
Set if two's complement overflow resulted from the operation; cleared otherwise. |
N |
⇔ |
R7 |
Set if MSB of the result is set; cleared otherwise. |
Z |
⇔ |
~R7 AND ~R6 AND ~R5 AND ~R4 AND ~R3 AND ~R2 AND ~R1 AND ~R0 |
Set if the result is 0x00; cleared otherwise. |
C |
⇔ |
Rd7 AND Rr7 OR Rr7 AND ~R7 OR ~R7 AND Rd7 |
Set if there was a carry from the MSB of the result; cleared otherwise. |
R (Result) |
R (Result) equals Rd after the operation. |
add r1,r2 ; Add r2 to r1 (r1=r1+r2) add r28,r28 ; Add r28 to itself (r28=r28+r28)
1 (2 bytes)
Name |
Cycles |
AVRe |
1 |
AVRxm |
1 |
AVRxt |
1 |
AVRrc |
1 |
Syntax: |
Operation: |
Operands: |
Program Counter: |
Opcode |
Comment |
Stack |
ADIW Rd,K |
R[d+1]:Rd = R[d+1]:Rd + K |
d ∈ {24,26,28,30}, 0 <= K <= 63 |
PC = PC + 1 |
10010110KKddKKKK |
Adds an immediate value (0-63) to a register pair and places the result in the register pair. This instruction operates on the upper four register pairs and is well suited for operations on the Pointer Registers.
This instruction is not available on all devices. Refer to Appendix A.
I |
– |
||
T |
– |
||
H |
– |
||
S |
⇔ |
N XOR V, for signed tests. |
|
V |
⇔ |
~Rdh7 AND R15 |
Set if two's complement overflow resulted from the operation; cleared otherwise. |
N |
⇔ |
R15 |
Set if MSB of the result is set; cleared otherwise. |
Z |
⇔ |
~R15 AND ~R14 AND ~R13 AND ~R12 AND ~R11 AND ~R10 AND ~R9 AND ~R8 ANDR7 AND ~R6 AND ~R5 AND ~R4 AND ~R3 AND ~R2 AND ~R1 AND ~R0 |
Set if the result is 0x0000; cleared otherwise. |
C |
⇔ |
~R15 AND Rdh7 |
Set if there was a carry from the MSB of the result; cleared otherwise. |
R (Result) |
R (Result) equals R[d+1]:Rd after the operation. |
adiw r24,1 ; Add 1 to r25:r24 adiw ZL,63 ; Add 63 to the Z-pointer(r31:r30)
1 (2 bytes)
Name |
Cycles |
AVRe |
2 |
AVRxm |
2 |
AVRxt |
2 |
AVRrc |
N/A |
Syntax: |
Operation: |
Operands: |
Program Counter: |
Opcode |
Comment |
Stack |
ANDI Rd,K |
Rd = Rd AND K |
16 <= d <= 31, 0 <= K <= 255 |
PC = PC + 1 |
0111KKKKddddKKKK |
Performs the logical AND between the contents of register Rd and a constant, and places the result in the destination register Rd.
I |
– |
||
T |
– |
||
H |
– |
||
S |
⇔ |
N XOR V, for signed tests. |
|
V |
0 |
0 |
Cleared. |
N |
⇔ |
R7 |
Set if MSB of the result is set; cleared otherwise. |
Z |
⇔ |
~R7 AND ~R6 AND ~R5 AND ~R4 AND ~R3 AND ~R2 AND ~R1 AND ~R0 |
Set if the result is 0x00; cleared otherwise. |
C |
– |
||
R (Result) |
R (Result) equals Rd after the operation. |
andi r17,0x0F ; Clear upper nibble of r17 andi r18,0x10 ; Isolate bit 4 in r18 andi r19,0xAA ; Clear odd bits of r19
1 (2 bytes)
Name |
Cycles |
AVRe |
1 |
AVRxm |
1 |
AVRxt |
1 |
AVRrc |
1 |
Syntax: |
Operation: |
Operands: |
Program Counter: |
Opcode |
Comment |
Stack |
AND Rd,Rr |
Rd = Rd AND Rr |
0 <= d <= 31, 0 <= r <= 31 |
PC = PC + 1 |
001000rdddddrrrr |
Performs the logical AND between the contents of register Rd and register Rr, and places the result in the destination register Rd.
I |
– |
||
T |
– |
||
H |
– |
||
S |
⇔ |
N XOR V, for signed tests. |
|
V |
0 |
0 |
Cleared. |
N |
⇔ |
R7 |
Set if MSB of the result is set; cleared otherwise. |
Z |
⇔ |
~R7 AND ~R6 AND ~R5 AND ~R4 AND ~R3 AND ~R2 AND ~R1 AND ~R0 |
Set if the result is 0x00; cleared otherwise. |
C |
– |
||
R (Result) |
R (Result) equals Rd after the operation. |
and r2,r3 ; Bitwise and r2 and r3, result in r2 ldi r16,1 ; Set bitmask 0000 0001 in r16 and r2,r16 ; Isolate bit 0 in r2
1 (2 bytes)
Name |
Cycles |
AVRe |
1 |
AVRxm |
1 |
AVRxt |
1 |
AVRrc |
1 |
Syntax: |
Operation: |
Operands: |
Program Counter: |
Opcode |
Comment |
Stack |
ASR Rd |
Rd = ASR(Rd) |
0 <= d <= 31 |
PC = PC + 1 |
1001010ddddd0101 |
Shifts all bits in Rd one place to the right. Bit 7 is held constant. Bit 0 is loaded into the C flag of the SREG. This operation effectively divides a signed value by two without changing its sign. The Carry flag can be used to round the result.
I |
– |
||
T |
– |
||
H |
– |
||
S |
⇔ |
N XOR V, for signed tests. |
|
V |
⇔ |
N XOR C, for N and C after the shift. |
|
N |
⇔ |
R7. Set if MSB of the result is set; cleared otherwise. |
|
Z |
⇔ |
~R7 AND ~R6 AND ~R5 AND ~R4 AND ~R3 AND ~R2 AND ~R1 AND ~R0 |
Set if the result is 0x00; cleared otherwise. |
C |
⇔ |
Rd0 |
Set if, before the shift, the LSB of Rd was set; cleared otherwise. |
R (Result) |
R (Result) equals Rd after the operation. |
ldi r16,0x10 ; Load decimal 16 into r16 asr r16 ; r16=r16 / 2 ldi r17,0xFC ; Load -4 in r17 asr r17 ; r17=r17/2
1 (2 bytes)
Name |
Cycles |
AVRe |
1 |
AVRxm |
1 |
AVRxt |
1 |
AVRrc |
1 |
Syntax: |
Operation: |
Operands: |
Program Counter: |
Opcode |
Comment |
Stack |
BCLR s |
SREG(s) = 0 |
0 <= s <= 7 |
PC = PC + 1 |
100101001sss1000 |
Clears a single flag in SREG.
I |
⇔ |
If (s == 7) then I = 0, else unchanged. |
|
T |
⇔ |
If (s == 6) then T = 0, else unchanged. |
|
H |
⇔ |
If (s == 5) then H = 0, else unchanged. |
|
S |
⇔ |
If (s == 4) then S = 0, else unchanged. |
|
V |
⇔ |
If (s == 3) then V = 0, else unchanged. |
|
N |
⇔ |
If (s == 2) then N = 0, else unchanged. |
|
Z |
⇔ |
If (s == 1) then Z = 0, else unchanged. |
|
C |
⇔ |
If (s == 0) then C = 0, else unchanged. |
bclr 0 ; Clear Carry flag bclr 7 ; Disable interrupts
1 (2 bytes)
Name |
Cycles |
AVRe |
1 |
AVRxm |
1 |
AVRxt |
1 |
AVRrc |
1 |
Syntax: |
Operation: |
Operands: |
Program Counter: |
Opcode |
Comment |
Stack |
BLD Rd,b |
Rd(b) = T |
0 <= d <= 31, 0 <= b <= 7 |
PC = PC + 1 |
1111100ddddd0bbb |
Copies the T bit in the SREG (Status Register) to bit b in register Rd.
I |
– |
||
T |
– |
||
H |
– |
||
S |
– |
||
V |
– |
||
N |
– |
||
Z |
– |
||
C |
– |
; Copy bit bst r1,2 ; Store bit 2 of r1 in T bit bld r0,4 ; Load T bit into bit 4 of r0
1 (2 bytes)
Name |
Cycles |
AVRrc |
1 |
AVRe |
1 |
AVRxm |
1 |
AVRxt |
1 |
Syntax: |
Operation: |
Operands: |
Program Counter: |
Opcode |
Comment |
Stack |
BRBC s,k |
If SREG(s) == 0 then PC = PC + k + 1, else PC = PC + 1 |
0 <= s <= 7, -64 <= k <= +63 |
PC = PC + k + 1 PC = PC + 1, if the condition is false |
111101kkkkkkksss |
Conditional relative branch. Tests a single bit in SREG and branches relatively to the PC if the bit is cleared. This instruction branches relatively to the PC in either direction (PC - 63 <= destination <= PC + 64). Parameter k is the offset from the PC and is represented in two's complement form.
I |
– |
||
T |
– |
||
H |
– |
||
S |
– |
||
V |
– |
||
N |
– |
||
Z |
– |
||
C |
– |
cpi r20,5 ; Compare r20 to the value 5 brbc 1,noteq ; Branch if Zero flag cleared ... noteq: nop ; Branch destination (do nothing)
1 (2 bytes)
Name |
Cycles i |
ii |
AVRe |
1 |
2 |
AVRxm |
1 |
2 |
AVRxt |
1 |
2 |
AVRrc |
1 |
2 |
i) If the condition is false.
ii) If the condition is true.
Syntax: |
Operation: |
Operands: |
Program Counter: |
Opcode |
Comment |
Stack |
BRBS s,k |
If SREG(s) == 1 then PC = PC + k + 1, else PC = PC + 1 |
0 <= s <= 7, -64 <= k <= +63 |
PC = PC + k + 1 PC = PC + 1, if the condition is false |
111100kkkkkkksss |
Conditional relative branch. Tests a single bit in SREG and branches relatively to the PC if the bit is set. This instruction branches relatively to the PC in either direction (PC - 63 <= destination <= PC + 64). Parameter k is the offset from the PC and is represented in two's complement form.
I |
– |
||
T |
– |
||
H |
– |
||
S |
– |
||
V |
– |
||
N |
– |
||
Z |
– |
||
C |
– |
bst r0,3 ; Load T bit with bit 3 of r0 brbs 6,bitset ; Branch T bit was set ... bitset: nop ; Branch destination (do nothing)
1 (2 bytes)
Name |
Cycles i |
ii |
AVRe |
1 |
2 |
AVRxm |
1 |
2 |
AVRxt |
1 |
2 |
AVRrc |
1 |
2 |
i) If the condition is false.
ii) If the condition is true.
Syntax: |
Operation: |
Operands: |
Program Counter: |
Opcode |
Comment |
Stack |
BRCC k |
If C == 0 then PC = PC + k + 1, else PC = PC + 1 |
-64 <= k <= +63 |
PC = PC + k + 1 PC = PC + 1, if the condition is false |
111101kkkkkkk000 |
Conditional relative branch. Tests the Carry (C) flag and branches relatively to the PC if C is cleared. This instruction branches relatively to the PC in either direction (PC - 63 <= destination <= PC + 64). Parameter k is the offset from the PC and is represented in two's complement form. (Equivalent to instruction BRBC 0,k.)
I |
– |
||
T |
– |
||
H |
– |
||
S |
– |
||
V |
– |
||
N |
– |
||
Z |
– |
||
C |
– |
add r22,r23 ; Add r23 to r22 brcc nocarry ; Branch if carry cleared ... nocarry: nop ; Branch destination (do nothing)
1 (2 bytes)
Name |
Cycles i |
ii |
AVRe |
1 |
2 |
AVRxm |
1 |
2 |
AVRxt |
1 |
2 |
AVRrc |
1 |
2 |
i) If the condition is false.
ii) If the condition is true.
Syntax: |
Operation: |
Operands: |
Program Counter: |
Opcode |
Comment |
Stack |
BRCS k |
If C == 1 then PC = PC + k + 1, else PC = PC + 1 |
-64 <= k <= +63 |
PC = PC + k + 1 PC = PC + 1, if the condition is false |
111100kkkkkkk000 |
Conditional relative branch. Tests the Carry (C) flag and branches relatively to the PC if C is set. This instruction branches relatively to the PC in either direction (PC - 63 <= destination <= PC + 64). Parameter k is the offset from the PC and is represented in two's complement form. (Equivalent to instruction BRBS 0,k.)
I |
– |
||
T |
– |
||
H |
– |
||
S |
– |
||
V |
– |
||
N |
– |
||
Z |
– |
||
C |
– |
cpi r26,0x56 ; Compare r26 with 0x56 brcs carry ; Branch if carry set ... carry: nop ; Branch destination (do nothing)
1 (2 bytes)
Name |
Cycles i |
ii |
AVRe |
1 |
2 |
AVRxm |
1 |
2 |
AVRxt |
1 |
2 |
AVRrc |
1 |
2 |
i) If the condition is false.
ii) If the condition is true.
Syntax: |
Operation: |
Operands: |
Program Counter: |
Opcode |
Comment |
Stack |
BREAK |
On-chip Debug system breakpoint instruction. |
None |
PC = PC + 1 |
1001010110011000 |
The BREAK instruction is used by the On-chip Debug system and not used by the application software. When the BREAK instruction is executed, the AVR CPU is set in the Stopped state. This gives the On-chip Debugger access to internal resources.
If the device is locked, or the on-chip debug system is not enabled, the CPU will treat the BREAK instruction as a NOP and will not enter the Stopped state.
This instruction is not available on all devices. Refer to Appendix A.
I |
– |
||
T |
– |
||
H |
– |
||
S |
– |
||
V |
– |
||
N |
– |
||
Z |
– |
||
C |
– |
1 (2 bytes)
Name |
Cycles |
AVRe |
1 |
AVRxm |
1 |
AVRxt |
1 |
AVRrc |
1 |
Syntax: |
Operation: |
Operands: |
Program Counter: |
Opcode |
Comment |
Stack |
BREQ k |
If Rd == Rr (Z == 1) then PC = PC + k + 1, else PC = PC + 1 |
-64 <= k <= +63 |
PC = PC + k + 1 PC = PC + 1, if the condition is false |
111100kkkkkkk001 |
Conditional relative branch. Tests the Zero (Z) flag and branches relatively to the PC if Z is set. If the instruction is executed immediately after any of the instructions CP, CPI, SUB, or SUBI, the branch will occur only if the unsigned or signed binary number represented in Rd was equal to the unsigned or signed binary number represented in Rr. This instruction branches relatively to the PC in either direction (PC - 63 <= destination <= PC + 64). Parameter k is the offset from the PC and is represented in two's complement form. (Equivalent to instruction BRBS 1,k.)
I |
– |
||
T |
– |
||
H |
– |
||
S |
– |
||
V |
– |
||
N |
– |
||
Z |
– |
||
C |
– |
cp r1,r0 ; Compare registers r1 and r0 breq equal ; Branch if registers equal ... equal: nop ; Branch destination (do nothing)
1 (2 bytes)
Name |
Cycles i |
ii |
AVRe |
1 |
2 |
AVRxm |
1 |
2 |
AVRxt |
1 |
2 |
AVRrc |
1 |
2 |
i) If the condition is false.
ii) If the condition is true.
Syntax: |
Operation: |
Operands: |
Program Counter: |
Opcode |
Comment |
Stack |
BRGE k |
If Rd >= Rr (S == 0) then PC = PC + k + 1, else PC = PC + 1 |
-64 <= k <= +63 |
PC = PC + k + 1 PC = PC + 1, if the condition is false |
111101kkkkkkk100 |
Conditional relative branch. Tests the Sign (S) flag and branches relatively to the PC if S is cleared. If the instruction is executed immediately after any of the instructions CP, CPI, SUB, or SUBI, the branch will occur only if the signed binary number represented in Rd was greater than or equal to the signed binary number represented in Rr. This instruction branches relatively to the PC in either direction (PC - 63 <= destination <= PC + 64). Parameter k is the offset from the PC and is represented in two's complement form. (Equivalent to instruction BRBC 4,k.)
I |
– |
||
T |
– |
||
H |
– |
||
S |
– |
||
V |
– |
||
N |
– |
||
Z |
– |
||
C |
– |
cp r11,r12 ; Compare registers r11 and r12 brge greateq ; Branch if r11 ≥ r12 (signed) ... greateq: nop ; Branch destination (do nothing)
1 (2 bytes)
Name |
Cycles i |
ii |
AVRe |
1 |
2 |
AVRxm |
1 |
2 |
AVRxt |
1 |
2 |
AVRrc |
1 |
2 |
i) If the condition is false.
ii) If the condition is true.
Syntax: |
Operation: |
Operands: |
Program Counter: |
Opcode |
Comment |
Stack |
BRHC k |
If H == 0 then PC = PC + k + 1, else PC = PC + 1 |
-64 <= k <= +63 |
PC = PC + k + 1 PC = PC + 1, if the condition is false |
111101kkkkkkk101 |
Conditional relative branch. Tests the Half Carry (H) flag and branches relatively to the PC if H is cleared. This instruction branches relatively to the PC in either direction (PC - 63 <= destination <= PC + 64). Parameter k is the offset from the PC and is represented in two's complement form. (Equivalent to instruction BRBC 5,k.)
I |
– |
||
T |
– |
||
H |
– |
||
S |
– |
||
V |
– |
||
N |
– |
||
Z |
– |
||
C |
– |
brhc hclear ; Branch if Half Carry flag cleared ... hclear: nop ; Branch destination (do nothing)
1 (2 bytes)
Name |
Cycles i |
ii |
AVRe |
1 |
2 |
AVRxm |
1 |
2 |
AVRxt |
1 |
2 |
AVRrc |
1 |
2 |
i) If the condition is false.
ii) If the condition is true.
Syntax: |
Operation: |
Operands: |
Program Counter: |
Opcode |
Comment |
Stack |
BRHS k |
If H == 1 then PC = PC + k + 1, else PC = PC + 1 |
-64 <= k <= +63 |
PC = PC + k + 1 PC = PC + 1, if the condition is false |
111100kkkkkkk101 |
Conditional relative branch. Tests the Half Carry (H) flag and branches relatively to the PC if H is set. This instruction branches relatively to the PC in either direction (PC - 63 <= destination <= PC + 64). Parameter k is the offset from the PC and is represented in two's complement form. (Equivalent to instruction BRBS 5,k.)
I |
– |
||
T |
– |
||
H |
– |
||
S |
– |
||
V |
– |
||
N |
– |
||
Z |
– |
||
C |
– |
brhs hset ; Branch if Half Carry flag set ... hset: nop ; Branch destination (do nothing)
1 (2 bytes)
Name |
Cycles i |
ii |
AVRe |
1 |
2 |
AVRxm |
1 |
2 |
AVRxt |
1 |
2 |
AVRrc |
1 |
2 |
i) If the condition is false.
ii) If the condition is true.
Syntax: |
Operation: |
Operands: |
Program Counter: |
Opcode |
Comment |
Stack |
BRID k |
If I == 0 then PC = PC + k + 1, else PC = PC + 1 |
-64 <= k <= +63 |
PC = PC + k + 1 PC = PC + 1, if the condition is false |
111101kkkkkkk111 |
Conditional relative branch. Tests the Global Interrupt Enable (I) bit and branches relatively to the PC if I is cleared. This instruction branches relatively to the PC in either direction (PC - 63 <= destination <= PC + 64). Parameter k is the offset from the PC and is represented in two's complement form. (Equivalent to instruction BRBC 7,k.)
I |
– |
||
T |
– |
||
H |
– |
||
S |
– |
||
V |
– |
||
N |
– |
||
Z |
– |
||
C |
– |
brid intdis ; Branch if interrupt disabled ... intdis: nop ; Branch destination (do nothing)
1 (2 bytes)
Name |
Cycles i |
ii |
AVRe |
1 |
2 |
AVRxm |
1 |
2 |
AVRxt |
1 |
2 |
AVRrc |
1 |
2 |
i) If the condition is false.
ii) If the condition is true.
Syntax: |
Operation: |
Operands: |
Program Counter: |
Opcode |
Comment |
Stack |
BRIE k |
If I == 1 then PC = PC + k + 1, else PC = PC + 1 |
-64 <= k <= +63 |
PC = PC + k + 1 PC = PC + 1, if the condition is false |
111100kkkkkkk111 |
Conditional relative branch. Tests the Global Interrupt Enable (I) bit and branches relatively to the PC if I is set. This instruction branches relatively to the PC in either direction (PC - 63 <= destination <= PC + 64). Parameter k is the offset from the PC and is represented in two's complement form. (Equivalent to instruction BRBS 7,k.)
I |
– |
||
T |
– |
||
H |
– |
||
S |
– |
||
V |
– |
||
N |
– |
||
Z |
– |
||
C |
– |
brie inten ; Branch if interrupt enabled ... inten: nop ; Branch destination (do nothing)
1 (2 bytes)
Name |
Cycles i |
ii |
AVRe |
1 |
2 |
AVRxm |
1 |
2 |
AVRxt |
1 |
2 |
AVRrc |
1 |
2 |
i) If the condition is false.
ii) If the condition is true.
Syntax: |
Operation: |
Operands: |
Program Counter: |
Opcode |
Comment |
Stack |
BRLO k |
If Rd < Rr (C == 1) then PC = PC + k + 1, else PC = PC + 1 |
-64 <= k <= +63 |
PC = PC + k + 1 PC = PC + 1, if the condition is false |
111100kkkkkkk000 |
Conditional relative branch. Tests the Carry (C) flag and branches relatively to the PC if C is set. If the instruction is executed immediately after any of the instructions CP, CPI, SUB, or SUBI, the branch will occur only if the unsigned binary number represented in Rd was smaller than the unsigned binary number represented in Rr. This instruction branches relatively to the PC in either direction (PC - 63 <= destination <= PC + 64). Parameter k is the offset from the PC and is represented in two's complement form. (Equivalent to instruction BRBS 0,k.)
I |
– |
||
T |
– |
||
H |
– |
||
S |
– |
||
V |
– |
||
N |
– |
||
Z |
– |
||
C |
– |
eor r19,r19 ; Clear r19 loop: inc r19 ; Increase r19 ... cpi r19,0x10 ; Compare r19 with 0x10 brlo loop ; Branch if r19 < 0x10 (unsigned) nop ; Exit from loop (do nothing)
1 (2 bytes)
Name |
Cycles i |
ii |
AVRe |
1 |
2 |
AVRxm |
1 |
2 |
AVRxt |
1 |
2 |
AVRrc |
1 |
2 |
i) If the condition is false.
ii) If the condition is true.
Syntax: |
Operation: |
Operands: |
Program Counter: |
Opcode |
Comment |
Stack |
BRLT k |
If Rd < Rr (S == 1) then PC = PC + k + 1, else PC = PC + 1 |
-64 <= k <= +63 |
PC = PC + k + 1 PC = PC + 1, if the condition is false |
111100kkkkkkk100 |
Conditional relative branch. Tests the Sign (S) flag and branches relatively to the PC if S is set. If the instruction is executed immediately after any of the instructions CP, CPI, SUB, or SUBI, the branch will occur only if the signed binary number represented in Rd was less than the signed binary number represented in Rr. This instruction branches relatively to the PC in either direction (PC - 63 <= destination <= PC + 64). Parameter k is the offset from the PC and is represented in two's complement form. (Equivalent to instruction BRBS 4,k.)
I |
– |
||
T |
– |
||
H |
– |
||
S |
– |
||
V |
– |
||
N |
– |
||
Z |
– |
||
C |
– |
cp r16,r1 ; Compare r16 to r1 brlt less ; Branch if r16 < r1 (signed) ... less: nop ; Branch destination (do nothing)
1 (2 bytes)
Name |
Cycles i |
ii |
AVRe |
1 |
2 |
AVRxm |
1 |
2 |
AVRxt |
1 |
2 |
AVRrc |
1 |
2 |
i) If the condition is false.
ii) If the condition is true.
Syntax: |
Operation: |
Operands: |
Program Counter: |
Opcode |
Comment |
Stack |
BRMI k |
If N == 1 then PC = PC + k + 1, else PC = PC + 1 |
-64 <= k <= +63 |
PC = PC + k + 1 PC = PC + 1, if the condition is false |
111100kkkkkkk010 |
Conditional relative branch. Tests the Negative (N) flag and branches relatively to the PC if N is set. This instruction branches relatively to the PC in either direction (PC - 63 <= destination <= PC + 64). Parameter k is the offset from the PC and is represented in two's complement form. (Equivalent to instruction BRBS 2,k.)
I |
– |
||
T |
– |
||
H |
– |
||
S |
– |
||
V |
– |
||
N |
– |
||
Z |
– |
||
C |
– |
subi r18,4 ; Subtract 4 from r18 brmi negative ; Branch if result negative ... negative: nop ; Branch destination (do nothing)
1 (2 bytes)
Name |
Cycles i |
ii |
AVRe |
1 |
2 |
AVRxm |
1 |
2 |
AVRxt |
1 |
2 |
AVRrc |
1 |
2 |
i) If the condition is false.
ii) If the condition is true.
Syntax: |
Operation: |
Operands: |
Program Counter: |
Opcode |
Comment |
Stack |
BRNE k |
If Rd != Rr (Z == 0) then PC = PC + k + 1, else PC = PC + 1 |
-64 <= k <= +63 |
PC = PC + k + 1 PC = PC + 1, if the condition is false |
111101kkkkkkk001 |
Conditional relative branch. Tests the Zero (Z) flag and branches relatively to the PC if Z is cleared. If the instruction is executed immediately after any of the instructions CP, CPI, SUB, or SUBI, the branch will occur only if the unsigned or signed binary number represented in Rd was not equal to the unsigned or signed binary number represented in Rr. This instruction branches relatively to the PC in either direction (PC - 63 <= destination <= PC + 64). Parameter k is the offset from the PC and is represented in two's complement form. (Equivalent to instruction BRBC 1,k.)
I |
– |
||
T |
– |
||
H |
– |
||
S |
– |
||
V |
– |
||
N |
– |
||
Z |
– |
||
C |
– |
eor r27,r27 ; Clear r27 loop: inc r27 ; Increase r27 ... cpi r27,5 ; Compare r27 to 5 brne loop ; Branch if r27<>5 nop ; Loop exit (do nothing)
1 (2 bytes)
Name |
Cycles i |
ii |
AVRe |
1 |
2 |
AVRxm |
1 |
2 |
AVRxt |
1 |
2 |
AVRrc |
1 |
2 |
i) If the condition is false.
ii) If the condition is true.
Syntax: |
Operation: |
Operands: |
Program Counter: |
Opcode |
Comment |
Stack |
BRPL k |
If N == 0 then PC = PC + k + 1, else PC = PC + 1 |
-64 <= k <= +63 |
PC = PC + k + 1 PC = PC + 1, if the condition is false |
111101kkkkkkk010 |
Conditional relative branch. Tests the Negative (N) flag and branches relatively to the PC if N is cleared. This instruction branches relatively to the PC in either direction (PC - 63 <= destination <= PC + 64). Parameter k is the offset from the PC and is represented in two's complement form. (Equivalent to instruction BRBC 2,k.)
I |
– |
||
T |
– |
||
H |
– |
||
S |
– |
||
V |
– |
||
N |
– |
||
Z |
– |
||
C |
– |
subi r26,0x50 ; Subtract 0x50 from r26 brpl positive ; Branch if r26 positive ... positive: nop ; Branch destination (do nothing)
1 (2 bytes)
Name |
Cycles i |
ii |
AVRe |
1 |
2 |
AVRxm |
1 |
2 |
AVRxt |
1 |
2 |
AVRrc |
1 |
2 |
i) If the condition is false.
ii) If the condition is true.
Syntax: |
Operation: |
Operands: |
Program Counter: |
Opcode |
Comment |
Stack |
BRSH k |
If Rd >=Rr (C == 0) then PC = PC + k + 1, else PC = PC + 1 |
-64 <= k <= +63 |
PC = PC + k + 1 PC = PC + 1, if the condition is false |
111101kkkkkkk000 |
Conditional relative branch. Tests the Carry (C) flag and branches relatively to the PC if C is cleared. If the instruction is executed immediately after execution of any of the instructions CP, CPI, SUB, or SUBI, the branch will occur only if the unsigned binary number represented in Rd was greater than or equal to the unsigned binary number represented in Rr. This instruction branches relatively to the PC in either direction (PC - 63 <= destination <= PC + 64). Parameter k is the offset from the PC and is represented in two's complement form. (Equivalent to instruction BRBC 0,k.)
I |
– |
||
T |
– |
||
H |
– |
||
S |
– |
||
V |
– |
||
N |
– |
||
Z |
– |
||
C |
– |
subi r19,4 ; Subtract 4 from r19 brsh highsm ; Branch if r19 >= 4 (unsigned) ... highsm: nop ; Branch destination (do nothing)
1 (2 bytes)
Name |
Cycles i |
ii |
AVRe |
1 |
2 |
AVRxm |
1 |
2 |
AVRxt |
1 |
2 |
AVRrc |
1 |
2 |
i) If the condition is false.
ii) If the condition is true.
Syntax: |
Operation: |
Operands: |
Program Counter: |
Opcode |
Comment |
Stack |
BRTC k |
If T == 0 then PC = PC + k + 1, else PC = PC + 1 |
-64 <= k <= +63 |
PC = PC + k + 1 PC = PC + 1, if the condition is false |
111101kkkkkkk110 |
Conditional relative branch. Tests the T bit and branches relatively to the PC if T is cleared. This instruction branches relatively to the PC in either direction (PC - 63 <= destination <= PC + 64). Parameter k is the offset from the PC and is represented in two's complement form. (Equivalent to instruction BRBC 6,k.)
I |
– |
||
T |
– |
||
H |
– |
||
S |
– |
||
V |
– |
||
N |
– |
||
Z |
– |
||
C |
– |
bst r3,5 ; Store bit 5 of r3 in T bit brtc tclear ; Branch if this bit was cleared ... tclear: nop ; Branch destination (do nothing)
1 (2 bytes)
Name |
Cycles i |
ii |
AVRe |
1 |
2 |
AVRxm |
1 |
2 |
AVRxt |
1 |
2 |
AVRrc |
1 |
2 |
i) If the condition is false.
ii) If the condition is true.
Syntax: |
Operation: |
Operands: |
Program Counter: |
Opcode |
Comment |
Stack |
BRTS k |
If T == 1 then PC = PC + k + 1, else PC = PC + 1 |
-64 <= k <= +63 |
PC = PC + k + 1 PC = PC + 1, if the condition is false |
111100kkkkkkk110 |
Conditional relative branch. Tests the T bit and branches relatively to the PC if T is set. This instruction branches relatively to the PC in either direction (PC - 63 <= destination <= PC + 64). Parameter k is the offset from the PC and is represented in two's complement form. (Equivalent to instruction BRBS 6,k.)
I |
– |
||
T |
– |
||
H |
– |
||
S |
– |
||
V |
– |
||
N |
– |
||
Z |
– |
||
C |
– |
bst r3,5 ; Store bit 5 of r3 in T bit brts tset ; Branch if this bit was set ... tset: nop ; Branch destination (do nothing)
1 (2 bytes)
Name |
Cycles i |
ii |
AVRe |
1 |
2 |
AVRxm |
1 |
2 |
AVRxt |
1 |
2 |
AVRrc |
1 |
2 |
i) If the condition is false.
ii) If the condition is true.
Syntax: |
Operation: |
Operands: |
Program Counter: |
Opcode |
Comment |
Stack |
BRVC k |
If V == 0 then PC = PC + k + 1, else PC = PC + 1 |
-64 <= k <= +63 |
PC = PC + k + 1 PC = PC + 1, if the condition is false |
111101kkkkkkk011 |
Conditional relative branch. Tests the Overflow (V) flag and branches relatively to the PC if V is cleared. This instruction branches relatively to the PC in either direction (PC - 63 <= destination <= PC + 64). Parameter k is the offset from the PC and is represented in two's complement form. (Equivalent to instruction BRBC 3,k.)
I |
– |
||
T |
– |
||
H |
– |
||
S |
– |
||
V |
– |
||
N |
– |
||
Z |
– |
||
C |
– |
add r3,r4 ; Add r4 to r3 brvc noover ; Branch if no overflow ... noover: nop ; Branch destination (do nothing)
1 (2 bytes)
i) If the condition is false.
ii) If the condition is true.
Name |
Cycles i |
ii |
AVRe |
1 |
2 |
AVRxm |
1 |
2 |
AVRxt |
1 |
2 |
AVRrc |
1 |
2 |
Syntax: |
Operation: |
Operands: |
Program Counter: |
Opcode |
Comment |
Stack |
BRVS k |
If V == 1 then PC = PC + k + 1, else PC = PC + 1 |
-64 <= k <= +63 |
PC = PC + k + 1 PC = PC + 1, if the condition is false |
111100kkkkkkk011 |
Conditional relative branch. Tests the Overflow (V) flag and branches relatively to the PC if V is set. This instruction branches relatively to the PC in either direction (PC - 63 <= destination <= PC + 64). Parameter k is the offset from the PC and is represented in two's complement form. (Equivalent to instruction BRBS 3,k.)
I |
– |
||
T |
– |
||
H |
– |
||
S |
– |
||
V |
– |
||
N |
– |
||
Z |
– |
||
C |
– |
add r3,r4 ; Add r4 to r3 brvs overfl ; Branch if overflow ... overfl: nop ; Branch destination (do nothing)
1 (2 bytes)
Name |
Cycles i |
ii |
AVRxt |
1 |
2 |
AVRrc |
1 |
2 |
AVRe |
1 |
2 |
AVRxm |
1 |
2 |
i) If the condition is false.
ii) If the condition is true.
Syntax: |
Operation: |
Operands: |
Program Counter: |
Opcode |
Comment |
Stack |
BSET s |
SREG(s) = 1 |
0 <= s <= 7 |
PC = PC + 1 |
100101000sss1000 |
Sets a single flag or bit in SREG.
I |
⇔ |
If (s == 7) then I = 1, else unchanged. |
|
T |
⇔ |
If (s == 6) then T = 1, else unchanged. |
|
H |
⇔ |
If (s == 5) then H = 1, else unchanged. |
|
S |
⇔ |
If (s == 4) then S = 1, else unchanged. |
|
V |
⇔ |
If (s == 3) then V = 1, else unchanged. |
|
N |
⇔ |
If (s == 2) then N = 1, else unchanged. |
|
Z |
⇔ |
If (s == 1) then Z = 1, else unchanged. |
|
C |
⇔ |
If (s == 0) then C = 1, else unchanged. |
bset 6 ; Set T bit bset 7 ; Enable interrupt
1 (2 bytes)
Name |
Cycles |
AVRe |
1 |
AVRxm |
1 |
AVRxt |
1 |
AVRrc |
1 |
Syntax: |
Operation: |
Operands: |
Program Counter: |
Opcode |
Comment |
Stack |
BST Rd,b |
T = Rd(b) |
0 <= d <= 31, 0 <= b <= 7 |
PC = PC + 1 |
1111101ddddd0bbb |
Stores bit b from Rd to the T bit in SREG (Status Register).
I |
– |
||
T |
⇔ |
‘0' if bit b in Rd is cleared. Set to ‘1' otherwise. |
|
H |
– |
||
S |
– |
||
V |
– |
||
N |
– |
||
Z |
– |
||
C |
– |
; Copy bit bst r1,2 ; Store bit 2 of r1 in T bit bld r0,4 ; Load T into bit 4 of r0
1 (2 bytes)
Name |
Cycles |
AVRe |
1 |
AVRxm |
1 |
AVRxt |
1 |
AVRrc |
1 |
Syntax: |
Operation: |
Operands: |
Program Counter: |
Opcode |
Comment |
Stack: |
CALL k |
PC = k Devices with 16-bit PC, 128 KB program memory maximum. |
0 <= k < 64K |
PC = k |
1001010kkkkk111kkkkkkkkkkkkkkkkk |
STACK = PC+2 SP = SP-2, (2 bytes, 16 bits) | |
CALL k |
PC = k Devices with 22-bit PC, 8 MB program memory maximum. |
0 <= k < 4M |
PC = k |
1001010kkkkk111kkkkkkkkkkkkkkkkk |
STACK = PC+2 SP = SP-3 (3 bytes, 22 bits) |
Calls to a subroutine within the entire program memory. The return address (to the instruction after the CALL) will be stored on the Stack. (See also RCALL.) The Stack Pointer uses a post-decrement scheme during CALL.
This instruction is not available on all devices. Refer to Appendix A.
I |
– |
||
T |
– |
||
H |
– |
||
S |
– |
||
V |
– |
||
N |
– |
||
Z |
– |
||
C |
– |
mov r16,r0 ; Copy r0 to r16 call check ; Call subroutine nop ; Continue (do nothing) ... check: cpi r16,0x42 ; Check if r16 has a special value breq error ; Branch if equal ret ; Return from subroutine ... error: rjmp error ; Infinite loop
2 (4 bytes)
Name |
Cycles 16-bit PC |
22-bit PC |
AVRxt |
3 |
4 |
AVRrc |
N/A |
N/A |
AVRe |
4(1) |
5(1) |
AVRxm |
3(1) |
4(1) |
Note:
1.
Cycle times for data memory access assume internal RAM access and are not valid for accessing external RAM.
Syntax: |
Operation: |
Operands: |
Program Counter: |
Opcode |
Comment |
Stack |
CBI A,b |
I/O(A,b) = 0 |
0 <= A <= 31, 0 <= b <= 7 |
PC = PC + 1 |
10011000AAAAAbbb |
Clears a specified bit in an I/O Register. This instruction operates on the lower 32 I/O Registers - addresses 0-31.
I |
– |
||
T |
– |
||
H |
– |
||
S |
– |
||
V |
– |
||
N |
– |
||
Z |
– |
||
C |
– |
cbi 0x12,7 ; Clear bit 7 at address 0x12
1 (2 bytes)
Name |
Cycles |
AVRe |
2 |
AVRxm |
1 |
AVRxt |
1 |
AVRrc |
1 |
Syntax: |
Operation: |
Operands: |
Program Counter: |
Opcode |
Comment |
Stack |
CBR Rd,K |
Rd = Rd AND (0xFF - K) |
16 <= d <= 31, 0 <= K <= 255 |
PC = PC + 1 |
16-bit Opcode: (see ANDI with K complemented) |
Clears the specified bits in register Rd. Performs the logical AND between the contents of register Rd and the complement of the constant mask K. The result will be placed in register Rd. (Equivalent to ANDI Rd,(0xFF - K).)
I |
– |
||
T |
– |
||
H |
– |
||
S |
⇔ |
N XOR V, for signed tests. |
|
V |
0 |
0 |
Cleared. |
N |
⇔ |
R7 |
Set if MSB of the result is set; cleared otherwise. |
Z |
⇔ |
~R7 AND ~R6 AND ~R5 AND ~R4 AND ~R3 AND ~R2 AND ~R1 AND ~R0 |
Set if the result is 0x00; cleared otherwise. |
C |
– |
||
R (Result) |
R (Result) equals Rd after the operation. |
cbr r16,0xF0 ; Clear upper nibble of r16 cbr r18,1 ; Clear bit 0 in r18
1 (2 bytes)
Name |
Cycles |
AVRe |
1 |
AVRxm |
1 |
AVRxt |
1 |
AVRrc |
1 |
Syntax: |
Operation: |
Operands: |
Program Counter: |
Opcode |
Comment |
Stack |
CLC |
C = 0 |
None |
PC = PC + 1 |
1001010010001000 |
Clears the Carry (C) flag in SREG (Status Register). (Equivalent to instruction BCLR 0.)
I |
– |
||
T |
– |
||
H |
– |
||
S |
– |
||
V |
– |
||
N |
– |
||
Z |
– |
||
C |
0 |
0 |
Carry flag cleared. |
add r0,r0 ; Add r0 to itself clc ; Clear Carry flag
1 (2 bytes)
Name |
Cycles |
AVRe |
1 |
AVRxm |
1 |
AVRxt |
1 |
AVRrc |
1 |
Syntax: |
Operation: |
Operands: |
Program Counter: |
Opcode |
Comment |
Stack |
CLH |
H = 0 |
None |
PC = PC + 1 |
1001010011011000 |
Clears the Half Carry (H) flag in SREG (Status Register). (Equivalent to instruction BCLR 5.)
I |
– |
||
T |
– |
||
H |
0 |
0 |
Half Carry flag cleared. |
S |
– |
||
V |
– |
||
N |
– |
||
Z |
– |
||
C |
– |
clh ; Clear the Half Carry flag
1 (2 bytes)
Name |
Cycles |
AVRe |
1 |
AVRxm |
1 |
AVRxt |
1 |
AVRrc |
1 |
Syntax: |
Operation: |
Operands: |
Program Counter: |
Opcode |
Comment |
Stack |
CLI |
I = 0 |
None |
PC = PC + 1 |
1001010011111000 |
Clears the Global Interrupt Enable (I) bit in SREG (Status Register). The interrupts will be immediately disabled. No interrupt will be executed after the CLI instruction, even if it occurs simultaneously with the CLI instruction. (Equivalent to instruction BCLR 7.)
I |
0 |
0 |
Global Interrupt Enable bit cleared. |
T |
– |
||
H |
– |
||
S |
– |
||
V |
– |
||
N |
– |
||
Z |
– |
||
C |
– |
in temp, SREG ; Store SREG value (temp must be defined by user) cli ; Disable interrupts during timed sequence sbi EECR, EEMWE ; Start EEPROM write sbi EECR, EEWE out SREG, temp ; Restore SREG value (I-flag)
1 (2 bytes)
Name |
Cycles |
AVRe |
1 |
AVRxm |
1 |
AVRxt |
1 |
AVRrc |
1 |
Syntax: |
Operation: |
Operands: |
Program Counter: |
Opcode |
Comment |
Stack |
CLN |
N = 0 |
None |
PC = PC + 1 |
1001010010101000 |
Clears the Negative (N) flag in SREG (Status Register). (Equivalent to instruction BCLR 2.)
I |
– |
||
T |
– |
||
H |
– |
||
S |
– |
||
V |
– |
||
N |
0 |
0 |
Negative flag cleared. |
Z |
– |
||
C |
– |
add r2,r3 ; Add r3 to r2 cln ; Clear Negative flag
1 (2 bytes)
Name |
Cycles |
AVRe |
1 |
AVRxm |
1 |
AVRxt |
1 |
AVRrc |
1 |
Syntax: |
Operation: |
Operands: |
Program Counter: |
Opcode |
Comment |
Stack |
CLR Rd |
Rd = Rd XOR Rd |
0 <= d <= 31 |
PC = PC + 1 |
001001dddddddddd |
Clears a register. This instruction performs an Exclusive OR between a register and itself. This will clear all bits in the register. (Equivalent to instruction EOR Rd,Rd.)
I |
– |
||
T |
– |
||
H |
– |
||
S |
0 |
0 |
Cleared. |
V |
0 |
0 |
Cleared. |
N |
0 |
0 |
Cleared. |
Z |
1 |
1 |
Set. |
C |
– |
||
R (Result) |
R (Result) equals Rd after the operation. |
clr r18 ; clear r18 loop: inc r18 ; increase r18 ... cpi r18,0x50 ; Compare r18 to 0x50 brne loop
1 (2 bytes)
Name |
Cycles |
AVRe |
1 |
AVRxm |
1 |
AVRxt |
1 |
AVRrc |
1 |
Syntax: |
Operation: |
Operands: |
Program Counter: |
Opcode |
Comment |
Stack |
CLS |
S = 0 |
None |
PC = PC + 1 |
1001010011001000 |
Clears the Sign (S) flag in SREG (Status Register). (Equivalent to instruction BCLR 4.)
I |
– |
||
T |
– |
||
H |
– |
||
S |
0 |
0 |
Sign flag cleared. |
V |
– |
||
N |
– |
||
Z |
– |
||
C |
– |
add r2,r3 ; Add r3 to r2 cls ; Clear Sign flag
1 (2 bytes)
Name |
Cycles |
AVRe |
1 |
AVRxm |
1 |
AVRxt |
1 |
AVRrc |
1 |
Syntax: |
Operation: |
Operands: |
Program Counter: |
Opcode |
Comment |
Stack |
CLT |
T = 0 |
None |
PC = PC + 1 |
1001010011101000 |
Clears the T bit in SREG (Status Register). (Equivalent to instruction BCLR 6.)
I |
– |
||
T |
0 |
0 |
T bit cleared. |
H |
– |
||
S |
– |
||
V |
– |
||
N |
– |
||
Z |
– |
||
C |
– |
clt ; Clear T bit
1 (2 bytes)
Name |
Cycles |
AVRe |
1 |
AVRxm |
1 |
AVRxt |
1 |
AVRrc |
1 |
Syntax: |
Operation: |
Operands: |
Program Counter: |
Opcode |
Comment |
Stack |
CLV |
V = 0 |
None |
PC = PC + 1 |
1001010010111000 |
Clears the Overflow (V) flag in SREG (Status Register). (Equivalent to instruction BCLR 3.)
I |
– |
||
T |
– |
||
H |
– |
||
S |
– |
||
V |
0 |
0 |
Overflow flag cleared. |
N |
– |
||
Z |
– |
||
C |
– |
add r2,r3 ; Add r3 to r2 clv ; Clear Overflow flag
1 (2 bytes)
Name |
Cycles |
AVRe |
1 |
AVRxm |
1 |
AVRxt |
1 |
AVRrc |
1 |
Syntax: |
Operation: |
Operands: |
Program Counter: |
Opcode |
Comment |
Stack |
CLZ |
Z = 0 |
None |
PC = PC + 1 |
1001010010011000 |
Clears the Zero (Z) flag in SREG (Status Register). (Equivalent to instruction BCLR 1.)
I |
– |
||
T |
– |
||
H |
– |
||
S |
– |
||
V |
– |
||
N |
– |
||
Z |
0 |
0 |
Zero flag cleared. |
C |
– |
add r2,r3 ; Add r3 to r2 clz ; Clear zero
1 (2 bytes)
Name |
Cycles |
AVRe |
1 |
AVRxm |
1 |
AVRxt |
1 |
AVRrc |
1 |
Syntax: |
Operation: |
Operands: |
Program Counter: |
Opcode |
Comment |
Stack |
COM Rd |
Rd = 0xFF - Rd |
0 <= d <= 31 |
PC = PC + 1 |
1001010ddddd0000 |
This instruction performs a One's Complement of register Rd.
I |
– |
||
T |
– |
||
H |
– |
||
S |
⇔ |
N XOR V, for signed tests. |
|
V |
0 |
0 |
Cleared. |
N |
⇔ |
R7 |
Set if MSB of the result is set; cleared otherwise. |
Z |
⇔ |
~R7 AND ~R6 AND ~R5 AND ~R4 AND ~R3 AND ~R2 AND ~R1 AND ~R0 |
Set if the result is 0x00; cleared otherwise. |
C |
1 |
1 |
Set. |
R (Result) |
R (Result) equals Rd after the operation. |
com r4 ; Take one’s complement of r4 breq zero ; Branch if zero ... zero: nop ; Branch destination (do nothing)
1 (2 bytes)
Name |
Cycles |
AVRe |
1 |
AVRxm |
1 |
AVRxt |
1 |
AVRrc |
1 |
Syntax: |
Operation: |
Operands: |
Program Counter: |
Opcode |
Comment |
Stack |
CPC Rd,Rr |
Rd - Rr - C |
0 <= d <= 31, 0 <= r <= 31 |
PC = PC + 1 |
000001rdddddrrrr |
This instruction performs a compare between two registers Rd and Rr and also takes into account the previous carry. None of the registers are changed. All conditional branches can be used after this instruction.
I |
– |
||
T |
– |
||
H |
⇔ |
~Rd3 AND Rr3 OR Rr3 AND R3 OR R3 AND ~Rd3 |
Set if there was a borrow from bit 3; cleared otherwise. |
S |
⇔ |
N XOR V, for signed tests. |
|
V |
⇔ |
Rd7 AND ~Rr7 AND ~R7 OR ~Rd7 AND Rr7 AND R7 |
Set if two's complement overflow resulted from the operation; cleared otherwise. |
N |
⇔ |
R7 |
Set if MSB of the result is set; cleared otherwise. |
Z |
⇔ |
~R7 AND ~R6 AND ~R5 AND ~R4 AND ~R3 AND ~R2 AND ~R1 AND ~R0 AND Z |
The previous value remains unchanged when the result is zero; cleared otherwise. |
C |
⇔ |
~Rd7 AND Rr7 OR Rr7 AND R7 OR R7 AND ~Rd7 |
Set if the absolute value of the contents of Rr plus previous carry is larger than the absolute value of Rd; cleared otherwise. |
R (Result) |
R (Result) after the operation. |
; Compare r3:r2 with r1:r0 cp r2,r0 ; Compare low byte cpc r3,r1 ; Compare high byte brne noteq ; Branch if not equal ... noteq: nop ; Branch destination (do nothing)
1 (2 bytes)
Name |
Cycles |
AVRe |
1 |
AVRxm |
1 |
AVRxt |
1 |
AVRrc |
1 |
Syntax: |
Operation: |
Operands: |
Program Counter: |
Opcode |
Comment |
Stack |
CPI Rd,K |
Rd - K |
16 <= d <= 31, 0 <= K <= 255 |
PC = PC + 1 |
0011KKKKddddKKKK |
This instruction performs a compare between register Rd and a constant. The register is not changed. All conditional branches can be used after this instruction.
I |
– |
||
T |
– |
||
H |
⇔ |
~Rd3 AND K3 OR K3 AND R3 OR R3 AND ~Rd3 |
Set if there was a borrow from bit 3; cleared otherwise. |
S |
⇔ |
N XOR V, for signed tests. |
|
V |
⇔ |
Rd7 AND ~K7 AND ~R7 OR ~Rd7 AND K7 AND R7 |
Set if two's complement overflow resulted from the operation; cleared otherwise. |
N |
⇔ |
R7 |
Set if MSB of the result is set; cleared otherwise. |
Z |
⇔ |
~R7 AND ~R6 AND ~R5 AND ~R4 AND ~R3 AND ~R2 AND ~R1 AND ~R0 |
Set if the result is 0x00; cleared otherwise. |
C |
⇔ |
~Rd7 AND K7 OR K7 AND R7 OR R7 AND ~Rd7 |
Set if the absolute value of K is larger than the absolute value of Rd; cleared otherwise. |
R (Result) |
R (Result) after the operation. |
cpi r19,3 ; Compare r19 with 3 brne error ; Branch if r19<>3 ... error: nop ; Branch destination (do nothing)
1 (2 bytes)
Name |
Cycles |
AVRe |
1 |
AVRxm |
1 |
AVRxt |
1 |
AVRrc |
1 |
Syntax: |
Operation: |
Operands: |
Program Counter: |
Opcode |
Comment |
Stack |
CPSE Rd,Rr |
If Rd == Rr then PC = PC + 2 (or 3) else PC = PC + 1 |
0 <= d <= 31, 0 <= r <= 31 |
PC = PC + 1, Condition false - no skip PC = PC + 2, Skip a one word instruction PC = PC + 3, Skip a two word instruction |
000100rdddddrrrr |
This instruction performs a compare between two registers Rd and Rr and skips the next instruction if Rd == Rr.
I |
– |
||
T |
– |
||
H |
– |
||
S |
– |
||
V |
– |
||
N |
– |
||
Z |
– |
||
C |
– |
inc r4 ; Increase r4 cpse r4,r0 ; Compare r4 to r0 neg r4 ; Only executed if r4<>r0 nop ; Continue (do nothing)
1 (2 bytes)
Name |
Cycles i |
ii |
iii |
AVRe |
1 |
2 |
3 |
AVRxm |
1 |
2 |
3 |
AVRxt |
1 |
2 |
3 |
AVRrc |
1 |
2 |
N/A |
i) If the condition is false (no skip).
ii) If the condition is true (skip is executed) and the instruction skipped is one word.
iii) If the condition is true (skip is executed) and the instruction skipped is two words.
Syntax: |
Operation: |
Operands: |
Program Counter: |
Opcode |
Comment |
Stack |
CP Rd,Rr |
Rd - Rr |
0 <= d <= 31, 0 <= r <= 31 |
PC = PC + 1 |
000101rdddddrrrr |
This instruction performs a compare between two registers Rd and Rr. None of the registers are changed. All conditional branches can be used after this instruction.
I |
– |
||
T |
– |
||
H |
⇔ |
~Rd3 AND Rr3 OR Rr3 AND R3 OR R3 AND ~Rd3 |
Set if there was a borrow from bit 3; cleared otherwise. |
S |
⇔ |
N XOR V, for signed tests. |
|
V |
⇔ |
Rd7 AND ~Rr7 AND ~R7 OR ~Rd7 AND Rr7 AND R7 |
Set if two's complement overflow resulted from the operation; cleared otherwise. |
N |
⇔ |
R7 |
Set if MSB of the result is set; cleared otherwise. |
Z |
⇔ |
~R7 AND ~R6 AND ~R5 AND ~R4 AND ~R3 AND ~R2 AND ~R1 AND ~R0 |
Set if the result is 0x00; cleared otherwise. |
C |
⇔ |
~Rd7 AND Rr7 OR Rr7 AND R7 OR R7 AND ~Rd7 |
Set if the absolute value of the contents of Rr is larger than the absolute value of Rd; cleared otherwise. |
R (Result) |
R (Result) after the operation. |
cp r4,r19 ; Compare r4 with r19 brne noteq ; Branch if r4 <> r19 ... noteq: nop ; Branch destination (do nothing)
1 (2 bytes)
Name |
Cycles |
AVRe |
1 |
AVRxm |
1 |
AVRxt |
1 |
AVRrc |
1 |
Syntax: |
Operation: |
Operands: |
Program Counter: |
Opcode |
Comment |
Stack |
DEC Rd |
Rd = Rd - 1 |
0 <= d <= 31 |
PC = PC + 1 |
1001010ddddd1010 |
Subtracts one -1- from the contents of register Rd and places the result in the destination register Rd.
The C flag in SREG is not affected by the operation, thus allowing the DEC instruction to be used on a loop counter in multiple-precision computations.
When operating on unsigned values, only BREQ and BRNE branches can be expected to perform consistently. When operating on two's complement values, all signed branches are available.
I |
– |
||
T |
– |
||
H |
– |
||
S |
⇔ |
N XOR V, for signed tests. |
|
V |
⇔ |
~R7 AND R6 AND R5 AND R4 AND R3 AND R2 AND R1 AND R0 |
Set if two's complement overflow resulted from the operation; cleared otherwise. Two's complement overflow occurs only if Rd was 0x80 before the operation. |
N |
⇔ |
R7 |
Set if MSB of the result is set; cleared otherwise. |
Z |
⇔ |
~R7 AND ~R6 AND ~R5 AND ~R4 AND ~R3 AND ~R2 AND ~R1 AND ~R0 |
Set if the result is 0x00; cleared otherwise. |
C |
– |
||
R (Result) |
R (Result) equals Rd after the operation. |
ldi r17,0x10 ; Load constant in r17 loop: add r1,r2 ; Add r2 to r1 dec r17 ; Decrement r17 brne loop ; Branch if r17<>0 nop ; Continue (do nothing)
1 (2 bytes)
Name |
Cycles |
AVRe |
1 |
AVRxm |
1 |
AVRxt |
1 |
AVRrc |
1 |
Syntax: |
Operation: |
Operands: |
Program Counter: |
Opcode |
Comment |
Stack |
DES K |
If H == 0 then Encrypt round (R7-R0, R15-R8, K) If H == 1 then Decrypt round (R7-R0, R15-R8, K) |
0x00<=K<=0x0F |
PC = PC + 1 |
10010100KKKK1011 |
The module is an instruction set extension to the AVR CPU, performing DES iterations. The 64-bit data block (plaintext or ciphertext) is placed in the CPU Register File, registers R0-R7, where the LSB of data is placed in the LSB of R0 and the MSB of data is placed in the MSB of R7. The full 64-bit key (including parity bits) is placed in registers R8-R15, organized in the Register File with the LSB of the key in the LSB of R8 and the MSB of the key in the MSB of R15. Executing one DES instruction performs one round in the DES algorithm. Sixteen rounds must be executed in increasing order to form the correct DES ciphertext or plaintext. Intermediate results are stored in the Register File (R0-R15) after each DES instruction. The instruction's operand (K) determines which round is executed, and the Half Carry (H) flag determines whether encryption or decryption is performed.
The DES algorithm is described in "Specifications for the Data Encryption Standard" (Federal Information Processing Standards Publication 46). Intermediate results in this implementation differ from the standard because the initial permutation and the inverse initial permutation are performed in each iteration. This does not affect the result in the final ciphertext or plaintext but reduces the execution time.
des 0x00 des 0x01 … des 0x0E des 0x0F
1 (2 bytes)
Name Note: If the DES instruction is succeeding a non-DES instruction, it requires two cycles otherwise one. |
Cycles |
AVRe |
N/A |
AVRxm |
1 / 2 |
AVRxt |
N/A |
AVRrc |
N/A |
Syntax: |
Operation: |
Operands: |
Program Counter: |
Opcode |
Comment |
Stack: |
EICALL |
PC(15:0) = Z(15:0) PC(21:16) = EIND |
None |
See Operation |
1001010100011001 |
STACK = PC + 1 SP = SP - 3 (3 bytes, 22 bits) |
Indirect call of a subroutine pointed to by the Z (16-bit) Pointer Register in the Register File and the EIND Register in the I/O space. This instruction allows for indirect calls to the entire 4M (words) program memory space. See also ICALL. The Stack Pointer uses a post-decrement scheme during EICALL.
This instruction is not available on all devices. Refer to Appendix A.
I |
– |
||
T |
– |
||
H |
– |
||
S |
– |
||
V |
– |
||
N |
– |
||
Z |
– |
||
C |
– |
ldi r16,0x05 ; Set up EIND and Z-pointer out EIND,r16 ldi r30,0x00 ldi r31,0x10 eicall ; Call to 0x051000
1 (2 bytes)
Name |
Cycles |
AVRe |
4(2) |
AVRxm |
3(2) |
AVRxt |
3 |
AVRrc |
N/A |
Notes:
1.
The instruction is only implemented on devices with 22-bit PC
2.
Cycle times for data memory access assume internal RAM access and are not valid for accessing external RAM.
Syntax: |
Operation: |
Operands: |
Program Counter: |
Opcode |
Comment |
Stack: |
EIJMP |
PC(15:0) = Z(15:0) PC(21:16) = EIND |
None |
See Operation |
1001010000011001 |
Not Affected |
Indirect jump to the address pointed to by the Z (16-bit) Pointer Register in the Register File and the EIND Register in the I/O space. This instruction allows for indirect jumps to the entire 4M (words) program memory space. See also IJMP.
This instruction is not available on all devices. Refer to Appendix A.
I |
– |
||
T |
– |
||
H |
– |
||
S |
– |
||
V |
– |
||
N |
– |
||
Z |
– |
||
C |
– |
ldi r16,0x05 ; Set up EIND and Z-pointer out EIND,r16 ldi r30,0x00 ldi r31,0x10 eijmp ; Jump to 0x051000
1 (2 bytes)
Name |
Cycles |
AVRe |
2 |
AVRxm |
2 |
AVRxt |
2 |
AVRrc |
N/A |
Syntax: |
Operation: |
Operands: |
Program Counter: |
Opcode |
Comment: |
Stack |
ELPM |
R0 = PS(RAMPZ:Z) |
None, R0 implied |
PC = PC + 1 |
1001010111011000 |
RAMPZ:Z: Unchanged, R0 implied destination register |
|
ELPM Rd, Z |
Rd = PS(RAMPZ:Z) |
0 <= d <= 31 |
PC = PC + 1 |
1001000ddddd0110 |
RAMPZ:Z: Unchanged |
|
ELPM Rd, Z+ |
Rd = PS(RAMPZ:Z) |
0 <= d <= 31 |
PC = PC + 1 |
1001000ddddd0111 |
(RAMPZ:Z) = (RAMPZ:Z) + 1 RAMPZ:Z: Post incremented |
Loads one byte pointed to by the Z-register and the RAMPZ Register in the I/O space, and places this byte in the destination register Rd. This instruction features a 100% space-effective constant initialization or constant data fetch. The program memory is organized in 16-bit words while the Z-pointer is a byte address. Thus, the least significant bit of the Z-pointer selects either low byte (ZLSB == 0) or high byte (ZLSB == 1). This instruction can address the
entire program memory space. The Z-Pointer Register can either be left unchanged by the operation, or it can be incremented. The incrementation applies to the entire 24-bit concatenation of the RAMPZ and Z-Pointer Registers.
Devices with self-programming capability can use the ELPM instruction to read the Fuse and Lock bit value. Refer to the device documentation for a detailed description.
This instruction is not available on all devices. Refer to Appendix A.
The result of these combinations is undefined:
ELPM r30, Z+
ELPM r31, Z+
I |
– |
||
T |
– |
||
H |
– |
||
S |
– |
||
V |
– |
||
N |
– |
||
Z |
– |
||
C |
– |
ldi ZL, byte3(Table_1 << 1) ; Initialize Z-pointer out RAMPZ, ZL ldi ZH, byte2(Table_1 << 1) ldi ZL, byte1(Table_1 << 1) elpm r16, Z+ ; Load constant from Program ; memory pointed to by RAMPZ:Z (Z is r31:r30) ... Table_1: dw 0x3738 ; 0x38 is addressed when Z_LSB == 0 ; 0x37 is addressed when Z_LSB == 1 ...
1 (2 bytes)
Name |
Cycles |
AVRe |
3 |
AVRxm |
3 |
AVRxt |
3 |
AVRrc |
N/A |
Syntax: |
Operation: |
Operands: |
Program Counter: |
Opcode |
Comment |
Stack |
EOR Rd,Rr |
Rd = Rd XOR Rr |
0 <= d <= 31, 0 <= r <= 31 |
PC = PC + 1 |
001001rdddddrrrr |
Performs the logical EOR between the contents of register Rd and register Rr and places the result in the destination register Rd.
I |
– |
||
T |
– |
||
H |
– |
||
S |
⇔ |
N XOR V, for signed tests. |
|
V |
0 |
0 |
Cleared. |
N |
⇔ |
R7 |
Set if MSB of the result is set; cleared otherwise. |
Z |
⇔ |
~R7 AND ~R6 AND ~R5 AND ~R4 AND ~R3 AND ~R2 AND ~R1 AND ~R0 |
Set if the result is 0x00; cleared otherwise. |
C |
– |
||
R (Result) |
R (Result) equals Rd after the operation. |
eor r4,r4 ; Clear r4 eor r0,r22 ; Bitwise exclusive or between r0 and r22
1 (2 bytes)
Name |
Cycles |
AVRe |
1 |
AVRxm |
1 |
AVRxt |
1 |
AVRrc |
1 |
Syntax: |
Operation: |
Operands: |
Program Counter: |
Opcode |
Comment |
Stack |
FMULSU Rd,Rr |
R1:R0 = Rd × Rr (signed (1.15) = signed (1.7) × unsigned (1.7)) |
16 <= d <= 23, 16 <= r <= 23 |
PC = PC + 1 |
000000111ddd1rrr |
This instruction performs 8-bit × 8-bit -> 16-bit signed multiplication and shifts the result one bit left.
Rd
Rr
R1
R0
Product High |
Product Low |
Multiplicand
×
Multiplier
->
8
8
16
Let (N.Q) denote a fractional number with N binary digits left of the radix point, and Q binary digits right of the radix point. A multiplication between two numbers in the formats (N1.Q1) and (N2.Q2) results in the format ((N1+N2). (Q1+Q2)). For signal processing applications, the format (1.7) is widely used for the inputs, resulting in a (2.14) format for the product. A left shift is required for the high byte of the product to be in the same format as the inputs. The FMULSU instruction incorporates the shift operation in the same number of cycles as MULSU.
The (1.7) format is most commonly used with signed numbers, while FMULSU performs a multiplication with one unsigned and one signed input. This instruction is, therefore, most useful for calculating two of the partial products when performing a signed multiplication with 16-bit inputs in the (1.15) format, yielding a result in the (1.31) format.
Note: The result of the FMULSU operation may suffer from a 2's complement overflow if interpreted as a number in the (1.15) format. The MSB of the multiplication before shifting must be taken into account and is found in the carry bit. See the following example.
The multiplicand Rd and the multiplier Rr are two registers containing fractional numbers where the implicit radix point lies between bit 6 and bit 7. The multiplicand Rd is a signed fractional number, and the multiplier Rr is an unsigned fractional number. The 16-bit signed fractional product with the implicit radix point between bit 14 and bit 15 is placed in R1 (high byte) and R0 (low byte).
This instruction is not available on all devices. Refer to Appendix A.
I |
– |
||
T |
– |
||
H |
– |
||
S |
– |
||
V |
– |
||
N |
– |
||
Z |
⇔ |
~R15 AND ~R14 AND ~R13 AND ~R12 AND ~R11 AND ~R10 AND ~R9 AND ~R8 ANDR7 AND ~R6 AND ~R5 AND ~R4 AND ~R3 AND ~R2 AND ~R1 AND ~R0 |
Set if the result is 0x0000; cleared otherwise. |
C |
⇔ |
R16 |
Set if bit 15 of the result before the left shift is set; cleared otherwise. |
R (Result) |
R (Result) equals R1,R0 after the operation. |
;****************************************************************************** ;* DESCRIPTION ;* Signed fractional multiply of two 16-bit numbers with 32-bit result. ;* USAGE ;* r19:r18:r17:r16 = ( r23:r22 * r21:r20 ) << 1 ;****************************************************************************** fmuls16x16_32: clr r2 fmuls r23, r21 ; ((signed)ah * (signed)bh) << 1 movw r18, r0 fmul r22, r20 ; (al * bl) << 1 adc r18, r2 movw r16, r0 fmulsu r23, r20 ; ((signed)ah * bl) << 1 sbc r19, r2 add r17, r0 adc r18, r1 adc r19, r2 fmulsu r21, r22 ; ((signed)bh * al) << 1 sbc r19, r2 add r17, r0 adc r18, r1 adc r19, r2 ret
1 (2 bytes)
Name |
Cycles |
AVRe |
2 |
AVRxm |
2 |
AVRxt |
2 |
AVRrc |
N/A |
Syntax: |
Operation: |
Operands: |
Program Counter: |
Opcode |
Comment |
Stack |
FMULS Rd,Rr |
R1:R0 = Rd × Rr (signed (1.15) = signed (1.7) × signed (1.7)) |
16 <= d <= 23, 16 <= r <= 23 |
PC = PC + 1 |
000000111ddd0rrr |
This instruction performs 8-bit × 8-bit -> 16-bit signed multiplication and shifts the result one bit left.
Rd
Rr
R1
R0
Product High |
Product Low |
Multiplicand
×
Multiplier
->
8
8
16
Let (N.Q) denote a fractional number with N binary digits left of the radix point, and Q binary digits right of the radix point. A multiplication between two numbers in the formats (N1.Q1) and (N2.Q2) results in the format ((N1+N2). (Q1+Q2)). For signal processing applications, the format (1.7) is widely used for the inputs, resulting in a (2.14)
format for the product. A left shift is required for the high byte of the product to be in the same format as the inputs. The FMULS instruction incorporates the shift operation in the same number of cycles as MULS.
The multiplicand Rd and the multiplier Rr are two registers containing signed fractional numbers where the implicit radix point lies between bit 6 and bit 7. The 16-bit signed fractional product with the implicit radix point between bit 14 and bit 15 is placed in R1 (high byte) and R0 (low byte).
Note: That when multiplying 0x80 (-1) with 0x80 (-1), the result of the shift operation is 0x8000 (-1). The shift operation thus gives a two's complement overflow. This must be checked and handled by software.
This instruction is not available on all devices. Refer to Appendix A.
I |
– |
||
T |
– |
||
H |
– |
||
S |
– |
||
V |
– |
||
N |
– |
||
Z |
⇔ |
~R15 AND ~R14 AND ~R13 AND ~R12 AND ~R11 AND ~R10 AND ~R9 AND ~R8 ANDR7 AND ~R6 AND ~R5 AND ~R4 AND ~R3 AND ~R2 AND ~R1 AND ~R0 |
Set if the result is 0x0000; cleared otherwise. |
C |
⇔ |
R16 |
Set if bit 15 of the result before the left shift is set; cleared otherwise. |
R (Result) |
R (Result) equals R1,R0 after the operation. |
fmuls r23,r22 ; Multiply signed r23 and r22 in (1.7) format, ; result in (1.15) format movw r22,r0 ; Copy result back in r23:r22
1 (2 bytes)
Name |
Cycles |
AVRe |
2 |
AVRxm |
2 |
AVRxt |
2 |
AVRrc |
N/A |
Syntax: |
Operation: |
Operands: |
Program Counter: |
Opcode |
Comment |
Stack |
FMUL Rd,Rr |
R1:R0 = Rd × Rr (unsigned (1.15) = unsigned (1.7) × unsigned (1.7)) |
16 <= d <= 23, 16 <= r <= 23 |
PC = PC + 1 |
000000110ddd1rrr |
This instruction performs 8-bit × 8-bit -> 16-bit unsigned multiplication and shifts the result one bit left.
Let (N.Q) denote a fractional number with N binary digits left of the radix point, and Q binary digits right of the radix point. A multiplication between two numbers in the formats (N1.Q1) and (N2.Q2) results in the format ((N1+N2). (Q1+Q2)). For signal processing applications, the format (1.7) is widely used for the inputs, resulting in a (2.14) format for the product. A left shift is required for the high byte of the product to be in the same format as the inputs. The FMUL instruction incorporates the shift operation in the same number of cycles as MUL.
The (1.7) format is most commonly used with signed numbers, while FMUL performs an unsigned multiplication. This instruction is, therefore, most useful for calculating one of the partial products when performing a signed multiplication with 16-bit inputs in the (1.15) format, yielding a result in the (1.31) format.
Note: The result of the FMUL operation may suffer from a 2's complement overflow if interpreted as a number in the (1.15) format. The MSB of the multiplication before shifting must be taken into account and is found in the carry bit. See the following example.
The multiplicand Rd and the multiplier Rr are two registers containing unsigned fractional numbers where the implicit radix point lies between bit 6 and bit 7. The 16-bit unsigned fractional product with the implicit radix point between bit 14 and bit 15 is placed in R1 (high byte) and R0 (low byte).
This instruction is not available on all devices. Refer to Appendix A.
I |
– |
||
T |
– |
||
H |
– |
||
S |
– |
||
V |
– |
||
N |
– |
||
Z |
⇔ |
~R15 AND ~R14 AND ~R13 AND ~R12 AND ~R11 AND ~R10 AND ~R9 AND ~R8 ANDR7 AND ~R6 AND ~R5 AND ~R4 AND ~R3 AND ~R2 AND ~R1 AND ~R0 |
Set if the result is 0x0000; cleared otherwise. |
C |
⇔ |
R16 |
Set if bit 15 of the result before the left shift is set; cleared otherwise. |
R (Result) |
R (Result) equals R1,R0 after the operation. |
;****************************************************************************** ;* DESCRIPTION ;* Signed fractional multiply of two 16-bit numbers with 32-bit result. ;* USAGE ;* r19:r18:r17:r16 = ( r23:r22 * r21:r20 ) << 1 ;****************************************************************************** fmuls16x16_32: clr r2 fmuls r23, r21 ; ((signed)ah * (signed)bh) << 1 movw r18, r0 fmul r22, r20 ; (al * bl) << 1 adc r18, r2 movw r16, r0 fmulsu r23, r20 ; ((signed)ah * bl) << 1 sbc r19, r2 add r17, r0 adc r18, r1 adc r19, r2 fmulsu r21, r22 ; ((signed)bh * al) << 1 sbc r19, r2 add r17, r0 adc r18, r1 adc r19, r2 ret
1 (2 bytes)
Name |
Cycles |
AVRe |
2 |
AVRxm |
2 |
AVRxt |
2 |
AVRrc |
N/A |
Syntax: |
Operation: |
Operands: |
Program Counter: |
Opcode |
Comment: |
Stack: |
ICALL |
PC(15:0) = Z(15:0) |
None |
See Operation |
1001010100001001 |
Devices with 16-bit PC, 128 KB program memory maximum. |
STACK = PC + 1 SP = SP - 2 (2 bytes, 16 bits) |
ICALL |
PC(15:0) = Z(15:0) PC(21:16) = 0 |
None |
See Operation |
1001010100001001 |
Devices with 22-bit PC, 8 MB program memory maximum. |
STACK = PC + 1 SP = SP - 3 (3 bytes, 22 bits) |
Indirect call of a subroutine pointed to by the Z (16-bit) Pointer Register in the Register File. The Z-Pointer Register is 16 bits wide and allows a call to a subroutine within the lowest 64K words (128 KB) section in the program memory space. The Stack Pointer uses a post-decrement scheme during ICALL.
This instruction is not available on all devices. Refer to Appendix A.
I |
– |
||
T |
– |
||
H |
– |
||
S |
– |
||
V |
– |
||
N |
– |
||
Z |
– |
||
C |
– |
mov r30,r0 ; Set offset to call table icall ; Call routine pointed to by r31:r30
1 (2 bytes)
Name |
Cycles 9/16-bit PC |
22-bit PC |
AVRe |
3(1) |
4(1) |
AVRxm |
2(1) |
3(1) |
AVRxt |
2 |
3 |
AVRrc |
3 |
N/A |
Note:
1.
Cycle times for data memory access assume internal RAM access and are not valid for accessing external RAM.
Syntax: |
Operation: |
Operands: |
Program Counter: |
Opcode |
Comment: |
Stack: |
IJMP |
PC = Z(15:0) |
None |
See Operation |
1001010000001001 |
Devices with 16-bit PC, 128 KB program memory maximum. |
Not Affected |
IJMP |
PC(15:0) = Z(15:0) PC(21:16) = 0 |
None |
See Operation |
1001010000001001 |
Devices with 22-bit PC, 8 MB program memory maximum. |
Not Affected |
Indirect jump to the address pointed to by the Z (16-bit) Pointer Register in the Register File. The Z-Pointer Register is 16 bits wide and allows jump within the lowest 64K words (128 KB) section of program memory.
This instruction is not available on all devices. Refer to Appendix A.
I |
– |
||
T |
– |
||
H |
– |
||
S |
– |
||
V |
– |
||
N |
– |
||
Z |
– |
||
C |
– |
mov r30,r0 ; Set offset to jump table ijmp ; Jump to routine pointed to by r31:r30
1 (2 bytes)
Name |
Cycles |
AVRe |
2 |
AVRxm |
2 |
AVRxt |
2 |
AVRrc |
2 |
Syntax: |
Operation: |
Operands: |
Program Counter: |
Opcode |
Comment |
Stack |
INC Rd |
Rd = Rd + 1 |
0 <= d <= 31 |
PC = PC + 1 |
1001010ddddd0011 |
Adds one -1- to the contents of register Rd and places the result in the destination register Rd.
The C flag in SREG is not affected by the operation, thus allowing the INC instruction to be used on a loop counter in multiple-precision computations.
When operating on unsigned numbers, only BREQ and BRNE branches can be expected to perform consistently. When operating on two's complement values, all signed branches are available.
I |
– |
||
T |
– |
||
H |
– |
||
S |
⇔ |
N XOR V, for signed tests. |
|
V |
⇔ |
R7 AND ~R6 AND ~R5 AND ~R4 AND ~R3 AND ~R2 AND ~R1 AND ~R0 |
Set if two's complement overflow resulted from the operation; cleared otherwise. Two's complement overflow occurs only if Rd was 0x7F before the operation. |
N |
⇔ |
R7 |
Set if MSB of the result is set; cleared otherwise. |
Z |
⇔ |
~R7 AND ~R6 AND ~R5 AND ~R4 AND ~R3 AND ~R2 AND ~R1 AND ~R0 |
Set if the result is 0x00; cleared otherwise. |
C |
– |
||
R (Result) |
R (Result) equals Rd after the operation. |
clr r22 ; clear r22 loop: inc r22 ; increment r22 ... cpi r22,0x4F ; Compare r22 to 0x4f brne loop ; Branch if not equal nop ; Continue (do nothing)
1 (2 bytes)
Name |
Cycles |
AVRe |
1 |
AVRxm |
1 |
AVRxt |
1 |
AVRrc |
1 |
Syntax: |
Operation: |
Operands: |
Program Counter: |
Opcode |
Comment |
Stack |
IN Rd,A |
Rd = I/O(A) |
0 <= d <= 31, 0 <= A <= 63 |
PC = PC + 1 |
10110AAdddddAAAA |
Loads data from the I/O space into register Rd in the Register File.
I |
– |
||
T |
– |
||
H |
– |
||
S |
– |
||
V |
– |
||
N |
– |
||
Z |
– |
||
C |
– |
in r25,0x16 ; Read Port B cpi r25,4 ; Compare read value to constant breq exit ; Branch if r25=4 ... exit: nop ; Branch destination (do nothing)
1 (2 bytes)
Name |
Cycles |
AVRe |
1 |
AVRxm |
1 |
AVRxt |
1 |
AVRrc |
1 |
Syntax: |
Operation: |
Operands: |
Program Counter: |
Opcode |
Comment |
Stack: |
JMP k |
PC = k |
0 <= k < 4M |
PC = k |
1001010kkkkk110kkkkkkkkkkkkkkkkk |
Unchanged |
Jump to an address within the entire 4M (words) program memory. See also RJMP.
This instruction is not available on all devices. Refer to Appendix A.
I |
– |
||
T |
– |
||
H |
– |
||
S |
– |
||
V |
– |
||
N |
– |
||
Z |
– |
||
C |
– |
mov r1,r0 ; Copy r0 to r1 jmp farplc ; Unconditional jump ... farplc: nop ; Jump destination (do nothing)
2 (4 bytes)
Name |
Cycles |
AVRe |
3 |
AVRxm |
3 |
AVRxt |
3 |
AVRrc |
N/A |
Syntax: |
Operation: |
Operands: |
Program Counter: |
Opcode |
Comment |
Stack |
LAC Z,Rd |
DS(Z) = (0xFF - Rd) AND DS(Z), Rd = DS(Z) |
0 <= d <= 31 |
PC = PC + 1 |
1001001rrrrr0110 |
Load one byte indirect from data space to register and stores and clear the bits in data space specified by the register. The instruction can only be used towards internal SRAM.
The data location is pointed to by the Z (16-bit) Pointer Register in the Register File. Memory access is limited to the current data segment of 64 KB. To access another data segment in devices with more than 64 KB data space, the RAMPZ in the register in the I/O area has to be changed.
The Z-Pointer Register is left unchanged by the operation. This instruction is especially suited for clearing status bits stored in SRAM.
I |
– |
||
T |
– |
||
H |
– |
||
S |
– |
||
V |
– |
||
N |
– |
||
Z |
– |
||
C |
– |
1 (2 bytes)
Name |
Cycles |
AVRe |
N/A |
AVRxm |
2 |
AVRxt |
N/A |
AVRrc |
N/A |
Syntax: |
Operation: |
Operands: |
Program Counter: |
Opcode |
Comment |
Stack |
LAS Z,Rd |
DS(Z) = Rd v DS(Z), Rd = DS(Z) |
0 <= d <= 31 |
PC = PC + 1 |
1001001rrrrr0101 |
Load one byte indirect from data space to register and set bits in the data space specified by the register. The instruction can only be used towards internal SRAM.
The data location is pointed to by the Z (16-bit) Pointer Register in the Register File. Memory access is limited to the current data segment of 64 KB. To access another data segment in devices with more than 64 KB data space, the RAMPZ in the register in the I/O area has to be changed.
The Z-Pointer Register is left unchanged by the operation. This instruction is especially suited for setting status bits stored in SRAM.
I |
– |
||
T |
– |
||
H |
– |
||
S |
– |
||
V |
– |
||
N |
– |
||
Z |
– |
||
C |
– |
1 (2 bytes)
Name |
Cycles |
AVRe |
N/A |
AVRxm |
2 |
AVRxt |
N/A |
AVRrc |
N/A |
Syntax: |
Operation: |
Operands: |
Program Counter: |
Opcode |
Comment |
Stack |
LAT Z,Rd |
DS(Z) = Rd XOR DS(Z), Rd = DS(Z) |
0 <= d <= 31 |
PC = PC + 1 |
1001001rrrrr0111 |
Load one byte indirect from data space to register and toggles bits in the data space specified by the register. The instruction can only be used towards SRAM.
The data location is pointed to by the Z (16-bit) Pointer Register in the Register File. Memory access is limited to the current data segment of 64 KB. To access another data segment in devices with more than 64 KB data space, the RAMPZ in the register in the I/O area has to be changed.
The Z-Pointer Register is left unchanged by the operation. This instruction is especially suited for changing status bits stored in SRAM.
I |
– |
||
T |
– |
||
H |
– |
||
S |
– |
||
V |
– |
||
N |
– |
||
Z |
– |
||
C |
– |
1 (2 bytes)
Name |
Cycles |
AVRe |
N/A |
AVRxm |
2 |
AVRxt |
N/A |
AVRrc |
N/A |
Syntax: |
Operation: |
Operands: |
Program Counter: |
Opcode |
Comment: |
Stack |
LD Rd, Y |
Rd = DS(Y) |
0 <= d <= 31 |
PC = PC + 1 |
1000000ddddd1000 |
Y: Unchanged |
|
LD Rd, Y+ |
Rd = DS(Y), Y = Y + 1 |
0 <= d <= 31 |
PC = PC + 1 |
1001000ddddd1001 |
Y: Post incremented |
|
LD Rd, -Y |
Y = Y - 1, Rd = DS(Y) |
0 <= d <= 31 |
PC = PC + 1 |
1001000ddddd1010 |
Y: Pre decremented |
|
LDD Rd, Y+q |
Rd = DS(Y+q) |
0 <= d <= 31, 0 <= q <= 63 |
PC = PC + 1 |
10q0qq0ddddd1qqq |
Y: Unchanged, q: Displacement |
Loads one byte indirect with or without displacement from the data space to a register. The data space usually consists of the Register File, I/O memory and SRAM, refer to the device data sheet for a detailed definition of the data space.
The data location is pointed to by the Y (16-bit) Pointer Register in the Register File. Memory access is limited to the current data segment of 64 KB. To access another data segment in devices with more than 64 KB data space, the RAMPY in the register in the I/O area has to be changed.
The Y-Pointer Register can either be left unchanged by the operation, or it can be post-incremented or pre- decremented. These features are especially suited for accessing arrays, tables, and Stack Pointer usage of the Y-Pointer Register. Note that only the low byte of the Y-pointer is updated in devices with no more than 256 bytes of data space. For such devices, the high byte of the pointer is not used by this instruction and can be used for other purposes. The RAMPY Register in the I/O area is updated in parts with more than 64 KB data space or more than 64 KB program memory, and the increment/decrement/displacement is added to the entire 24-bit address on such devices.
Not all variants of this instruction are available on all devices.
In the Reduced Core AVRrc, the LD instruction can be used to achieve the same operation as LPM since the program memory is mapped to the data memory space.
The result of these combinations is undefined:
LD r28, Y+
LD r29, Y+
LD r28, -Y
LD r29, -Y
Using the Y-pointer:
I |
– |
||
T |
– |
||
H |
– |
||
S |
– |
||
V |
– |
||
N |
– |
||
Z |
– |
||
C |
– |
clr r29 ; Clear Y high byte ldi r28,0x60 ; Set Y low byte to 0x60 ld r0,Y+ ; Load r0 with data space loc. 0x60(Y post inc) ld r1,Y ; Load r1 with data space loc. 0x61 ldi r28,0x63 ; Set Y low byte to 0x63 ld r2,Y ; Load r2 with data space loc. 0x63 ld r3,-Y ; Load r3 with data space loc. 0x62(Y pre dec) ldd r4,Y+2 ; Load r4 with data space loc. 0x64
1 (2 bytes)
Name |
Cycles i |
ii |
iii |
iv |
AVRe |
2(1) |
2(1) |
2(1) |
2(1) |
AVRxm |
2(1)(3) |
2(1)(3) |
3(1)(3) |
3(1)(3) |
AVRxt |
2(2) |
2(2) |
2(2) |
2(2) |
AVRrc |
1 / 2 |
2 / 3 |
2 / 3 |
N/A |
Notes:
1.
Cycle times for data memory access assume internal RAM access and are not valid for accessing external RAM.
2.
Cycle time for data memory access assumes internal RAM access, and are not valid for access to NVM. A minimum of one extra cycle must be added when accessing NVM. The additional time varies dependent on the NVM module implementation. See the NVMCTRL section in the specific devices data sheet for more information.
3.
If the LD instruction is accessing I/O Registers, one cycle can be deducted.
Syntax: |
Operation: |
Operands: |
Program Counter: |
Opcode |
Comment: |
Stack |
LD Rd, Z |
Rd = DS(Z) |
0 <= d <= 31 |
PC = PC + 1 |
1000000ddddd0000 |
Z: Unchanged |
|
LD Rd, Z+ |
Rd = DS(Z), Z = Z + 1 |
0 <= d <= 31 |
PC = PC + 1 |
1001000ddddd0001 |
Z: Post incremented |
|
LD Rd, -Z |
Z = Z - 1, Rd = DS(Z) |
0 <= d <= 31 |
PC = PC + 1 |
1001000ddddd0010 |
Z: Pre decremented |
|
LDD Rd, Z+q |
Rd = DS(Z+q) |
0 <= d <= 31, 0 <= q <= 63 |
PC = PC + 1 |
10q0qq0ddddd0qqq |
Z: Unchanged, q: Displacement |
Loads one byte indirect with or without displacement from the data space to a register. The data space usually consists of the Register File, I/O memory, and SRAM, refer to the device data sheet for a detailed definition of the data space.
The data location is pointed to by the Z (16-bit) Pointer Register in the Register File. Memory access is limited to the current data segment of 64 KB. To access another data segment in devices with more than 64 KB data space, the RAMPZ in the register in the I/O area has to be changed.
The Z-Pointer Register can either be left unchanged by the operation, or it can be post-incremented or pre- decremented. These features are especially suited for Stack Pointer usage of the Z-pointer Register. However, because the Z-Pointer Register can be used for indirect subroutine calls, indirect jumps, and table look-up, it is often more convenient to use the X- or Y-pointer as a dedicated Stack Pointer. Note that only the low byte of the Z-pointer is updated in devices with no more than 256 bytes of data space. For such devices, the high byte of the pointer is not used by this instruction and can be used for other purposes. The RAMPZ Register in the I/O area is updated in parts with more than 64 KB data space or more than 64 KB program memory, and the increment/decrement/displacement is added to the entire 24-bit address on such devices.
Not all variants of this instruction are available on all devices.
In the Reduced Core AVRrc, the LD instruction can be used to achieve the same operation as LPM since the program memory is mapped to the data memory space.
For using the Z-pointer for table look-up in program memory, see the LPM and ELPM instructions.
The result of these combinations is undefined:
LD r30, Z+
LD r31, Z+
LD r30, -Z
LD r31, -Z
Using the Z-pointer:
I |
– |
||
T |
– |
||
H |
– |
||
S |
– |
||
V |
– |
||
N |
– |
||
Z |
– |
||
C |
– |
clr r31 ; Clear Z high byte ldi r30,0x60 ; Set Z low byte to 0x60 ld r0,Z+ ; Load r0 with data space loc. 0x60(Z post inc) ld r1,Z ; Load r1 with data space loc. 0x61 ldi r30,0x63 ; Set Z low byte to 0x63 ld r2,Z ; Load r2 with data space loc. 0x63 ld r3,-Z ; Load r3 with data space loc. 0x62(Z pre dec) ldd r4,Z+2 ; Load r4 with data space loc. 0x64
1 (2 bytes)
Name |
Cycles i |
ii |
iii |
iv |
AVRe |
2(1) |
2(1) |
2(1) |
2(1) |
AVRxm |
2(1)(3) |
2(1)(3) |
3(1)(3) |
3(1)(3) |
AVRxt |
2(2) |
2(2) |
2(2) |
2(2) |
AVRrc |
1 / 2 |
2 / 3 |
2 / 3 |
N/A |
Notes:
1.
Cycle times for data memory access assume internal RAM access and are not valid for accessing external RAM.
2.
Cycle time for data memory access assumes internal RAM access, and are not valid for access to NVM. A minimum of one extra cycle must be added when accessing NVM. The additional time varies dependent on the NVM module implementation. See the NVMCTRL section in the specific devices data sheet for more information.
3.
If the LD instruction is accessing I/O Registers, one cycle can be deducted.
Syntax: |
Operation: |
Operands: |
Program Counter: |
Opcode |
Comment |
Stack |
LDI Rd,K |
Rd = K |
16 <= d <= 31, 0 <= K <= 255 |
PC = PC + 1 |
1110KKKKddddKKKK |
Loads an 8-bit constant directly to register 16 to 31.
I |
– |
||
T |
– |
||
H |
– |
||
S |
– |
||
V |
– |
||
N |
– |
||
Z |
– |
||
C |
– |
clr r31 ; Clear Z high byte ldi r30,0xF0 ; Set Z low byte to 0xF0 lpm ; Load constant from Program ; memory pointed to by Z
1 (2 bytes)
Name |
Cycles |
AVRe |
1 |
AVRxm |
1 |
AVRxt |
1 |
AVRrc |
1 |
Syntax: |
Operation: |
Operands: |
Program Counter: |
Opcode |
Comment |
Stack |
LDS Rd,k |
Rd = (k) |
16 <= d <= 31, 0 <= k <= 127 |
PC = PC + 1 |
10100kkkddddkkkk |
Loads one byte from the data space to a register. The data space usually consists of the Register File, I/O memory, and SRAM, refer to the device data sheet for a detailed definition of the data space.
A 7-bit address must be supplied. The address given in the instruction is coded to a data space address as follows:
ADDR[7:0] = (INST[8], INST[8], INST[10], INST[9], INST[3], INST[2], INST[1], INST[0])
Memory access is limited to the address range 0x40...0xbf.
This instruction is not available on all devices. Refer to Appendix A.
I |
– |
||
T |
– |
||
H |
– |
||
S |
– |
||
V |
– |
||
N |
– |
||
Z |
– |
||
C |
– |
lds r16,0x00 ; Load r16 with the contents of data space location 0x00 add r16,r17 ; add r17 to r16 sts 0x00,r16 ; Write result to the same address it was fetched from
1 (2 bytes)
Name Note: Registers r0...r15 are remapped to r16...r31. |
Cycles |
AVRe |
N/A |
AVRxm |
N/A |
AVRxt |
N/A |
AVRrc |
2 |
Syntax: |
Operation: |
Operands: |
Program Counter: |
Opcode |
Comment |
Stack |
LDS Rd,k |
Rd = DS(k) |
0 <= d <= 31, 0 <= k <= 65535 |
PC = PC + 2 |
1001000ddddd0000kkkkkkkkkkkkkkkk |
Loads one byte from the data space to a register. The data space usually consists of the Register File, I/O memory, and SRAM, refer to the device data sheet for a detailed definition of the data space.
A 16-bit address must be supplied. Memory access is limited to the current data segment of 64 KB. The LDS instruction uses the RAMPD Register to access memory above 64 KB. To access another data segment in devices with more than 64 KB data space, the RAMPD in the register in the I/O area has to be changed.
This instruction is not available on all devices. Refer to Appendix A.
I |
– |
||
T |
– |
||
H |
– |
||
S |
– |
||
V |
– |
||
N |
– |
||
Z |
– |
||
C |
– |
lds r2,0xFF00 ; Load r2 with the contents of data space location 0xFF00 add r2,r1 ; add r1 to r2 sts 0xFF00,r2 ; Write back
2 (4 bytes)
Name |
Cycles |
AVRe |
2(1) |
AVRxm |
3(1)(3) |
AVRxt |
3(2) |
AVRrc |
N/A |
Notes:
1.
Cycle times for data memory access assume internal RAM access and are not valid for accessing external RAM.
2.
Cycle time for data memory access assumes internal RAM access, and are not valid for access to NVM. A minimum of one extra cycle must be added when accessing NVM. The additional time varies dependent on the NVM module implementation. See the NVMCTRL section in the specific devices data sheet for more information.
3.
If the LD instruction is accessing I/O Registers, one cycle can be deducted.
Syntax: |
Operation: |
Operands: |
Program Counter: |
Opcode |
Comment: |
Stack |
LD Rd, X |
Rd = DS(X) |
0 <= d <= 31 |
PC = PC + 1 |
1001000ddddd1100 |
X: Unchanged |
|
LD Rd, X+ |
Rd = DS(X) X = X + 1 |
0 <= d <= 31 |
PC = PC + 1 |
1001000ddddd1101 |
X: Post incremented |
|
LD Rd, -X |
X = X - 1 Rd = DS(X) |
0 <= d <= 31 |
PC = PC + 1 |
1001000ddddd1110 |
X: Pre decremented |
Loads one byte indirect from the data space to a register. The data space usually consists of the Register File, I/O memory, and SRAM, refer to the device data sheet for a detailed definition of the data space.
The data location is pointed to by the X (16-bit) Pointer Register in the Register File. Memory access is limited to the current data segment of 64 KB. To access another data segment in devices with more than 64 KB data space, the RAMPX in the register in the I/O area has to be changed.
The X-Pointer Register can either be left unchanged by the operation, or it can be post-incremented or pre- decremented. These features are especially suited for accessing arrays, tables, and Stack Pointer usage of the X-Pointer Register. Note that only the low byte of the X-pointer is updated in devices with no more than 256 bytes of data space. For such devices, the high byte of the pointer is not used by this instruction and can be used for other purposes. The RAMPX Register in the I/O area is updated in parts with more than 64 KB data space or more than 64 KB program memory, and the increment/decrement is added to the entire 24-bit address on such devices.
Not all variants of this instruction are available on all devices.
In the Reduced Core AVRrc, the LD instruction can be used to achieve the same operation as LPM since the program memory is mapped to the data memory space.
The result of these combinations is undefined:
LD r26, X+
LD r27, X+
LD r26, -X
LD r27, -X
Using the X-pointer:
I |
– |
||
T |
– |
||
H |
– |
||
S |
– |
||
V |
– |
||
N |
– |
||
Z |
– |
||
C |
– |
clr r27 ; Clear X high byte ldi r26,0x60 ; Set X low byte to 0x60 ld r0,X+ ; Load r0 with data space loc. 0x60(X post inc) ld r1,X ; Load r1 with data space loc. 0x61 ldi r26,0x63 ; Set X low byte to 0x63 ld r2,X ; Load r2 with data space loc. 0x63 ld r3,–X ; Load r3 with data space loc. 0x62(X pre dec)
1 (2 bytes)
Name |
Cycles i |
ii |
iii |
AVRe |
2(1) |
2(1) |
2(1) |
AVRxm |
2(1)(3) |
2(1)(3) |
3(1)(3) |
AVRxt |
2(2) |
2(2) |
2(2) |
AVRrc |
1 / 2 |
2 / 3 |
2 / 3 |
Notes:
1.
Cycle times for data memory access assume internal RAM access and are not valid for accessing external RAM.
2.
Cycle time for data memory access assumes internal RAM access, and are not valid for access to NVM. A minimum of one extra cycle must be added when accessing NVM. The additional time varies dependent on the NVM module implementation. See the NVMCTRL section in the specific devices data sheet for more information.
3.
If the LD instruction is accessing I/O Registers, one cycle can be deducted.
Syntax: |
Operation: |
Operands: |
Program Counter: |
Opcode |
Comment: |
Stack |
LPM |
R0 = PS(Z) |
None, R0 implied |
PC = PC + 1 |
1001010111001000 |
Z: Unchanged, R0 implied destination register |
|
LPM Rd, Z |
Rd = PS(Z) |
0 <= d <= 31 |
PC = PC + 1 |
1001000ddddd0100 |
Z: Unchanged |
|
LPM Rd, Z+ |
Rd = PS(Z) Z = Z + 1 |
0 <= d <= 31 |
PC = PC + 1 |
1001000ddddd0101 |
Z: Post incremented |
Loads one byte pointed to by the Z-register into the destination register Rd. This instruction features a 100% space-effective constant initialization or constant data fetch. The program memory is organized in 16-bit words while the Z-pointer is a byte address. Thus, the least significant bit of the Z-pointer selects either low byte (ZLSb == 0) or
high byte (ZLSb == 1). This instruction can address the first 64 KB (32K words) of program memory. The Z-Pointer
Register can either be left unchanged by the operation, or it can be incremented. The incrementation does not apply to the RAMPZ Register.
Devices with self-programming capability can use the LPM instruction to read the Fuse and Lock bit values. Refer to the device documentation for a detailed description.
The LPM instruction is not available on all devices. Refer to Appendix A.
The result of these combinations is undefined:
LPM r30, Z+
LPM r31, Z+
I |
– |
||
T |
– |
||
H |
– |
||
S |
– |
||
V |
– |
||
N |
– |
||
Z |
– |
||
C |
– |
ldi ZH, high(Table_1<<1) ; Initialize Z-pointer ldi ZL, low(Table_1<<1) lpm r16, Z ; Load constant from Program ; Memory pointed to by Z (r31:r30) ... Table_1: dw 0x5876 ; 0x76 is addresses when Z_LSB == 0 ; 0x58 is addresses when Z_LSB == 1 ...
1 (2 bytes)
Name |
Cycles |
AVRe |
3 |
AVRxm |
3 |
AVRxt |
3 |
AVRrc |
N/A |
Syntax: |
Operation: |
Operands: |
Program Counter: |
Opcode |
Comment |
Stack |
LSL Rd |
C = Rd[7] Rd = Rd << 1 |
0 <= d <= 31 |
PC = PC + 1 |
000011dddddddddd |
C <- b7 - - - - - - - - - - - - - - - - - - b0 <- 0 |
Shifts all bits in Rd one place to the left. Bit 0 is cleared. Bit 7 is loaded into the C flag of the SREG. This operation effectively multiplies signed and unsigned values by two.
I |
– |
||
T |
– |
||
H |
⇔ |
Rd3 |
|
S |
⇔ |
N XOR V, for signed tests. |
|
V |
⇔ |
N XOR C, for N and C after the shift. |
|
N |
⇔ |
R7 |
Set if MSB of the result is set; cleared otherwise. |
Z |
⇔ |
~R7 AND ~R6 AND ~R5 AND ~R4 AND ~R3 AND ~R2 AND ~R1 AND ~R0 |
Set if the result is 0x00; cleared otherwise. |
C |
⇔ |
Rd7 |
Set if, before the shift, the MSB of Rd was set; cleared otherwise. |
R (Result) |
R (Result) equals Rd after the operation. |
add r0,r4 ; Add r4 to r0 lsl r0 ; Multiply r0 by 2
1 (2 bytes)
Name |
Cycles |
AVRe |
1 |
AVRxm |
1 |
AVRxt |
1 |
AVRrc |
1 |
Syntax: |
Operation: |
Operands: |
Program Counter: |
Opcode |
Comment |
Stack |
LSR Rd |
C = Rd[0] Rd = Rd >> 1 |
0 <= d <= 31 |
PC = PC + 1 |
1001010ddddd0110 |
-> b7 - - - - - - - - - - - - - - - - - - b0 -> C |
Shifts all bits in Rd one place to the right. Bit 7 is cleared. Bit 0 is loaded into the C flag of the SREG. This operation effectively divides an unsigned value by two. The C flag can be used to round the result.
I |
– |
||
T |
– |
||
H |
– |
||
S |
⇔ |
N XOR V, for signed tests. |
|
V |
⇔ |
N XOR C, for N and C after the shift. |
|
N |
0 |
0 |
|
Z |
⇔ |
~R7 AND ~R6 AND ~R5 AND ~R4 AND ~R3 AND ~R2 AND ~R1 AND ~R0 |
Set if the result is 0x00; cleared otherwise. |
C |
⇔ |
Rd0 |
Set if, before the shift, the LSB of Rd was set; cleared otherwise. |
R (Result) |
R (Result) equals Rd after the operation. |
add r0,r4 ; Add r4 to r0 lsr r0 ; Divide r0 by 2
1 (2 bytes)
Name |
Cycles |
AVRe |
1 |
AVRxm |
1 |
AVRxt |
1 |
AVRrc |
1 |
Syntax: |
Operation: |
Operands: |
Program Counter: |
Opcode |
Comment |
Stack |
MOVW Rd,Rr |
R[d+1]:Rd = R[r+1]:Rr |
d ∈ {0,2,...,30}, r ∈ {0,2,...,30} |
PC = PC + 1 |
00000001ddddrrrr |
This instruction makes a copy of one register pair into another register pair. The source register pair Rr+1:Rr is left unchanged, while the destination register pair Rd+1:Rd is loaded with a copy of Rr + 1:Rr.
This instruction is not available on all devices. Refer to Appendix A.
I |
– |
||
T |
– |
||
H |
– |
||
S |
– |
||
V |
– |
||
N |
– |
||
Z |
– |
||
C |
– |
movw r17:16,r1:r0 ; Copy r1:r0 to r17:r16 call check ; Call subroutine ... check: cpi r16,0x11 ; Compare r16 to 0x11 ... cpi r17,0x32 ; Compare r17 to 0x32 ... ret ; Return from subroutine
1 (2 bytes)
Name |
Cycles |
AVRe |
1 |
AVRxm |
1 |
AVRxt |
1 |
AVRrc |
N/A |
Syntax: |
Operation: |
Operands: |
Program Counter: |
Opcode |
Comment |
Stack |
MOV Rd,Rr |
Rd = Rr |
0 <= d <= 31, 0 <= r <= 31 |
PC = PC + 1 |
001011rdddddrrrr |
This instruction makes a copy of one register into another. The source register Rr is left unchanged, while the destination register Rd is loaded with a copy of Rr.
I |
– |
||
T |
– |
||
H |
– |
||
S |
– |
||
V |
– |
||
N |
– |
||
Z |
– |
||
C |
– |
mov r16,r0 ; Copy r0 to r16 call check ; Call subroutine ... check: cpi r16,0x11 ; Compare r16 to 0x11 ... ret ; Return from subroutine
1 (2 bytes)
Name |
Cycles |
AVRe |
1 |
AVRxm |
1 |
AVRxt |
1 |
AVRrc |
1 |
Syntax: |
Operation: |
Operands: |
Program Counter: |
Opcode |
Comment |
Stack |
MULSU Rd,Rr |
R1:R0 = Rd × Rr (signed = signed × unsigned) |
16 <= d <= 23, 16 <= r <= 23 |
PC = PC + 1 |
000000110ddd0rrr |
This instruction performs 8-bit × 8-bit -> 16-bit multiplication of a signed and an unsigned number.
Rd
Rr
R1
R0
->
Product High |
Product Low |
Multiplicand
Multiplier
8
8
16
The multiplicand Rd and the multiplier Rr are two registers. The multiplicand Rd is a signed number, and the multiplier Rr is unsigned. The 16-bit signed product is placed in R1 (high byte) and R0 (low byte).
This instruction is not available on all devices. Refer to Appendix A.
I |
– |
||
T |
– |
||
H |
– |
||
S |
– |
||
V |
– |
||
N |
– |
||
Z |
⇔ |
~R15 AND ~R14 AND ~R13 AND ~R12 AND ~R11 AND ~R10 AND ~R9 AND ~R8 ANDR7 AND ~R6 AND ~R5 AND ~R4 AND ~R3 AND ~R2 AND ~R1 AND ~R0 |
Set if the result is 0x0000; cleared otherwise. |
C |
⇔ |
R15 |
|
R (Result) |
R (Result) equals R1,R0 after the operation. |
;****************************************************************************** ;* DESCRIPTION ;* Signed multiply of two 16-bit numbers with 32-bit result. ;* USAGE ;* r19:r18:r17:r16 = r23:r22 * r21:r20 ;****************************************************************************** muls16x16_32: clr r2 muls r23, r21 ; (signed)ah * (signed)bh movw r18, r0 mul r22, r20 ; al * bl movw r16, r0 mulsu r23, r20 ; (signed)ah * bl sbc r19, r2 add r17, r0 adc r18, r1 adc r19, r2 mulsu r21, r22 ; (signed)bh * al sbc r19, r2 add r17, r0 adc r18, r1 adc r19, r2 ret
1 (2 bytes)
Name |
Cycles |
AVRe |
2 |
AVRxm |
2 |
AVRxt |
2 |
AVRrc |
N/A |
Syntax: |
Operation: |
Operands: |
Program Counter: |
Opcode |
Comment |
Stack |
MULS Rd,Rr |
R1:R0 = Rd × Rr (signed = signed × signed) |
16 <= d <= 31, 16 <= r <= 31 |
PC = PC + 1 |
00000010ddddrrrr |
This instruction performs 8-bit × 8-bit -> 16-bit signed multiplication.
Rd
Rr
R1
R0
×
->
Product High |
Product Low |
Multiplicand
Multiplier
8
8
16
The multiplicand Rd and the multiplier Rr are two registers containing signed numbers. The 16-bit signed product is placed in R1 (high byte) and R0 (low byte).
This instruction is not available on all devices. Refer to Appendix A.
I |
– |
||
T |
– |
||
H |
– |
||
S |
– |
||
V |
– |
||
N |
– |
||
Z |
⇔ |
~R15 AND ~R14 AND ~R13 AND ~R12 AND ~R11 AND ~R10 AND ~R9 AND ~R8 ANDR7 AND ~R6 AND ~R5 AND ~R4 AND ~R3 AND ~R2 AND ~R1 AND ~R0 |
Set if the result is 0x0000; cleared otherwise. |
C |
⇔ |
R15 |
|
R (Result) |
R (Result) equals R1,R0 after the operation. |
muls r21,r20 ; Multiply signed r21 and r20 movw r20,r0 ; Copy result back in r21:r20
1 (2 bytes)
Name |
Cycles |
AVRe |
2 |
AVRxm |
2 |
AVRxt |
2 |
AVRrc |
N/A |
Syntax: |
Operation: |
Operands: |
Program Counter: |
Opcode |
Comment |
Stack |
MUL Rd,Rr |
R1:R0 = Rd × Rr (unsigned = unsigned × unsigned) |
0 <= d <= 31, 0 <= r <= 31 |
PC = PC + 1 |
100111rdddddrrrr |
This instruction performs 8-bit × 8-bit -> 16-bit unsigned multiplication.
Rd
Rr
R1
R0
×
->
Product High |
Product Low |
Multiplicand
Multiplier
8
8
16
The multiplicand Rd and the multiplier Rr are two registers containing unsigned numbers. The 16-bit unsigned product is placed in R1 (high byte) and R0 (low byte). Note that if the multiplicand or the multiplier is selected from R0 or R1, the result will overwrite those after multiplication.
This instruction is not available on all devices. Refer to Appendix A.
I |
– |
||
T |
– |
||
H |
– |
||
S |
– |
||
V |
– |
||
N |
– |
||
Z |
⇔ |
~R15 AND ~R14 AND ~R13 AND ~R12 AND ~R11 AND ~R10 AND ~R9 AND ~R8 ANDR7 AND ~R6 AND ~R5 AND ~R4 AND ~R3 AND ~R2 AND ~R1 AND ~R0 |
Set if the result is 0x0000; cleared otherwise. |
C |
⇔ |
R15 |
|
R (Result) |
R (Result) equals R1,R0 after the operation. |
mul r5,r4 ; Multiply unsigned r5 and r4 movw r4,r0 ; Copy result back in r5:r4
1 (2 bytes)
Name |
Cycles |
AVRe |
2 |
AVRxm |
2 |
AVRxt |
2 |
AVRrc |
N/A |
Syntax: |
Operation: |
Operands: |
Program Counter: |
Opcode |
Comment |
Stack |
NEG Rd |
Rd = 0x00 - Rd |
0 <= d <= 31 |
PC = PC + 1 |
1001010ddddd0001 |
Replaces the contents of register Rd with its two's complement; the value 0x80 is left unchanged.
I |
– |
||
T |
– |
||
H |
⇔ |
R3 OR Rd3 |
Set if there was a borrow from bit 3; cleared otherwise. |
S |
⇔ |
N XOR V, for signed tests. |
|
V |
⇔ |
R7 AND ~R6 AND ~R5 AND ~R4 AND ~R3 AND ~R2 AND ~R1 AND ~R0 |
Set if there is a two's complement overflow from the implied subtraction from zero; cleared otherwise. A two's complement overflow will occur only if the contents of the Register after the operation (Result) is 0x80. |
N |
⇔ |
R7 |
Set if MSB of the result is set; cleared otherwise. |
Z |
⇔ |
~R7 AND ~R6 AND ~R5 AND ~R4 AND ~R3 AND ~R2 AND ~R1 AND ~R0 |
Set if the result is 0x00; cleared otherwise. |
C |
⇔ |
R7 OR R6 OR R5 OR R4 OR R3 OR R2 OR R1 OR R0 |
Set if there is a borrow in the implied subtraction from zero; cleared otherwise. The C flag will be set in all cases except when the contents of the Register after the operation is 0x00. |
R (Result) |
R (Result) equals Rd after the operation. |
sub r11,r0 ; Subtract r0 from r11 brpl positive ; Branch if result positive neg r11 ; Take two’s complement of r11 positive: nop ; Branch destination (do nothing)
1 (2 bytes)
Name |
Cycles |
AVRe |
1 |
AVRxm |
1 |
AVRxt |
1 |
AVRrc |
1 |
Syntax: |
Operation: |
Operands: |
Program Counter: |
Opcode |
Comment |
Stack |
NOP |
No |
None |
PC = PC + 1 |
0000000000000000 |
This instruction performs a single cycle No Operation.
I |
– |
||
T |
– |
||
H |
– |
||
S |
– |
||
V |
– |
||
N |
– |
||
Z |
– |
||
C |
– |
clr r16 ; Clear r16 ser r17 ; Set r17 out 0x18,r16 ; Write zeros to Port B nop ; Wait (do nothing) out 0x18,r17 ; Write ones to Port B
1 (2 bytes)
Name |
Cycles |
AVRe |
1 |
AVRxm |
1 |
AVRxt |
1 |
AVRrc |
1 |
Syntax: |
Operation: |
Operands: |
Program Counter: |
Opcode |
Comment |
Stack |
ORI Rd,K |
Rd = Rd OR K |
16 <= d <= 31, 0 <= K <= 255 |
PC = PC + 1 |
0110KKKKddddKKKK |
Performs the logical OR between the contents of register Rd and a constant, and places the result in the destination register Rd.
I |
– |
||
T |
– |
||
H |
– |
||
S |
⇔ |
N XOR V, for signed tests. |
|
V |
0 |
0 |
Cleared. |
N |
⇔ |
R7 |
Set if MSB of the result is set; cleared otherwise. |
Z |
⇔ |
~R7 AND ~R6 AND ~R5 AND ~R4 AND ~R3 AND ~R2 AND ~R1 AND ~R0 |
Set if the result is 0x00; cleared otherwise. |
C |
– |
||
R (Result) |
R (Result) equals Rd after the operation. |
ori r16,0xF0 ; Set high nibble of r16 ori r17,1 ; Set bit 0 of r17
1 (2 bytes)
Name |
Cycles |
AVRe |
1 |
AVRxm |
1 |
AVRxt |
1 |
AVRrc |
1 |
Syntax: |
Operation: |
Operands: |
Program Counter: |
Opcode |
Comment |
Stack |
OR Rd,Rr |
Rd = Rd OR Rr |
0 <= d <= 31, 0 <= r <= 31 |
PC = PC + 1 |
001010rdddddrrrr |
Performs the logical OR between the contents of register Rd and register Rr, and places the result in the destination register Rd.
I |
– |
||
T |
– |
||
H |
– |
||
S |
⇔ |
N XOR V, for signed tests. |
|
V |
0 |
0 |
Cleared. |
N |
⇔ |
R7 |
Set if MSB of the result is set; cleared otherwise. |
Z |
⇔ |
~R7 AND ~R6 AND ~R5 AND ~R4 AND ~R3 AND ~R2 AND ~R1 AND ~R0 |
Set if the result is 0x00; cleared otherwise. |
C |
– |
||
R (Result) |
R (Result) equals Rd after the operation. |
or r15,r16 ; Do bitwise or between registers bst r15,6 ; Store bit 6 of r15 in T bit brts ok ; Branch if T bit set ... ok: nop ; Branch destination (do nothing)
1 (2 bytes)
Name |
Cycles |
AVRe |
1 |
AVRxm |
1 |
AVRxt |
1 |
AVRrc |
1 |
Syntax: |
Operation: |
Operands: |
Program Counter: |
Opcode |
Comment |
Stack |
OUT A,Rr |
I/O(A) = Rr |
0 <= r <= 31, 0 <= A <= 63 |
PC = PC + 1 |
10111AArrrrrAAAA |
Stores data from register Rr in the Register File to I/O space.
I |
– |
||
T |
– |
||
H |
– |
||
S |
– |
||
V |
– |
||
N |
– |
||
Z |
– |
||
C |
– |
clr r16 ; Clear r16 ser r17 ; Set r17 out 0x18,r16 ; Write zeros to Port B nop ; Wait (do nothing) out 0x18,r17 ; Write ones to Port B
1 (2 bytes)
Name |
Cycles |
AVRe |
1 |
AVRxm |
1 |
AVRxt |
1 |
AVRrc |
1 |
Syntax: |
Operation: |
Operands: |
Program Counter: |
Opcode |
Comment |
Stack: |
POP Rd |
Rd = STACK |
0 <= d <= 31 |
PC = PC + 1 |
1001000ddddd1111 |
SP = SP + 1 |
This instruction loads register Rd with a byte from the STACK. The Stack Pointer is pre-incremented by 1 before the POP.
This instruction is not available on all devices. Refer to Appendix A.
I |
– |
||
T |
– |
||
H |
– |
||
S |
– |
||
V |
– |
||
N |
– |
||
Z |
– |
||
C |
– |
call routine ; Call subroutine ... routine: push r14 ; Save r14 on the Stack push r13 ; Save r13 on the Stack ... pop r13 ; Restore r13 pop r14 ; Restore r14 ret ; Return from subroutine
1 (2 bytes)
Name |
Cycles |
AVRe |
2 |
AVRxm |
2(1) |
AVRxt |
2 |
AVRrc |
3 |
Note:
1.
Cycle times for data memory access assume internal RAM access and are not valid for accessing external RAM.
Syntax: |
Operation: |
Operands: |
Program Counter: |
Opcode |
Comment |
Stack: |
PUSH Rr |
STACK = Rr |
0 <= r <= 31 |
PC = PC + 1 |
1001001ddddd1111 |
SP = SP - 1 |
This instruction stores the contents of register Rr on the STACK. The Stack Pointer is post-decremented by 1 after the PUSH.
This instruction is not available on all devices. Refer to Appendix A.
I |
– |
||
T |
– |
||
H |
– |
||
S |
– |
||
V |
– |
||
N |
– |
||
Z |
– |
||
C |
– |
call routine ; Call subroutine ... routine: push r14 ; Save r14 on the Stack push r13 ; Save r13 on the Stack ... pop r13 ; Restore r13 pop r14 ; Restore r14 ret ; Return from subroutine
1 (2 bytes)
Name |
Cycles |
AVRe |
2 |
AVRxm |
1(1) |
AVRxt |
1 |
AVRrc |
1 |
Note:
1.
Cycle times for data memory access assume internal RAM access and are not valid for accessing external RAM.
Syntax: |
Operation: |
Operands: |
Program Counter: |
Opcode |
Comment: |
Stack: |
RCALL k |
PC = PC + k + 1 |
-2K <= k < 2K |
PC = PC + k + 1 |
1101kkkkkkkkkkkk |
Devices with 16-bit PC, 128 KB program memory maximum. |
STACK = PC + 1 SP = SP - 2 (2 bytes, 16 bits) |
RCALL k |
PC = PC + k + 1 |
-2K <= k < 2K |
PC = PC + k + 1 |
1101kkkkkkkkkkkk |
Devices with 22-bit PC, 8 MB program memory maximum. |
STACK = PC + 1 SP = SP - 3 (3 bytes, 22 bits) |
Relative call to an address within PC - 2K + 1 and PC + 2K (words). The return address (the instruction after the RCALL) is stored onto the Stack. See also CALL. For AVR microcontrollers with program memory not exceeding 4K words (8 KB), this instruction can address the entire memory from every address location. The Stack Pointer uses a post-decrement scheme during RCALL.
I |
– |
||
T |
– |
||
H |
– |
||
S |
– |
||
V |
– |
||
N |
– |
||
Z |
– |
||
C |
– |
rcall routine ; Call subroutine ... routine: push r14 ; Save r14 on the Stack ... pop r14 ; Restore r14 ret ; Return from subroutine
1 (2 bytes)
Name |
Cycles 9/16-bit PC |
22-bit PC |
AVRe |
3(1) |
4(1) |
AVRxm |
2(1) |
3(1) |
AVRxt |
2 |
3 |
AVRrc |
3 |
N/A |
Note:
1.
Cycle times for data memory access assume internal RAM access and are not valid for accessing external RAM.
Syntax: |
Operation: |
Operands: |
Program Counter: |
Opcode |
Comment: |
Stack: |
RETI |
PC(15:0) = STACK |
None |
See Operation |
1001010100011000 |
Devices with 16-bit PC, 128 KB program memory maximum. |
SP = SP + 2 (2 bytes, 16 bits) |
RETI |
PC(21:0) = STACK |
None |
See Operation |
1001010100011000 |
Devices with 22-bit PC, 8 MB program memory maximum. |
SP = SP + 3 (3 bytes, 22 bits) |
Returns from the interrupt. The return address is loaded from the STACK, and the Global Interrupt Enable bit is set.
Note that the Status Register is not automatically stored when entering an interrupt routine, and it is not restored when returning from an interrupt routine. This must be handled by the application program. The Stack Pointer uses a pre-increment scheme during RETI.
I |
1 |
1 |
The I flag is set. |
T |
– |
||
H |
– |
||
S |
– |
||
V |
– |
||
N |
– |
||
Z |
– |
||
C |
– |
... extint: push r0 ; Save r0 on the Stack ... pop r0 ; Restore r0 reti ; Return and enable interrupts
1 (2 bytes)
Name |
Cycles 9/16-bit PC |
22-bit PC |
AVRe |
4(2) |
5(2) |
AVRxm |
4(2) |
5(2) |
AVRxt |
4 |
5 |
AVRrc |
6 |
N/A |
Notes:
1.
RETI behaves differently in AVRe, AVRxm, and AVRxt devices. In the AVRe series of devices, the Global Interrupt Enable bit is cleared by hardware once an interrupt occurs, and this bit is set when RETI is executed. In the AVRxm and AVRxt devices, RETI will not modify the Global Interrupt Enable bit in SREG since it is not cleared by hardware while entering ISR. This bit should be modified using SEI and CLI instructions when needed.
2.
Cycle times for data memory access assume internal RAM access and are not valid for accessing external RAM.
Syntax: |
Operation: |
Operands: |
Program Counter: |
Opcode |
Comment: |
Stack: |
RET |
PC(15:0) = STACK |
None |
See Operation |
1001010100001000 |
Devices with 16-bit PC, 128 KB program memory maximum. |
SP = SP + 2, (2 bytes,16 bits) |
RET |
PC(21:0) = STACK |
None |
See Operation |
1001010100001000 |
Devices with 22-bit PC, 8 MB program memory maximum. |
SP = SP + 3, (3 bytes,22 bits) |
Returns from the subroutine. The return address is loaded from the STACK. The Stack Pointer uses a pre-increment scheme during RET.
Operation:
I |
– |
||
T |
– |
||
H |
– |
||
S |
– |
||
V |
– |
||
N |
– |
||
Z |
– |
||
C |
– |
call routine ; Call subroutine ... routine: push r14 ; Save r14 on the Stack ... pop r14 ; Restore r14 ret ; Return from subroutine
1 (2 bytes)
Name |
Cycles 9/16-bit PC |
22-bit PC |
AVRe |
4(1) |
5(1) |
AVRxm |
4(1) |
5(1) |
AVRxt |
4 |
5 |
AVRrc |
6 |
N/A |
Note:
1.
Cycle times for data memory access assume internal RAM access and are not valid for accessing external RAM.
Syntax: |
Operation: |
Operands: |
Program Counter: |
Opcode |
Comment |
Stack: |
RJMP |
PC = PC + k + 1 |
k -2K <= k < 2K |
PC = PC + k + 1 |
1100kkkkkkkkkkkk |
Unchanged |
Relative jump to an address within PC - 2K +1 and PC + 2K (words). For AVR microcontrollers with pogram memory not exceeding 4K words (8 KB), this instruction can address the entire memory from every address location. See also JMP.
I |
– |
||
T |
– |
||
H |
– |
||
S |
– |
||
V |
– |
||
N |
– |
||
Z |
– |
||
C |
– |
cpi r16,0x42 ; Compare r16 to 0x42 brne error ; Branch if r16 <> 0x42 rjmp ok ; Unconditional branch error: add r16,r17 ; Add r17 to r16 inc r16 ; Increment r16 ok: nop ; Destination for rjmp (do nothing)
1 (2 bytes)
Name |
Cycles |
AVRe |
2 |
AVRxm |
2 |
AVRxt |
2 |
AVRrc |
2 |
Syntax: |
Operation: |
Operands: |
Program Counter: |
Opcode |
Comment |
Stack |
ROL Rd |
C:Rd = ROL(Rd:C) |
0 <= d <= 31 |
PC = PC + 1 |
000111dddddddddd |
Shifts all bits in Rd one place to the left. The C flag is shifted into bit 0 of Rd. Bit 7 is shifted into the C flag. This operation, combined with LSL, effectively multiplies multi-byte signed and unsigned values by two.
I |
– |
||
T |
– |
||
H |
⇔ |
Rd3 |
|
S |
⇔ |
N XOR V, for signed tests. |
|
V |
⇔ |
N XOR C, for N and C after the shift. |
|
N |
⇔ |
R7 |
Set if MSB of the result is set; cleared otherwise. |
Z |
⇔ |
~R7 AND ~R6 AND ~R5 AND ~R4 AND ~R3 AND ~R2 AND ~R1 AND ~R0 |
Set if the result is 0x00; cleared otherwise. |
C |
⇔ |
Rd7 |
Set if, before the shift, the MSB of Rd was set; cleared otherwise. |
R (Result) |
R (Result) equals Rd after the operation. |
lsl r18 ; Multiply r19:r18 by two rol r19 ; r19:r18 is a signed or unsigned two-byte integer brcs oneenc ; Branch if carry set ... oneenc: nop ; Branch destination (do nothing)
1 (2 bytes)
Name |
Cycles |
AVRe |
1 |
AVRxm |
1 |
AVRxt |
1 |
AVRrc |
1 |
Syntax: |
Operation: |
Operands: |
Program Counter: |
Opcode |
Comment |
Stack |
ROR Rd |
Rd:C = ROR(C:Rd) |
0 <= d <= 31 |
PC = PC + 1 |
1001010ddddd0111 |
Shifts all bits in Rd one place to the right. The C flag is shifted into bit 7 of Rd. Bit 0 is shifted into the C flag. This operation, combined with ASR, effectively divides multi-byte signed values by two. Combined with LSR, it effectively divides multi-byte unsigned values by two. The Carry flag can be used to round the result.
I |
– |
||
T |
– |
||
H |
– |
||
S |
⇔ |
N XOR V, for signed tests. |
|
V |
⇔ |
N XOR C, for N and C after the shift. |
|
N |
⇔ |
R7 |
Set if MSB of the result is set; cleared otherwise. |
Z |
⇔ |
~R7 AND ~R6 AND ~R5 AND ~R4 AND ~R3 AND ~R2 AND ~R1 AND ~R0 |
Set if the result is 0x00; cleared otherwise. |
C |
⇔ |
Rd0 |
Set if, before the shift, the LSB of Rd was set; cleared otherwise. |
R (Result) |
R (Result) equals Rd after the operation. |
lsr r19 ; Divide r19:r18 by two ror r18 ; r19:r18 is an unsigned two-byte integer brcc zeroenc1 ; Branch if carry cleared asr r17 ; Divide r17:r16 by two ror r16 ; r17:r16 is a signed two-byte integer brcc zeroenc2 ; Branch if carry cleared ... zeroenc1: nop ; Branch destination (do nothing) ... zeroenc1: nop ; Branch destination (do nothing)
1 (2 bytes)
Name |
Cycles |
AVRe |
1 |
AVRxm |
1 |
AVRxt |
1 |
AVRrc |
1 |
Syntax: |
Operation: |
Operands: |
Program Counter: |
Opcode |
Comment |
Stack |
SBCI Rd,K |
Rd = Rd - K - C |
16 <= d <= 31, 0 <= K <= 255 |
PC = PC + 1 |
0100KKKKddddKKKK |
Subtracts a constant from a register and subtracts with the C flag, and places the result in the destination register Rd.
I |
– |
||
T |
– |
||
H |
⇔ |
~Rd3 AND K3 OR K3 AND R3 OR R3 AND ~Rd3 |
Set if there was a borrow from bit 3; cleared otherwise. |
S |
⇔ |
N XOR V, for signed tests. |
|
V |
⇔ |
Rd7 AND ~K7 AND ~R7 OR ~Rd7 AND K7 AND R7 |
Set if two's complement overflow resulted from the operation; cleared otherwise. |
N |
⇔ |
R7 |
Set if MSB of the result is set; cleared otherwise. |
Z |
⇔ |
~R7 AND ~R6 AND ~R5 AND ~R4 AND ~R3 AND ~R2 AND ~R1 AND ~R0 AND Z |
The previous value remains unchanged when the result is zero; cleared otherwise. |
C |
⇔ |
~Rd7 AND K7 OR K7 AND R7 OR R7 AND ~Rd7 |
Set if the absolute value of the constant plus previous carry is larger than the absolute value of Rd; cleared otherwise. |
R (Result) |
R (Result) equals Rd after the operation. |
; Subtract 0x4F23 from r17:r16 subi r16,0x23 ; Subtract low byte sbci r17,0x4F ; Subtract with carry high byte
1 (2 bytes)
Name |
Cycles |
AVRe |
1 |
AVRxm |
1 |
AVRxt |
1 |
AVRrc |
1 |
Syntax: |
Operation: |
Operands: |
Program Counter: |
Opcode |
Comment |
Stack |
SBC Rd,Rr |
Rd = Rd - Rr - C |
0 <= d <= 31, 0 <= r <= 31 |
PC = PC + 1 |
000010rdddddrrrr |
Subtracts two registers and subtracts with the C flag, and places the result in the destination register Rd.
I |
– |
||
T |
– |
||
H |
⇔ |
~Rd3 AND Rr3 OR Rr3 AND R3 OR R3 AND ~Rd3 |
Set if there was a borrow from bit 3; cleared otherwise. |
S |
⇔ |
N XOR V, for signed tests. |
|
V |
⇔ |
Rd7 AND ~Rr7 AND ~R7 OR ~Rd7 AND Rr7 AND R7 |
Set if two's complement overflow resulted from the operation; cleared otherwise. |
N |
⇔ |
R7 |
Set if MSB of the result is set; cleared otherwise. |
Z |
⇔ |
~R7 AND ~R6 AND ~R5 AND ~R4 AND ~R3 AND ~R2 AND ~R1 AND ~R0 AND Z |
The previous value remains unchanged when the result is zero; cleared otherwise. |
C |
⇔ |
~Rd7 AND Rr7 OR Rr7 AND R7 OR R7 AND ~Rd7 |
Set if the absolute value of the contents of Rr plus previous carry is larger than the absolute value of the Rd; cleared otherwise. |
R (Result) |
R (Result) equals Rd after the operation. |
; Subtract r1:r0 from r3:r2 sub r2,r0 ; Subtract low byte sbc r3,r1 ; Subtract with carry high byte
1 (2 bytes)
Name |
Cycles |
AVRe |
1 |
AVRxm |
1 |
AVRxt |
1 |
AVRrc |
1 |
Syntax: |
Operation: |
Operands: |
Program Counter: |
Opcode |
Comment |
Stack |
SBIC A,b |
If I/O(A,b) == 0 then PC = PC + 2 (or 3) else PC = PC + 1 |
0 <= A <= 31, 0 <= b <= 7 |
PC = PC + 1, Condition false - no skip PC = PC + 2, Skip a one word instruction PC = PC + 3, Skip a two word instruction |
10011001AAAAAbbb |
This instruction tests a single bit in an I/O Register and skips the next instruction if the bit is cleared. This instruction operates on the lower 32 I/O Registers - addresses 0-31.
I |
– |
||
T |
– |
||
H |
– |
||
S |
– |
||
V |
– |
||
N |
– |
||
Z |
– |
||
C |
– |
wait: sbic 0x1C,1 ; Skip next instruction if 0x1C bit 1 is cleared rjmp wait ; Bit not cleared yet nop ; Continue (do nothing)
1 (2 bytes)
Name |
Cycles i |
ii |
iii |
AVRe |
1 |
2 |
3 |
AVRxm |
2 |
3 |
4 |
AVRxt |
1 |
2 |
3 |
AVRrc |
1 |
2 |
N/A |
i) If the condition is false (no skip).
ii) If the condition is true (skip is executed) and the instruction skipped is one word.
iii) If the condition is true (skip is executed) and the instruction skipped is two words.
Syntax: |
Operation: |
Operands: |
Program Counter: |
Opcode |
Comment |
Stack |
SBIS A,b |
If I/O(A,b) == 1 then PC = PC + 2 (or 3) else PC = PC + 1 |
0 <= A <= 31, 0 <= b <= 7 |
PC = PC + 1, Condition false - no skip PC = PC + 2, Skip a one word instruction PC = PC + 3, Skip a two word instruction |
10011011AAAAAbbb |
This instruction tests a single bit in an I/O Register and skips the next instruction if the bit is set. This instruction operates on the lower 32 I/O Registers - addresses 0-31.
I |
– |
||
T |
– |
||
H |
– |
||
S |
– |
||
V |
– |
||
N |
– |
||
Z |
– |
||
C |
– |
waitset: sbis 0x10,0 ; Skip next instruction if bit 0 at 0x10 is set rjmp waitset ; Bit not set nop ; Continue (do nothing)
1 (2 bytes)
Name |
Cycles i |
ii |
iii |
AVRe |
1 |
2 |
3 |
AVRxm |
2 |
3 |
4 |
AVRxt |
1 |
2 |
3 |
AVRrc |
1 |
2 |
N/A |
i) If the condition is false (no skip).
ii) If the condition is true (skip is executed) and the instruction skipped is one word.
iii) If the condition is true (skip is executed) and the instruction skipped is two words.
Syntax: |
Operation: |
Operands: |
Program Counter: |
Opcode |
Comment |
Stack |
SBIW Rd,K |
R[d+1]:Rd = R[d+1]:Rd - K |
d ∈ {24,26,28,30}, 0 <= K <= 63 |
PC = PC + 1 |
10010111KKddKKKK |
Subtracts an immediate value (0-63) from a register pair and places the result in the register pair. This instruction operates on the upper four register pairs and is well suited for operations on the Pointer Registers.
This instruction is not available on all devices. Refer to Appendix A.
I |
– |
||
T |
– |
||
H |
– |
||
S |
⇔ |
N XOR V, for signed tests. |
|
V |
⇔ |
~R15 AND Rdh7 |
Set if two's complement overflow resulted from the operation; cleared otherwise. |
N |
⇔ |
R15 |
Set if MSB of the result is set; cleared otherwise. |
Z |
⇔ |
~R15 AND ~R14 AND ~R13 AND ~R12 AND ~R11 AND ~R10 AND ~R9 AND ~R8 ANDR7 AND ~R6 AND ~R5 AND ~R4 AND ~R3 AND ~R2 AND ~R1 AND ~R0 |
Set if the result is 0x0000; cleared otherwise. |
C |
⇔ |
R15 AND ~Rdh7 |
Set if the absolute value of K is larger than the absolute value of Rd; cleared otherwise. |
R (Result) |
R (Result) equals R[d+1]:Rd after the operation. |
sbiw r24,1 ; Subtract 1 from r25:r24 sbiw YL,63 ; Subtract 63 from the Y-pointer(r29:r28)
1 (2 bytes)
Name |
Cycles |
AVRe |
2 |
AVRxm |
2 |
AVRxt |
2 |
AVRrc |
N/A |
Syntax: |
Operation: |
Operands: |
Program Counter: |
Opcode |
Comment |
Stack |
SBI A,b |
I/O(A,b) = 1 |
0 <= A <= 31, 0 <= b <= 7 |
PC = PC + 1 |
10011010AAAAAbbb |
Sets a specified bit in an I/O Register. This instruction operates on the lower 32 I/O Registers - addresses 0-31.
I |
– |
||
T |
– |
||
H |
– |
||
S |
– |
||
V |
– |
||
N |
– |
||
Z |
– |
||
C |
– |
sbi 0x1C,0 ; Set bit 0 at address 0x1C
1 (2 bytes)
Name |
Cycles |
AVRe |
2 |
AVRxm |
1 |
AVRxt |
1 |
AVRrc |
1 |
Syntax: |
Operation: |
Operands: |
Program Counter: |
Opcode |
Comment |
Stack |
SBRC Rr,b |
If Rr(b) == 0 then PC = PC + 2 (or 3) else PC = PC + 1 |
0 <= r <= 31, 0 <= b <= 7 |
PC = PC + 1, Condition false - no skip PC = PC + 2, Skip a one word instruction PC = PC + 3, Skip a two word instruction |
1111110rrrrr0bbb |
This instruction tests a single bit in a register and skips the next instruction if the bit is cleared.
Operation:
I |
– |
||
T |
– |
||
H |
– |
||
S |
– |
||
V |
– |
||
N |
– |
||
Z |
– |
||
C |
– |
sub r0,r1 ; Subtract r1 from r0 sbrc r0,7 ; Skip if bit 7 in r0 cleared sub r0,r1 ; Only executed if bit 7 in r0 not cleared nop ; Continue (do nothing)
1 (2 bytes)
Name |
Cycles i |
ii |
iii |
AVRe |
1 |
2 |
3 |
AVRxm |
1 |
2 |
3 |
AVRxt |
1 |
2 |
3 |
AVRrc |
1 |
2 |
N/A |
i) If the condition is false (no skip).
ii) If the condition is true (skip is executed) and the instruction skipped is one word.
iii) If the condition is true (skip is executed) and the instruction skipped is two words.
Syntax: |
Operation: |
Operands: |
Program Counter: |
Opcode |
Comment |
Stack |
SBRC Rr,b |
If Rr(b) == 0 then PC = PC + 2 (or 3) else PC = PC + 1 |
0 <= r <= 31, 0 <= b <= 7 |
PC = PC + 1, Condition false - no skip PC = PC + 2, Skip a one word instruction PC = PC + 3, Skip a two word instruction |
1111110rrrrr0bbb |
This instruction tests a single bit in a register and skips the next instruction if the bit is cleared.
Operation:
I |
– |
||
T |
– |
||
H |
– |
||
S |
– |
||
V |
– |
||
N |
– |
||
Z |
– |
||
C |
– |
sub r0,r1 ; Subtract r1 from r0 sbrc r0,7 ; Skip if bit 7 in r0 cleared sub r0,r1 ; Only executed if bit 7 in r0 not cleared nop ; Continue (do nothing)
1 (2 bytes)
Name |
Cycles i |
ii |
iii |
AVRe |
1 |
2 |
3 |
AVRxm |
1 |
2 |
3 |
AVRxt |
1 |
2 |
3 |
AVRrc |
1 |
2 |
N/A |
i) If the condition is false (no skip).
ii) If the condition is true (skip is executed) and the instruction skipped is one word.
iii) If the condition is true (skip is executed) and the instruction skipped is two words.
Syntax: |
Operation: |
Operands: |
Program Counter: |
Opcode |
Comment |
Stack |
SBRS Rr,b |
If Rr(b) == 1 then PC = PC + 2 (or 3) else PC = PC + 1 |
0 <= r <= 31, 0 <= b <= 7 |
PC = PC + 1, Condition false - no skip PC = PC + 2, Skip a one word instruction PC = PC + 3, Skip a two word instruction |
1111111rrrrr0bbb |
This instruction tests a single bit in a register and skips the next instruction if the bit is set.
I |
– |
||
T |
– |
||
H |
– |
||
S |
– |
||
V |
– |
||
N |
– |
||
Z |
– |
||
C |
– |
sub r0,r1 ; Subtract r1 from r0 sbrs r0,7 ; Skip if bit 7 in r0 set neg r0 ; Only executed if bit 7 in r0 not set nop ; Continue (do nothing)
1 (2 bytes)
Name |
Cycles i |
ii |
iii |
AVRe |
1 |
2 |
3 |
AVRxm |
1 |
2 |
3 |
AVRxt |
1 |
2 |
3 |
AVRrc |
1 |
2 |
N/A |
i) If the condition is false (no skip).
ii) If the condition is true (skip is executed) and the instruction skipped is one word.
iii) If the condition is true (skip is executed) and the instruction skipped is two words.
Syntax: |
Operation: |
Operands: |
Program Counter: |
Opcode |
Comment |
Stack |
SBRS Rr,b |
If Rr(b) == 1 then PC = PC + 2 (or 3) else PC = PC + 1 |
0 <= r <= 31, 0 <= b <= 7 |
PC = PC + 1, Condition false - no skip PC = PC + 2, Skip a one word instruction PC = PC + 3, Skip a two word instruction |
1111111rrrrr0bbb |
This instruction tests a single bit in a register and skips the next instruction if the bit is set.
I |
– |
||
T |
– |
||
H |
– |
||
S |
– |
||
V |
– |
||
N |
– |
||
Z |
– |
||
C |
– |
sub r0,r1 ; Subtract r1 from r0 sbrs r0,7 ; Skip if bit 7 in r0 set neg r0 ; Only executed if bit 7 in r0 not set nop ; Continue (do nothing)
1 (2 bytes)
Name |
Cycles i |
ii |
iii |
AVRe |
1 |
2 |
3 |
AVRxm |
1 |
2 |
3 |
AVRxt |
1 |
2 |
3 |
AVRrc |
1 |
2 |
N/A |
i) If the condition is false (no skip).
ii) If the condition is true (skip is executed) and the instruction skipped is one word.
iii) If the condition is true (skip is executed) and the instruction skipped is two words.
Syntax: |
Operation: |
Operands: |
Program Counter: |
Opcode |
Comment |
Stack |
SBR Rd,K |
Rd = Rd OR K |
16 <= d <= 31, 0 <= K <= 255 |
PC = PC + 1 |
Equivalent to ORI Rd,K. |
Sets specified bits in register Rd. Performs the logical ORI between the contents of register Rd and a constant mask K, and places the result in the destination register Rd. (Equivalent to ORI Rd,K.)
I |
– |
||
T |
– |
||
H |
– |
||
S |
⇔ |
N XOR V, for signed tests. |
|
V |
0 |
0 |
Cleared. |
N |
⇔ |
R7 |
Set if MSB of the result is set; cleared otherwise. |
Z |
⇔ |
~R7 AND ~R6 AND ~R5 AND ~R4 AND ~R3 AND ~R2 AND ~R1 AND ~R0 |
Set if the result is 0x00; cleared otherwise. |
C |
– |
||
R (Result) |
R (Result) equals Rd after the operation. |
sbr r16,3 ; Set bits 0 and 1 in r16 sbr r17,0xF0 ; Set 4 MSB in r17
1 (2 bytes)
Name |
Cycles |
AVRe |
1 |
AVRxm |
1 |
AVRxt |
1 |
AVRrc |
1 |
Syntax: |
Operation: |
Operands: |
Program Counter: |
Opcode |
Comment |
Stack |
SEC |
C = 1 |
None |
PC = PC + 1 |
1001010000001000 |
Sets the Carry (C) flag in SREG (Status Register). (Equivalent to instruction BSET 0.)
I |
– |
||
T |
– |
||
H |
– |
||
S |
– |
||
V |
– |
||
N |
– |
||
Z |
– |
||
C |
1 |
1 |
Carry flag set. |
sec ; Set Carry flag adc r0,r1 ; r0=r0+r1+1
1 (2 bytes)
Name |
Cycles |
AVRe |
1 |
AVRxm |
1 |
AVRxt |
1 |
AVRrc |
1 |
Syntax: |
Operation: |
Operands: |
Program Counter: |
Opcode |
Comment |
Stack |
SEH |
H = 1 |
None |
PC = PC + 1 |
1001010001011000 |
Sets the Half Carry (H) flag in SREG (Status Register). (Equivalent to instruction BSET 5.)
I |
– |
||
T |
– |
||
H |
1 |
1 |
Half Carry flag set. |
S |
– |
||
V |
– |
||
N |
– |
||
Z |
– |
||
C |
– |
seh ; Set Half Carry flag
1 (2 bytes)
Name ...........continued Name AVRxm AVRxt AVRrc |
Cycles Cycles 1 1 1 |
AVRe |
1 |
Syntax: |
Operation: |
Operands: |
Program Counter: |
Opcode |
Comment |
Stack |
SEI |
I = 1 |
None |
PC = PC + 1 |
1001010001111000 |
Sets the Global Interrupt Enable (I) bit in SREG (Status Register). The instruction following SEI will be executed before any pending interrupts.
I |
1 |
1 |
Global Interrupt Enable bit set. |
T |
– |
||
H |
– |
||
S |
– |
||
V |
– |
||
N |
– |
||
Z |
– |
||
C |
– |
sei ; set global interrupt enable sleep ; enter sleep, waiting for interrupt ; note: will enter sleep before any pending interrupt(s)
1 (2 bytes)
Name |
Cycles |
AVRe |
1 |
AVRxm |
1 |
AVRxt |
1 |
AVRrc |
1 |
Syntax: |
Operation: |
Operands: |
Program Counter: |
Opcode |
Comment |
Stack |
SEN |
N = 1 |
None |
PC = PC + 1 |
1001010000101000 |
Sets the Negative (N) flag in SREG (Status Register). (Equivalent to instruction BSET 2.)
I |
– |
||
T |
– |
||
H |
– |
||
S |
– |
||
V |
– |
||
N |
1 |
1 |
Negative flag set. |
Z |
– |
||
C |
– |
add r2,r19 ; Add r19 to r2 sen ; Set Negative flag
1 (2 bytes)
Name |
Cycles |
AVRe |
1 |
AVRxm |
1 |
AVRxt |
1 |
AVRrc |
1 |
Syntax: |
Operation: |
Operands: |
Program Counter: |
Opcode |
Comment |
Stack |
SER Rd |
Rd = 0xFF |
16 <= d <= 31 |
PC = PC + 1 |
11101111dddd1111 |
Loads 0xFF directly to register Rd. (Equivalent to instruction LDI Rd,0xFF).
I |
– |
||
T |
– |
||
H |
– |
||
S |
– |
||
V |
– |
||
N |
– |
||
Z |
– |
||
C |
– |
clr r16 ; Clear r16 ser r17 ; Set r17 out 0x18,r16 ; Write zeros to Port B nop ; Delay (do nothing) out 0x18,r17 ; Write ones to Port B
1 (2 bytes)
Name |
Cycles |
AVRe |
1 |
AVRxm |
1 |
AVRxt |
1 |
AVRrc |
1 |
Syntax: |
Operation: |
Operands: |
Program Counter: |
Opcode |
Comment |
Stack |
SES |
S = 1 |
None |
PC = PC + 1 |
1001010001001000 |
Sets the Sign (S) flag in SREG (Status Register). (Equivalent to instruction BSET 4.)
I |
– |
||
T |
– |
||
H |
– |
||
S |
1 |
1 |
Sign flag set. |
V |
– |
||
N |
– |
||
Z |
– |
||
C |
– |
add r2,r19 ; Add r19 to r2 ses ; Set Negative flag
1 (2 bytes)
Name |
Cycles |
AVRe |
1 |
AVRxm |
1 |
AVRxt |
1 |
AVRrc |
1 |
Syntax: |
Operation: |
Operands: |
Program Counter: |
Opcode |
Comment |
Stack |
SET |
T = 1 |
None |
PC = PC + 1 |
1001010001101000 |
Sets the T bit in SREG (Status Register). (Equivalent to instruction BSET 6.)
I |
– |
||
T |
1 |
1 |
T bit set. |
H |
– |
||
S |
– |
||
V |
– |
||
N |
– |
||
Z |
– |
||
C |
– |
set ; Set T bit
1 (2 bytes)
Name ...........continued Name AVRxm AVRxt AVRrc |
Cycles Cycles 1 1 1 |
AVRe |
1 |
Syntax: |
Operation: |
Operands: |
Program Counter: |
Opcode |
Comment |
Stack |
SEV |
V = 1 |
None |
PC = PC + 1 |
1001010000111000 |
Sets the Overflow (V) flag in SREG (Status Register). (Equivalent to instruction BSET 3.)
I |
– |
||
T |
– |
||
H |
– |
||
S |
– |
||
V |
1 |
V: 1 |
Overflow flag set. |
N |
– |
||
Z |
– |
||
C |
– |
add r2,r19 ; Add r19 to r2 sev ; Set Overflow flag
1 (2 bytes)
Name |
Cycles |
AVRe |
1 |
AVRxm |
1 |
AVRxt |
1 |
AVRrc |
1 |
Syntax: |
Operation: |
Operands: |
Program Counter: |
Opcode |
Comment |
Stack |
SEZ |
Z = 1 |
None |
PC = PC + 1 |
1001010000011000 |
Sets the Zero (Z) flag in SREG (Status Register). (Equivalent to instruction BSET 1.)
I |
– |
||
T |
– |
||
H |
– |
||
S |
– |
||
V |
– |
||
N |
– |
||
Z |
1 |
1 |
Zero flag set. |
C |
– |
add r2,r19 ; Add r19 to r2 sez ; Set Zero flag
1 (2 bytes)
Name |
Cycles |
AVRe |
1 |
AVRxm |
1 |
AVRxt |
1 |
AVRrc |
1 |
Syntax: |
Operation: |
Operands: |
Program Counter: |
Opcode |
Comment |
Stack |
SLEEP |
Refer to the device documentation for a detailed description of SLEEP usage. |
None |
PC = PC + 1 |
1001010110001000 |
This instruction sets the circuit in sleep mode defined by the MCU Control Register.
I |
– |
||
T |
– |
||
H |
– |
||
S |
– |
||
V |
– |
||
N |
– |
||
Z |
– |
||
C |
– |
mov r0,r11 ; Copy r11 to r0 ldi r16,(1<<SE) ; Enable sleep mode out MCUCR, r16 sleep ; Put MCU in sleep mode
1 (2 bytes)
Name |
Cycles |
AVRe |
1 |
AVRxm |
1 |
AVRxt |
1 |
AVRrc |
1 |
Syntax: |
Operation: |
Operands: |
Program Counter: |
Opcode |
Comment |
Stack |
SPM |
PS(RAMPZ:Z) = 0xffff |
None |
PC = PC + 1 |
1001010111101000 |
Erase program memory page |
|
SPM |
PS(RAMPZ:Z) = R1:R0 |
None |
PC = PC + 1 |
1001010111101000 |
Write program memory word |
|
SPM |
PS(RAMPZ:Z) = R1:R0 |
None |
PC = PC + 1 |
1001010111101000 |
Load page buffer |
|
SPM |
PS(RAMPZ:Z) = BUFFER |
None |
PC = PC + 1 |
1001010111101000 |
Write page buffer to program memory |
|
SPM |
BLBITS = R1:R0 |
None |
PC = PC + 1 |
1001010111101000 |
Set Boot Loader Lock bits |
SPM can be used to erase a page in the program memory, to write a page in the program memory (that is already erased), and to set Boot Loader Lock bits. In some devices, the Program memory can be written one word at a time. In other devices, an entire page can be programmed simultaneously after first filling a temporary page buffer. In all cases, the program memory must be erased one page at a time. When erasing the program memory, the RAMPZ and Z-register are used as page address. When writing the program memory, the RAMPZ and Z-register are used as page or word address, and the R1:R0 register pair is used as data(1). The Flash is word-accessed for code space write operations, so the least significant bit of the RAMPZ register concatenated with the Z register should
be set to ‘0'. When setting the Boot Loader Lock bits, the R1:R0 register pair is used as data. Refer to the device documentation for the detailed description of SPM usage. This instruction can address the entire program memory.
The SPM instruction is not available on all devices. Refer to Appendix A.
Note: 1. R1 determines the instruction high byte, and R0 determines the instruction low byte.
I |
– |
||
T |
– |
||
H |
– |
||
S |
– |
||
V |
– |
||
N |
– |
||
Z |
– |
||
C |
– |
; This example shows SPM write of one page for devices with page write ; - the routine writes one page of data from RAM to Flash ; the first data location in RAM is pointed to by the Y-pointer ; the first data location in Flash is pointed to by the Z-pointer ; - error handling is not included ; - the routine must be placed inside the boot space ; (at least the do_spm sub routine) ; - registers used: r0, r1, temp1, temp2, looplo, loophi, spmcrval ; (temp1, temp2, looplo, loophi, spmcrval must be defined by the user) ; storing and restoring of registers is not included in the routine ; register usage can be optimized at the expense of code size equ PAGESIZEB = PAGESIZE*2 ; PAGESIZEB is page size in BYTES, not words org SMALLBOOTSTART write_page: ; page erase ldi spmcrval, (1<<PGERS) + (1<<SPMEN) call do_spm ; transfer data from RAM to Flash page buffer ldi looplo, low(PAGESIZEB) ; init loop variable ldi loophi, high(PAGESIZEB) ; not required for PAGESIZEB<=256 wrloop: ld r0, Y+ ld r1, Y+ ldi spmcrval, (1<<SPMEN) call do_spm adiw ZL, 2 sbiw looplo, 2 ; use subi for PAGESIZEB<=256 brne wrloop ; execute page write subi ZL, low(PAGESIZEB) ; restore pointer sbci ZH, high(PAGESIZEB) ; not required for PAGESIZEB<=256 ldi spmcrval, (1<<PGWRT) + (1<<SPMEN) call do_spm ; read back and check, optional ldi looplo, low(PAGESIZEB) ; init loop variable ldi loophi, high(PAGESIZEB) ; not required for PAGESIZEB<=256 subi YL, low(PAGESIZEB) ; restore pointer sbci YH, high(PAGESIZEB) rdloop: lpm r0, Z+ ld r1, Y+ cpse r0, r1 jmp error sbiw looplo, 2 ; use subi for PAGESIZEB<=256 brne rdloop ret ; return do_spm: in temp2, SREG ; input: spmcrval determines SPM action cli ; disable interrupts if enabled, store status wait: in temp1, SPMCR ; check for previous SPM complete sbrc temp1, SPMEN rjmp wait out SPMCR, spmcrval ; SPM timed sequence spm out SREG, temp2 ; restore SREG (to enable interrupts if ; originally enabled) ret
1 (2 bytes)
Name |
Cycles |
AVRe |
-(1) |
AVRxm |
N/A |
AVRxt |
N/A |
AVRrc |
N/A |
Note:
1.
Varies with the programming time of the device.
Syntax: |
Operation: |
Operands: |
Program Counter: |
Opcode |
Comment |
Stack |
SPM |
PS(RAMPZ:Z) = 0xffff |
None |
PC = PC + 1 |
1001010111101000 |
Erase program memory page |
|
SPM |
PS(RAMPZ:Z) = R1:R0 |
None |
PC = PC + 1 |
1001010111101000 |
Write to program memory word(1) |
|
SPM |
PS(RAMPZ:Z) = R1:R0 |
None |
PC = PC + 1 |
1001010111101000 |
Load Page Buffer(2) |
|
SPM |
PS(RAMPZ:Z) = BUFFER |
None |
PC = PC + 1 |
1001010111101000 |
Write Page Buffer to program memory(2) |
|
SPM Z+ |
PS(RAMPZ:Z) = 0xfff, Z = Z + 2 |
None |
PC = PC + 1 |
1001010111111000 |
Erase program memory page, Z post incremented |
|
SPM Z+ |
PS(RAMPZ:Z) = R1:R0, Z = Z + 2 |
None |
PC = PC + 1 |
1001010111111000 |
Write to program memory word, Z post incremented(1) |
|
SPM Z+ |
PS(RAMPZ:Z) = R1:R0, Z = Z + 2 |
None |
PC = PC + 1 |
1001010111111000 |
Load Page Buffer, Z post incremented(2) |
|
SPM Z+ |
PS(RAMPZ:Z) =BUFFER, Z = Z + 2 |
None |
PC = PC + 1 |
1001010111111000 |
Write Page Buffer to program memory, Z post incremented(2) |
SPM can be used to erase a page in the program memory and to write a page in the program memory (that is already erased). In some devices, the program memory can be written one word at a time. In other devices, an entire page can be programmed simultaneously after first filling a temporary page buffer. In all cases, the program memory must be erased one page at a time. When erasing the program memory, the RAMPZ and Z-register are used as page address. When writing the program memory, the RAMPZ and Z-register are used as page or word address, and the R1:R0 register pair is used as data(1). The Flash is word-accessed for code space write operations, so the least
significant bit of the RAMPZ register concatenated with the Z register should be set to ‘0'.
Refer to the device documentation for a detailed description of SPM usage. This instruction can address the entire program memory.
The SPM instruction is not available on all devices. Refer to Appendix A.
Note: 1. R1 determines the instruction high byte, and R0 determines the instruction low byte.
Notes:
1.
Not all devices can write directly to program memory, see device data sheet for detailed description of SPM usage.
2.
Not all devices have a page buffer, see device data sheet for detailed description of SPM usage.
I |
– |
||
T |
– |
||
H |
– |
||
S |
– |
||
V |
– |
||
N |
– |
||
Z |
– |
||
C |
– |
1 (2 bytes)
Name |
Cycles i-iv |
v-viii |
AVRe |
N/A |
N/A |
AVRxm |
-(1) |
-(1) |
AVRxt |
-(1) |
-(1) |
AVRrc |
N/A |
N/A |
Note:
1.
Varies with the programming time of the device.
Syntax: |
Operation: |
Operands: |
Program Counter: |
Opcode |
Comment: |
Stack |
ST Y, Rr |
DS(Y) = Rr |
0 <= r <= 31 |
PC = PC + 1 |
1000001rrrrr1000 |
Y: Unchanged |
|
ST Y+, Rr |
DS(Y) = Rr, Y = Y+1 |
0 <= r <= 31 |
PC = PC + 1 |
1001001rrrrr1001 |
Y: Post incremented |
|
ST -Y, Rr |
Y = Y - 1, DS(Y) = Rr |
0 <= r <= 31 |
PC = PC + 1 |
1001001rrrrr1010 |
Y: Pre decremented |
|
STD Y+q, Rr |
DS(Y+q) = Rr |
0 <= r <= 31, 0 <= q <= 63 |
PC = PC + 1 |
10q0qq1rrrrr1qqq |
Y: Unchanged, q: Displacement |
Stores one byte indirect with or without displacement from a register to data space. The data space usually consists of the Register File, I/O memory, and SRAM, refer to the device data sheet for a detailed definition of the data space.
The data location is pointed to by the Y (16-bit) Pointer Register in the Register File. Memory access is limited to the current data segment of 64 KB. To access another data segment in devices with more than 64 KB data space, the RAMPY in the register in the I/O area has to be changed.
The Y-Pointer Register can either be left unchanged by the operation, or it can be post-incremented or pre- decremented. These features are especially suited for accessing arrays, tables, and Stack Pointer usage of the Y-Pointer Register. Note that only the low byte of the Y-pointer is updated in devices with no more than 256 bytes of data space. For such devices, the high byte of the pointer is not used by this instruction and can be used for other purposes. The RAMPY Register in the I/O area is updated in parts with more than 64 KB data space or more than 64 KB program memory, and the increment/ decrement/displacement is added to the entire 24-bit address on such devices.
Not all variants of this instruction are available on all devices.
The result of these combinations is undefined:
ST Y+, r28
ST Y+, r29
ST -Y, r28
ST -Y, r29
Using the Y-pointer:
I |
– |
||
T |
– |
||
H |
– |
||
S |
– |
||
V |
– |
||
N |
– |
||
Z |
– |
||
C |
– |
clr r29 ; Clear Y high byte ldi r28,0x60 ; Set Y low byte to 0x60 st Y+,r0 ; Store r0 in data space loc. 0x60(Y post inc) st Y,r1 ; Store r1 in data space loc. 0x61 ldi r28,0x63 ; Set Y low byte to 0x63 st Y,r2 ; Store r2 in data space loc. 0x63 st -Y,r3 ; Store r3 in data space loc. 0x62(Y pre dec) std Y+2,r4 ; Store r4 in data space loc. 0x64
1 (2 bytes)
Name |
Cycles (i) |
(ii) |
(iii) |
(iv) |
AVRe |
2(1) |
2(1) |
2(1) |
2(1) |
AVRxm |
1(1) |
1(1) |
2(1) |
2(1) |
AVRxt |
1(2) |
1(2) |
1(2) |
1(2) |
AVRrc |
1 |
1 |
2 |
N/A |
Notes:
1.
Cycle times for data memory access assume internal RAM access and are not valid for accessing external RAM.
2.
Cycle time for data memory access assumes internal RAM access, and are not valid for access to NVM. A minimum of one extra cycle must be added when accessing NVM. The additional time varies dependent on the NVM module implementation. See the NVMCTRL section in the specific devices data sheet for more information.
Syntax: |
Operation: |
Operands: |
Program Counter: |
Opcode |
Comment: |
Stack |
ST Z, Rr |
DS(Z) =Rr |
0 <= r <= 31 |
PC = PC + 1 |
1000001rrrrr0000 |
Z: Unchanged |
|
ST Z+, Rr |
DS(Z) = Rr, Z = Z+1 |
0 <= r <= 31 |
PC = PC + 1 |
1001001rrrrr0001 |
Z: Post incremented |
|
ST -Z, Rr |
Z = Z - 1, DS(Z) = Rr |
0 <= r <= 31 |
PC = PC + 1 |
1001001rrrrr0010 |
Z: Pre decremented |
|
STD Z+q, Rr |
DS(Z+q) = Rr |
0 <= r <= 31, 0 <= q <= 63 |
PC = PC + 1 |
10q0qq1rrrrr0qqq |
Z: Unchanged, q: Displacement |
Stores one byte indirect with or without displacement from a register to data space. The data space usually consists of the Register File, I/O memory, and SRAM, refer to the device data sheet for a detailed definition of the data space.
The data location is pointed to by the Z (16-bit) Pointer Register in the Register File. Memory access is limited to the current data segment of 64 KB. To access another data segment in devices with more than 64 KB data space, the RAMPZ in the register in the I/O area has to be changed.
The Z-Pointer Register can either be left unchanged by the operation, or it can be post-incremented or pre- decremented. These features are especially suited for Stack Pointer usage of the Z-Pointer Register. However, because the Z-Pointer Register can be used for indirect subroutine calls, indirect jumps, and table look-up, it is often more convenient to use the X- or Y-pointer as a dedicated Stack Pointer. Note that only the low byte of the Z-pointer is updated in devices with no more than 256 bytes of data space. For such devices, the high byte of the pointer is not used by this instruction and can be used for other purposes. The RAMPZ Register in the I/O area is updated in parts with more than 64 KB data space or more than 64 KB program memory, and the increment/decrement/displacement is added to the entire 24-bit address on such devices.
Not all variants of this instruction are available on all devices.
The result of these combinations is undefined:
ST Z+, r30
ST Z+, r31
ST -Z, r30
ST -Z, r31
Using the Z-pointer:
I |
– |
||
T |
– |
||
H |
– |
||
S |
– |
||
V |
– |
||
N |
– |
||
Z |
– |
||
C |
– |
clr r31 ; Clear Z high byte ldi r30,0x60 ; Set Z low byte to 0x60 st Z+,r0 ; Store r0 in data space loc. 0x60(Z post inc) st Z,r1 ; Store r1 in data space loc. 0x61 ldi r30,0x63 ; Set Z low byte to 0x63 st Z,r2 ; Store r2 in data space loc. 0x63 st -Z,r3 ; Store r3 in data space loc. 0x62(Z pre dec) std Z+2,r4 ; Store r4 in data space loc. 0x64
1 (2 bytes)
Name |
Cycles (i) |
(ii) |
(iii) |
(iv) |
AVRe |
2(1) |
2(1) |
2(1) |
2(1) |
AVRxm |
1(1) |
1(1) |
2(1) |
2(1) |
AVRxt |
1(2) |
1(2) |
1(2) |
1(2) |
AVRrc |
1 |
1 |
2 |
N/A |
Notes:
1.
Cycle times for data memory access assume internal RAM access and are not valid for accessing external RAM.
2.
Cycle time for data memory access assumes internal RAM access, and are not valid for access to NVM. A minimum of one extra cycle must be added when accessing NVM. The additional time varies dependent on the NVM module implementation. See the NVMCTRL section in the specific devices data sheet for more information.
Syntax: |
Operation: |
Operands: |
Program Counter: |
Opcode |
Comment |
Stack |
STS k,Rr |
(k) = Rr |
16 <= r <= 31, 0 <= k <= 127 |
PC = PC + 1 |
10101kkkddddkkkk |
Stores one byte from a Register to the data space. The data space usually consists of the Register File, I/O memory, and SRAM, refer to the device data sheet for a detailed definition of the data space.
A 7-bit address must be supplied. The address given in the instruction is coded to a data space address as follows:
ADDR[7:0] = (INST[8], INST[8], INST[10], INST[9], INST[3], INST[2], INST[1], INST[0])
Memory access is limited to the address range 0x40...0xbf of the data segment.
This instruction is not available on all devices. Refer to Appendix A.
I |
– |
||
T |
– |
||
H |
– |
||
S |
– |
||
V |
– |
||
N |
– |
||
Z |
– |
||
C |
– |
lds r16,0x00 ; Load r16 with the contents of data space location 0x00 add r16,r17 ; add r17 to r16 sts 0x00,r16 ; Write result to the same address it was fetched from
1 (2 bytes)
Name Note: Registers r0...r15 are remapped to r16...r31. |
Cycles |
AVRe |
N/A |
AVRxm |
N/A |
AVRxt |
N/A |
AVRrc |
1 |
Syntax: |
Operation: |
Operands: |
Program Counter: |
Opcode |
Comment |
Stack |
STS k,Rr |
DS(k) = Rr |
0 <= r <= 31, 0 <= k <= 65535 |
PC = PC + 2 |
1001001ddddd0000kkkkkkkkkkkkkkkk |
Stores one byte from a Register to the data space. The data space usually consists of the Register File, I/O memory, and SRAM, refer to the device data sheet for a detailed definition of the data space.
A 16-bit address must be supplied. Memory access is limited to the current data segment of 64 KB. The STS instruction uses the RAMPD Register to access memory above 64 KB. To access another data segment in devices with more than 64 KB data space, the RAMPD in the register in the I/O area has to be changed.
This instruction is not available on all devices. Refer to Appendix A.
I |
– |
||
T |
– |
||
H |
– |
||
S |
– |
||
V |
– |
||
N |
– |
||
Z |
– |
||
C |
– |
lds r2,0xFF00 ; Load r2 with the contents of data space location 0xFF00 add r2,r1 ; add r1 to r2 sts 0xFF00,r2 ; Write back
2 (4 bytes)
Name |
Cycles |
AVRe |
2(1) |
AVRxm |
2(1) |
AVRxt |
2(2) |
AVRrc |
N/A |
Notes:
1.
Cycle times for data memory access assume internal RAM access and are not valid for accessing external RAM.
2.
Cycle time for data memory access assumes internal RAM access, and are not valid for access to NVM. A minimum of one extra cycle must be added when accessing NVM. The additional time varies dependent on the NVM module implementation. See the NVMCTRL section in the specific devices data sheet for more information.
Syntax: |
Operation: |
Operands: |
Program Counter: |
Opcode |
Comment: |
Stack |
ST X, Rr |
DS(X) = Rr |
0 <= r <= 31 |
PC = PC + 1 |
1001001rrrrr1100 |
X: Unchanged |
|
ST X+, Rr |
DS(X) = Rr, X = X+1 |
0 <= r <= 31 |
PC = PC + 1 |
1001001rrrrr1101 |
X: Post incremented |
|
ST -X, Rr |
X = X - 1, DS(X) = Rr |
0 <= r <= 31 |
PC = PC + 1 |
1001001rrrrr1110 |
X: Pre decremented |
Stores one byte indirect from a register to data space. The data space usually consists of the Register File, I/O memory, and SRAM, refer to the device data sheet for a detailed definition of the data space.
The data location is pointed to by the X (16-bit) Pointer Register in the Register File. Memory access is limited to the current data segment of 64 KB. To access another data segment in devices with more than 64 KB data space, the RAMPX in the register in the I/O area has to be changed.
The X-Pointer Register can either be left unchanged by the operation, or it can be post-incremented or pre- decremented. These features are especially suited for accessing arrays, tables, and Stack Pointer usage of the X-Pointer Register. Note that only the low byte of the X-pointer is updated in devices with no more than 256 bytes of data space. For such devices, the high byte of the pointer is not used by this instruction and can be used for other
purposes. The RAMPX Register in the I/O area is updated in parts with more than 64 KB data space or more than 64 KB program memory, and the increment/ decrement is added to the entire 24-bit address on such devices.
Not all variants of this instruction are available on all devices.
The result of these combinations is undefined:
ST X+, r26
ST X+, r27
ST -X, r26
ST -X, r27
Using the X-pointer:
I |
– |
||
T |
– |
||
H |
– |
||
S |
– |
||
V |
– |
||
N |
– |
||
Z |
– |
||
C |
– |
clr r27 ; Clear X high byte ldi r26,0x60 ; Set X low byte to 0x60 st X+,r0 ; Store r0 in data space loc. 0x60(X post inc) st X,r1 ; Store r1 in data space loc. 0x61 ldi r26,0x63 ; Set X low byte to 0x63 st X,r2 ; Store r2 in data space loc. 0x63 st -X,r3 ; Store r3 in data space loc. 0x62(X pre dec)
1 (2 bytes)
Name |
Cycles (i) |
(ii) |
(iii) |
AVRxm |
1(1) |
1(1) |
1(2) |
AVRxt |
1(2) |
1(2) |
1(2) |
AVRrc |
1 |
1 |
2 |
AVRe |
2(1) |
2(1) |
2(1) |
Notes:
1.
Cycle times for data memory access assume internal RAM access and are not valid for accessing external RAM.
2.
Cycle time for data memory access assumes internal RAM access, and are not valid for access to NVM. A minimum of one extra cycle must be added when accessing NVM. The additional time varies dependent on the NVM module implementation. See the NVMCTRL section in the specific devices data sheet for more information.
Syntax: |
Operation: |
Operands: |
Program Counter: |
Opcode |
Comment |
Stack |
SUBI Rd,K |
Rd = Rd - K |
16 <= d <= 31, 0 <= K <= 255 |
PC = PC + 1 |
0101KKKKddddKKKK |
Subtracts a register and a constant, and places the result in the destination register Rd. This instruction is working on Register R16 to R31 and is very well suited for operations on the X, Y, and Z-pointers.
I |
– |
||
T |
– |
||
H |
⇔ |
~Rd3 AND K3 OR K3 AND R3 OR R3 AND ~Rd3 |
Set if there was a borrow from bit 3; cleared otherwise. |
S |
⇔ |
N XOR V, for signed tests. |
|
V |
⇔ |
Rd7 AND ~K7 AND ~R7 OR ~Rd7 AND K7 AND R7 |
Set if two's complement overflow resulted from the operation; cleared otherwise. |
N |
⇔ |
R7 |
Set if MSB of the result is set; cleared otherwise. |
Z |
⇔ |
~R7 AND ~R6 AND ~R5 AND ~R4 AND ~R3 AND ~R2 AND ~R1 AND ~R0 |
Set if the result is 0x00; cleared otherwise. |
C |
⇔ |
~Rd7 AND K7 OR K7 AND R7 OR R7 AND ~Rd7 |
Set if the absolute value of K is larger than the absolute value of Rd; cleared otherwise. |
R (Result) |
R (Result) equals Rd after the operation. |
subi r22,0x11 ; Subtract 0x11 from r22 brne noteq ; Branch if r22<>0x11 ... noteq: nop ; Branch destination (do nothing)
1 (2 bytes)
Name |
Cycles |
AVRe |
1 |
AVRxm |
1 |
AVRxt |
1 |
AVRrc |
1 |
Syntax: |
Operation: |
Operands: |
Program Counter: |
Opcode |
Comment |
Stack |
SUB Rd,Rr |
Rd = Rd - Rr |
0 <= d <= 31, 0 <= r <= 31 |
PC = PC + 1 |
000110rdddddrrrr |
Subtracts two registers and places the result in the destination register Rd.
I |
– |
||
T |
– |
||
H |
⇔ |
~Rd3 AND Rr3 OR Rr3 AND R3 OR R3 AND ~Rd3 |
Set if there was a borrow from bit 3; cleared otherwise. |
S |
⇔ |
N XOR V, for signed tests. |
|
V |
⇔ |
Rd7 AND ~Rr7 AND ~R7 OR ~Rd7 AND Rr7 AND R7 |
Set if two's complement overflow resulted from the operation; cleared otherwise. |
N |
⇔ |
R7 |
Set if MSB of the result is set; cleared otherwise. |
Z |
⇔ |
~R7 AND ~R6 AND ~R5 AND ~R4 AND ~R3 AND ~R2 AND ~R1 AND ~R0 |
Set if the result is 0x00; cleared otherwise. |
C |
⇔ |
~Rd7 AND Rr7 OR Rr7 AND R7 OR R7 AND ~Rd7 |
Set if the absolute value of the contents of Rr is larger than the absolute value of Rd; cleared otherwise. |
R (Result) |
R (Result) equals Rd after the operation. |
sub r13,r12 ; Subtract r12 from r13 brne noteq ; Branch if r12<>r13 ... noteq: nop ; Branch destination (do nothing)
1 (2 bytes)
Name |
Cycles |
AVRe |
1 |
AVRxm |
1 |
AVRxt |
1 |
AVRrc |
1 |
Syntax: |
Operation: |
Operands: |
Program Counter: |
Opcode |
Comment |
Stack |
SWAP Rd |
R(7:4) ↔ Rd(3:0) |
0 <= d <= 31 |
PC = PC + 1 |
1001010ddddd0010 |
Swaps high and low nibbles in a register.
I |
– |
||
T |
– |
||
H |
– |
||
S |
– |
||
V |
– |
||
N |
– |
||
Z |
– |
||
C |
– |
||
R (Result) |
R (Result) equals Rd after the operation. |
inc r1 ; Increment r1 swap r1 ; Swap high and low nibble of r1 inc r1 ; Increment high nibble of r1 swap r1 ; Swap back
1 (2 bytes)
Name |
Cycles |
AVRe |
1 |
AVRxm |
1 |
AVRxt |
1 |
AVRrc |
1 |
Syntax: |
Operation: |
Operands: |
Program Counter: |
Opcode |
Comment |
Stack |
TST Rd |
Rd = Rd AND Rd |
0 <= d <= 31 |
PC = PC + 1 |
001000dddddddddd |
Tests if a register is zero or negative. Performs a logical AND between a register and itself. The register will remain unchanged. (Equivalent to instruction AND Rd,Rd.)
I |
– |
||
T |
– |
||
H |
– |
||
S |
⇔ |
N XOR V, for signed tests. |
|
V |
0 |
0 |
Cleared. |
N |
⇔ |
R7 |
Set if MSB of the result is set; cleared otherwise. |
Z |
⇔ |
~R7 AND ~R6 AND ~R5 AND ~R4 AND ~R3 AND ~R2 AND ~R1 AND ~R0 |
Set if the result is 0x00; cleared otherwise. |
C |
– |
||
R (Result) |
R (Result) equals Rd. |
tst r0 ; Test r0 breq zero ; Branch if r0=0 ... zero: nop ; Branch destination (do nothing)
1 (2 bytes)
Name |
Cycles |
AVRe |
1 |
AVRxm |
1 |
AVRxt |
1 |
AVRrc |
1 |
Syntax: |
Operation: |
Operands: |
Program Counter: |
Opcode |
Comment |
Stack |
WDR |
WD timer restart. |
None |
PC = PC + 1 |
1001010110101000 |
This instruction resets the Watchdog Timer. This instruction must be executed within a limited time given by the WD prescaler. See the Watchdog Timer hardware specification.
I |
– |
||
T |
– |
||
H |
– |
||
S |
– |
||
V |
– |
||
N |
– |
||
Z |
– |
||
C |
– |
wdr ; Reset watchdog timer
1 (2 bytes)
Name |
Cycles |
AVRe |
1 |
AVRxm |
1 |
AVRxt |
1 |
AVRrc |
1 |
Syntax: |
Operation: |
Operands: |
Program Counter: |
Opcode |
Comment |
Stack |
XCH Z,Rd |
DS(Z) ↔ Rd |
0 <= d <= 31 |
PC = PC + 1 |
1001001rrrrr0100 |
Exchanges one byte indirect between the register and data space.
The data location is pointed to by the Z (16-bit) Pointer Register in the Register File. Memory access is limited to the current data segment of 64 KB. To access another data segment in devices with more than 64 KB data space, the RAMPZ in the register in the I/O area has to be changed.
The Z-Pointer Register is left unchanged by the operation. This instruction is especially suited for writing/reading status bits stored in SRAM.
I |
– |
||
T |
– |
||
H |
– |
||
S |
– |
||
V |
– |
||
N |
– |
||
Z |
– |
||
C |
– |
1 (2 bytes)
Name |
Cycles |
AVRe |
N/A |
AVRxm |
2 |
AVRxt |
N/A |
AVRrc |
N/A |