Таблицы команд ассемблера AVR

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