В этой статье я хочу представить еще один вариант таблиц команд ассемблера для микроконтроллеров 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 |