Data Transfer
Instruction | Operands | Description | Operation |
---|
mov | Rd, Rr | Move Rr to Rd | Rd = Rr |
ldi | Rd, K | Load K in Rd | Rd = k |
| Rd must be from R16 to R31 | | |
ld | Rd, X | Load (X) in Rd | Rd = *X |
| Rd, X+ | Load (X) in Rd, X is incremented | Rd = *X, X++ |
| Rd, -X | X is decremented, Load ( X ) in Rd | --X, Rd = X |
| All three registers can be used | | |
ldd | Rd, Y+q | Rd is loaded with (Y + q) | Rd = *(Y + q) |
| Register Z can also be used | Register X cannot be used. | q has to be between 0 and 63 |
lds | Rd, k | Load Rd with data in position k in memory. | Rd = *k |
| | | |
st | X, Rr | Store Rr in (X) | *X = Rr |
| X+, Rd | Store Rr in (X), X is incremented | *X = Rr, X++ |
| -X, Rd | X is decremented, Store Rr in ( X ) | X--, *X = Rr |
| All three registers can be used | | |
std | Y+q, Rr | stores Rr | *(Y + q) = Rr |
| Register Z can also be used. | Register X cannot be used. | q has to be between 0 and 63 |
sts | k, Rr | Store Rr in position k in memory. | *(k) = Rr |
| | | |
push | Rr | Push Rr to stack | SP--, *SP = Rr |
pop | Rd | Pop Rd from stack | Rd = *SP, SP++ |
Arithmetic
Instruction | Operands | Description | Operation |
---|
add | Rd, Rr | Add Rr to Rd | Rd += Rr |
sub | Rd, Rr | Subtract Rr from Rd | Rd -= Rr |
subi | Rd, K | Subtract K from Rd | Rd -= k |
| | | |
inc | Rd | Increment Rd | Rd++ |
dec | Rd | Decrement Rd | Rd-- |
neg | Rd | Change sign of Rd | Rd = -Rd |
mul | Rd, Rr | Unsigned multiply | R1:R0 = Rd * Rr |
Bitwise
Instruction | Operands | Description | Operation |
---|
and | Rd, Rr | Conjunction of Rd and Rr | Rd = Rd & Rr |
or | Rd, Rr | Disjunction of Rd and Rr | Rd = Rd | Rr |
eor | Rd, Rr | exclusive or of Rd and Rr | Rd = Rd ^ Rr |
lsl/lsr | Rd | Shift left/right | Shift into C flag |
rol/ror | Rd | Rotate left/right | Rotate with C flag |
asr | Rd | Arithmetic shift right | Sign extended shift |
Compare
Instruction | Operands | Description | Operation |
---|
cp | Rd, Rr | Subtract and update flags | RD - Rr |
cpi | Rd, K | Subtract K and update flags | Rd - K |
| Rd must be from R16 to R31 | K must be between 0 and 255 | |
Jump and Branching
Mnemonic | Operands | Description | Operation |
---|
jmp | k | unconditional jump | |
breq/brne | k | Branch if equal/ not equal | If Z=1 (or Z=0 ) then PC = PC + k + 1 otherwise PC += 1 |
| | | |
brsh/brlo | k | Branch if same or higher/lower (unsigned) | If C=1 (or C=0 ) then PC = PC + k + 1 otherwise PC += 1 |
| | | |
brge/brlt | k | Branch if greater or equal/lower (signed) | If S=1 (or S=0 ) then PC = PC + k + 1 otherwise PC += 1 |
| | | |
Call and Return
Mnemonic | Operands | Description | Operation |
---|
call | k | Call subroutine in position k | PC = k, SP -= 2, *SP = PC + 2 |
ret | | Return | PC = *SP, SP += 2 |
Mnemonic | Operands | Description | Operation |
---|
in | Rd, A | Load I/O data from address A to register Rd | Rd = I/O[A] |
out | A, Rd | Store value in register Rd in I/O address A | I/O[A] = Rd |