В этой статье я хочу представить еще один вариант таблиц команд ассемблера для микроконтроллеров AVR.
Из дополнительных материалов у приобретателей курса уже есть pdf документ с набором таблиц команд. Так в чем же основное отличие набора команд, который представлен ниже?
В первую очередь, тем что в колонке «Описание» дается описание команд на английском. И как не трудно заметить, многие мнемоники команд образованы как раз от этих сокращений. Поэтому, тем кто знает английский язык, тем будет проще запомнить написание команд. И так же присутствует колонка «Код операции», где можно посмотреть каким образом та или иная команда выглядит в двоичном виде. Это на тот случай, если вам вдруг захочется по-программировать в машинных кодах.
Сразу стоит отметить, что здесь представлены в основном только команды семейства tiny. Я намерено убрал команды семейства mega, что бы лишний раз не вносить путаницу.
Арифметические и логические команды
Команда | Описание | Действие | Циклы | Код операции | Флаги |
add Rd,Rr | Add two Registers | Rd←Rd+Rr | 1 | 0000 11rd dddd rrrr | Z,C,S,N,V,H |
adc Rd,Rr | Add with Carry two Registers | Rd←Rd+Rr+C | 1 | 0001 11rd dddd rrrr | Z,C,S,N,V,H |
adiw Rdl,K | Add Immediate to Word | Rdh:Rdl←Rdh:Rdl+K | 2 | 1001 0110 KKdd KKKK | Z,C,S,N,V |
sub Rd,Rr | Subtract two Registers | Rd←Rd-Rr | 1 | 0001 10rd dddd rrrr | Z,C,S,N,V,H |
sbc Rd,Rr | Subtract with Carry two Registers | Rd←Rd-Rr-C | 1 | 0000 10rd dddd rrrr | Z,C,S,N,V,H |
subi Rd,K | Subtract Constant from Register | Rd←Rd-K | 1 | 1010 KKKK dddd KKKK | Z,C,S,N,V,H |
sbci Rd,K | Subtract with Carry Constant from Register | Rd←Rd-K-C | 1 | 0100 KKKK dddd KKKK | Z,C,S,N,V,H |
sbiw Rdl,K | Subtract Immediate from Word | Rdh:Rdl←Rdh:Rdl-K | 2 | 1001 0111 KKdd KKKK | Z,C,S,N,V |
and Rd,Rr | Logical AND Registers | Rd←Rd AND Rr | 1 | 0010 00rd dddd rrrr | Z,S,N |
andi Rd,K | Logical AND Register and Constant | Rd←Rd AND K | 1 | 0111 KKKK dddd KKKK | Z,S,N |
or Rd,Rr | Logical OR Registers | Rd←Rd OR Rr | 1 | 0010 10rd dddd rrrr | Z,S,N |
ori Rd,K | Logical OR Register and Constant | Rd←Rd OR K | 1 | 0110 KKKK dddd KKKK | Z,S,N |
eor Rd,Rr | Exclusive OR Registers | Rd←Rd EOR Rr | 1 | 0010 01rd dddd rrrr | Z,S,N |
com Rd | One’s complement | Rd←0xFF-Rd | 1 | 1001 010d dddd 0000 | Z,S,N |
neg Rd | Two’s complement | Rd←0x00-Rd | 1 | 1001 010d dddd 0001 | Z,C,S,N,V,H |
sbr Rd,K | Set Bit (s) in Register | Rd←Rd OR K | 1 | 0110 KKKK dddd KKKK | Z,S,N |
cbr Rd,K | Clear Bit (s) in Register | Rd←Rd AND (0xFF- K) | 1 | 0111 KKKK dddd KKKK | Z,S,N |
inc Rd | Increment | Rd←Rd+1 | 1 | 1001 010d dddd 0011 | Z,S,N,V |
dec Rd | Decrement | Rd←Rd-1 | 1 | 1001 010d dddd 1010 | Z,S,N,V |
tst Rd | Test for Zero or Minus | Rd←Rd AND Rd | 1 | 0010 00dd dddd dddd | Z,S,N |
clr Rd | Clear Register | Rd←Rd EOR Rd | 1 | 0010 01dd dddd dddd | Z,S,N |
ser Rd | Set Register | Rd←0xFF | 1 | 1110 1111 dddd 1111 | None |
Команды пересылки данных
Команда | Описание | Действие | Циклы | Код операции | Флаги |
mov Rd,Rr | Move Between Registers | Rd←Rr | 1 | 0010 11rd dddd rrrr | None |
movw Rd,Rr | Copy Register Word | Rd+1:Rd←Rr+1:Rr | 1 | 0000 0001 dddd rrrr | None |
ldi Rd,K | Load Immediate | Rd←K | 1 | 1110 KKKK dddd KKKK | None |
ld Rd,X | Load Indirect | Rd← (X) | 2 | 1001 000d dddd 1100 | None |
ld Rd,X+ | Load Indirect and Post-Inc. |
Rd← (X), X←X+1 | 2 | 1001 000d dddd 1101 | None |
ld Rd, -X | Load Indirect and Pre-Dec. |
X←X-1, Rd← (X) | 2 | 1001 000d dddd 1110 | None |
ld Rd,Y | Load Indirect | Rd← (Y) | 2 | 1000 000d dddd 1000 | None |
ld Rd,Y+ | Load Indirect and Post-Inc. |
Rd← (Y), Y←Y+1 | 2 | 1001 000d dddd 1001 | None |
ld Rd, -Y | Load Indirect and Pre-Dec. |
Y←Y-1, Rd← (Y) | 2 | 1001 000d dddd 1010 | None |
ldd Rd,Y+q | Load Indirect with Displacement | Rd← (Y+q) | 2 | 10q0 qq0d dddd 1qqq | None |
ld Rd,Z | Load Indirect | Rd← (Z) | 2 | 1000 000d dddd 0000 | None |
ld Rd,Z+ | Load Indirect and Post-Inc. |
Rd← (Z), Z←Z+1 | 2 | 1001 000d dddd 0001 | None |
ld Rd, -Z | Load Indirect and Pre-Dec. |
Z←Z-1, Rd← (Z) | 2 | 1001 000d dddd 0010 | None |
ldd Rd,Z+q | Load Indirect with Displacement | Rd← (Z+q) | 2 | 10q0 qq0d dddd 0qqq | None |
lds Rd,k | Load Direct from SRAM | Rd← (k) | 2 | 1001 000d dddd 0000kkkk kkkk kkkk kkkk | None |
st X,Rr | Store Indirect | (X) ←Rr | 2 | 1001 001r rrrr 1100 | None |
st X+,Rr | Store Indirect and Post-Inc. |
(X) ←Rr, X←X+1 | 2 | 1001 001r rrrr 1101 | None |
st -X,Rr | Store Indirect and Pre-Dec. |
X←X-1, (X) ←Rr | 2 | 1001 001r rrrr 1110 | None |
st Y,Rr | Store Indirect | (Y) ←Rr | 2 | 1000 001r rrrr 1000 | None |
st Y+,Rr | Store Indirect and Post-Inc. |
(Y) ←Rr, Y←Y+1 | 2 | 1001 001r rrrr 1001 | None |
st -Y,Rr | Store Indirect and Pre-Dec. |
Y←Y-1, (Y) ←Rr | 2 | 1001 001r rrrr 1010 | None |
std Y+q,Rr | Store Indirect with Displacement | (Y+q) ← Rr | 2 | 10q0 qq1r rrrr 1qqq | None |
st Z,Rr | Store Indirect | (Z) ←Rr | 2 | 1000 001r rrrr 0000 | None |
st Z+,Rr | Store Indirect and Post-Inc. |
(Z) ←Rr, Z←Z+1 | 2 | 1001 001r rrrr 0001 | None |
st -Z,Rr | Store Indirect and Pre-Dec. |
Z←Z-1, (Z) ←Rr | 2 | 1001 001r rrrr 0010 | None |
std Z+q,Rr | Store Indirect with Displacement | (Z+q) ← Rr | 2 | 10q0 qq1r rrrr 0qqq | None |
sts k,Rr | Store Direct to SRAM | (k) ←Rr | 2 | 1001 001r rrrr 0000kkkk kkkk kkkk kkkk | None |
lpm | Load Program Memory | R0← (Z) | 3 | 1001 0101 1100 1000 | None |
lpm Rd,Z | Load Program Memory | Rd← (Z) | 3 | 1001 000d dddd 0100 | None |
lpm Rd,Z+ | Load Program Memory and Post-Inc. |
Rd← (Z), Z←Z+1 | 3 | 1001 000d dddd 0101 | None |
spm | Store Program Memory | (Z) ←R1:R0 | — | 1001 0101 1110 1000 | None |
in Rd,P | In Port | Rd←P | 1 | 1011 0PPd dddd PPPP | None |
out P,Rr | Out Port | P←Rr | 1 | 1011 1PPr rrrr PPPP | None |
push Rr | Push Register in Stack | STACK←Rr, SP←SP-1 | 2 | 1001 001r rrrr 1111 | None |
pop Rd | Pop Register from Stack | SP←SP+1, Rd←STACK | 2 | 1001 000d dddd 1111 | None |
Команды передачи управления
Команда | Описание | Действие | Циклы | Код операции | Флаги |
rjmp k | Relative Jump | PC←PC+k+1 | 2 | 1100 kkkk kkkk kkkk | None |
ijmp | Indirect Jump to (Z) | PC← (Z) | 2 | 1001 0100 0000 1001 | None |
*jmp k | Direct Jump | PC←k | 3 | 1001 010k kkkk 110kkkkk kkkk kkkk kkkk | None |
rcall k | Relative Subroutine Call | STACK←PC+1,PC←PC+k+1,SP←SP-2 or 3 | ¾ | 1101 kkkk kkkk kkkk | None |
icall | Indirect Call to (Z) | STACK←PC+1, PC← (Z),SP←SP-2 or 3 | ¾ | 1001 0101 0000 1001 | None |
*call k | Direct Subroutine Call | STACK←PC+1, PC←k,SP←SP-2 or 3 | 4/5 | 1001 010k kkkk 111kkkkk kkkk kkkk kkkk | None |
ret | Subroutine Return | PC←STACK, SP←SP+2 or 3 |
4/5 | 1001 0101 0000 1000 | None |
reti | Interrupt Return | PC←STACK, SP←SP+2 or 3 |
4/5 | 1001 0101 0001 1000 | I |
cpse Rd,Rr | Compare, Skip if Equal | if (Rd=Rr) PC←PC+2 or 3 |
½/3 | 0001 00rd dddd rrrr | None |
cp Rd,Rr | Compare | Rd-Rr | 1 | 0001 01rd dddd rrrr | Z,C,S, N,V,H |
cpc Rd,Rr | Compare with Carry | Rd-Rr-C | 1 | 0000 01rd dddd rrrr | Z,C,S, N,V,H |
cpi Rd,K | Compare Register with Immediate | Rd-Rr-K | 1 | 0011 KKKK dddd KKKK | Z,C,S, N,V,H |
sbrc Rr,b | Skip if Bit in Register is Cleared |
if (Rr (b)=0) PC←PC+2 or 3 |
½/3 | 1111 110r rrrr obbb | None |
sbrs Rr,b | Skip if Bit in Register is Set |
if (Rr (b)=1) PC←PC+2 or 3 |
½/3 | 1111 111r rrrr obbb | None |
sbic P,b | Skip if Bit in IO Register is Cleared |
if (P (b)=0) PC←PC+2 or 3 |
½/3 | 1001 1001 PPPP Pbbb | None |
sbis P,b | Skip if Bit in IO Register is Set |
if (P (b)=1) PC←PC+2 or 3 |
½/3 | 1001 1011 PPPP Pbbb | None |
brbc s,k | Branch if Status Flag is Cleared |
if (SREG (s)=0) PC←PC+k+1 |
½ | 1111 01kk kkkk ksss | None |
brbs s,k | Branch if Status Flag is Set |
if (SREG (s)=1) PC←PC+k+1 |
½ | 1111 00kk kkkk ksss | None |
brcc k | Branch if Carry Flag is Clearsd |
if (C=0) PC←PC+k+1 | ½ | 1111 01kk kkkk k000 | None |
brcs k | Branch if Carry Flag is Set |
if (C=1) PC←PC+k+1 | ½ | 1111 00kk kkkk k000 | None |
brsh k | Branch if Same or Higher |
if (C=0) PC←PC+k+1 | ½ | 1111 01kk kkkk k000 | None |
brlo k | Branch if Lower | if (C=1) PC←PC+k+1 | ½ | 1111 00kk kkkk k000 | None |
brne k | Branch if Not Equal | if (Z=0) PC←PC+k+1 | ½ | 1111 01kk kkkk k001 | None |
breq k | Branch if Equal | if (Z=1) PC←PC+k+1 | ½ | 1111 00kk kkkk k001 | None |
brpl k | Branch if Plus | if (N=0) PC←PC+k+1 | ½ | 1111 01kk kkkk k010 | None |
brmi k | Branch if Minus | if (N=1) PC←PC+k+1 | ½ | 1111 00kk kkkk k010 | None |
brvc k | Bruach if Overflow Flag is Cleared |
if (V=0) PC←PC+k+1 | ½ | 1111 01kk kkkk k011 | None |
brvs k | Branch if Overflow Flag is Set |
if (V=1) PC←PC+k+1 | ½ | 1111 00kk kkkk k011 | None |
brge k | Branch if Greate or Equal, Signed |
if (S=0) PC←PC+k+1 | ½ | 1111 01kk kkkk k100 | None |
brlt k | Branch if Less than Zero, Signed |
if (S=1) PC←PC+k+1 | ½ | 1111 00kk kkkk k100 | None |
brhc k | Branch if Half Carry Flag is Cleared |
if (H=0) PC←PC+k+1 | ½ | 1111 01kk kkkk k101 | None |
brhs k | Branch if Half Carry Flag is Set |
if (H=1) PC←PC+k+1 | ½ | 1111 00kk kkkk k101 | None |
brtc k | Branch if Transfer Flag is Cleared |
if (T=0) PC←PC+k+1 | ½ | 1111 01kk kkkk k110 | None |
brts k | Branch if Transfer Flag is Set |
if (T=1) PC←PC+k+1 | ½ | 1111 00kk kkkk k110 | None |
brid k | Branch if Interrupt Disable |
if (T=0) PC←PC+k+1 | ½ | 1111 01kk kkkk k111 | None |
brie k | Branch if Interrupt Enable |
if (T=1) PC←PC+k+1 | ½ | 1111 00kk kkkk k111 | None |
*Обратите внимание! Команды jmp и call не поддерживаются микроконтроллерами семейства tiny, но так как они часто используются при программировании семейства mega, то я решил их так же внести в таблицу, что бы вы не забывали о их существовании.
Команды условных переходов по состоянию флагов SREG
Проверкафлага | Команда условногоперехода | АльтернативнаяФорма написания | Условие перехода |
C | brbc 0,k | brcc k | Переход если флаг переноса установлен |
brsh k | Переход если больше или равно | ||
brbs 0,k | brcs k | Переход если флаг переноса сброшен | |
brlo k | Переход если меньше | ||
Z | brbc 1,k | breq k | Переход если равно |
brbs 1,k | brne k | Переход если не равно | |
N | brbc 2,k | brpl k | Переход если плюс |
brbs 2,k | brmi k | Переход если минус | |
V | brbc 3,k | brvc k | Переход если флаг дополнительного кода сброшен |
brbs 3,k | brvs k | Переход если флаг дополнительного кода установлен | |
S | brbc 4,k | brge k | Переход если больше или равно нулю (знаковое) |
brbs 4,k | brlt k | Переход если меньше нуля (знаковое) | |
H | brbc 5,k | brhc k | Переход если флаг половинного переноса сброшен |
brbs 5,k | brhs k | Переход если флаг половинного переноса установлен | |
T | brbc 6,k | brtc k | Переход если флаг хранения бита сброшен |
brbs 6,k | brts k | Переход если флаг хранения бита установлен | |
I | brbc 7,k | brid k | Переход если прерывания запрещены |
brbs 7,k | brie k | Переход если прерывания разрешены |
Команд битовых операций
Команда | Описание | Действие | Циклы | Код операции | Флаги |
sbi P,b | Set Bit in I/O Rerister | I/O (P,b) ←1 | 2 | 1001 1010 PPPP Pbbb | None |
cbi P,b | Clear Bit in I/ORerister | I/O (P,b) ←0 | 2 | 1001 1000 PPPP Pbbb | None |
lsl Rd | Logical Shift Left | Rd (n+1) ←Rd (n), Rd (0) ←0 | 1 | 0000 11dd dddd dddd | Z,C,N,V |
lsr Rd | Logical Shift Right | Rd (n) ←Rd (n+1), Rd (7) ←0 | 1 | 1001 010d dddd 0110 | Z,C,N,V |
rol Rd | Rotate Left through Carry | Rd (0) ←C, Rd (n+1) ←Rd (n), C←Rd (7) | 1 | 0001 11dd dddd dddd | Z,C,N,V |
ror Rd | Rotate Right through Carry | Rd (7) ←C, Rd (n) ←Rd (n+1), C←Rd (0) | 1 | 1001 010d dddd 0111 | Z,C,N,V |
asr Rd | Arithmetic Shift Right | Rd (n) ←Rd (n+1), n=0…6 |
1 | 1001 010d dddd 0101 | Z,C,N,V |
swap Rd | Swap Nibbles | Rd (3…0) ←Rd (7…4),Rd (7…4) ←Rd (3…0) | 1 | 1001 010d dddd 0010 | None |
bst Rr,b | Bit Store from Rerister to T |
T←Rr (b) | 1 | 1111 101b bbbb 0bbb | T |
bld Rd,b | Bit Load from T to Rerister |
Rd (b) ←T | 1 | 1111 100b bbbb 0bbb | None |
bset s | Flag Set | SREG (s) ←1 | 1 | 1001 0100 0sss 1000 | SREG (s) |
bclr s | Flag Clear | SREG (s) ←0 | 1 | 1001 0100 1sss 1000 | SREG (s) |
sec | Set Carry | C←1 | 1 | 1001 0100 0000 1000 | C |
clc | Clear Carry | C←0 | 1 | 1001 0100 1000 1000 | C |
sez | Set Zero Flag | Z←1 | 1 | 1001 0100 0001 1000 | Z |
clz | Clear Zero Flag | Z←0 | 1 | 1001 0100 1001 1000 | Z |
sen | Set Negative Flag | N←1 | 1 | 1001 0100 0010 1000 | N |
cln | Clear Negative Flag | N←0 | 1 | 1001 0100 1010 1000 | N |
sev | Set Twos Complement Overflow | V←1 | 1 | 1001 0100 0011 1000 | V |
clv | Clear Twos Complement Overflow | V←0 | 1 | 1001 0100 1011 1000 | V |
ses | Set Signed Test Flag | S←1 | 1 | 1001 0100 0100 1000 | S |
cls | Clear Signed Test Flag | S←0 | 1 | 1001 0100 1100 1000 | S |
seh | Set Half Carry Flag | H←1 | 1 | 1001 0100 0101 1000 | H |
clh | Clear Half Carry Flag | H←0 | 1 | 1001 0100 1101 1000 | H |
set | Set Transfer bit | T←1 | 1 | 1001 0100 0110 1000 | T |
clt | Clear Transfer bit | T←0 | 1 | 1001 0100 1110 1000 | T |
sei | Global Interrupt Enable | I←1 | 1 | 1001 0100 0111 1000 | I |
cli | Global Interrupt Disable | I←0 | 1 | 1001 0100 1111 1000 | I |
Команды управления процессором
Команда | Описание | Действие | Циклы | Код операции | Флаги |
nop | No operation | — | 1 | 0000 0000 0000 0000 | None |
sleep | Sleep | — | 1 | 1001 0101 1000 1000 | None |
wdr | Watchdog Reset | — | 1 | 1001 0101 1010 1000 | None |