В этой статье я хочу представить еще один вариант таблиц команд ассемблера для микроконтроллеров 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 | |
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 |
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 |
Меня часто спрашивают: «Чем отличается микроконтроллер от ПЛИС?» Ну что тут можно ответить? Это как бы разные вещи. .. Микропроцессор последовательно выполняет команды, описанные в его программе. Работа ПЛИС в конечном счете определяется принципиальной электрической схемой, реализованной внутри чипа. Архитектура микроконтроллера, то есть тип процессора, количество портов ввода вывода, интерфейсы, определяется производителем. Микросхема микроконтроллера изготовлена на заводе и изменить ее нельзя. Можно только написать программу, которую он будет исполнять. ПЛИС — это свобода для творчества. Архитектура реализуемого устройства может быть почти любая, лишь бы поместилась вся логика в чип. В ПЛИС можно, например, попробовать реализовать даже и микроконтроллер! Попробуем?
Один из самых распространенных микроконтроллеров — это 8-ми разрядные RISС процессоры семейства AVR компании Atmel. В этой статье я расскажу как реализовать «почти» совместимый с AVR микроконтроллер внутри нашей ПЛИС на плате Марсоход.
Прежде, чем начинать делать свою реализацию микроконтроллера, конечно, следует изучить внутренности контроллера AVR. Нужно как минимум знать систему команд микропроцессора AVR. На нашем сайте можно скачать его описание:
Система команд микроконтроллера AVR ( 703303 bytes )
Мы не будем ставить себе целью полностью повторить поведение чипа Atmel, мы хотим сделать наш микропроцессор лишь частично совместимым. Полностью повторить можно, но нужна ПЛИС гораздо большего объема. У нас на плате Марсоход стоит CPLD EPM240T100C5, значит у нас есть всего-навсего 240 триггеров и логических элементов.Кроме триггеров и логики в нашей ПЛИС имеется последовательная флеш память UFM объемом 512 слов по 16 бит. В этой флеш памяти мы будем хранить программу микроконтроллера. Удобно, что слова, хранимые во флеш, имеют разрядность 16. Все команды процессора AVR также шестнадцатиразрядные. Кое-что про UFM мы уже писали на нашем сайте. У нас был проект для ПЛИС платы Марсоход, который выполнял чтение из UFM памяти.
«Оперативной памяти» в нашей ПЛИС нет. Ну значит не будет памяти у нашего микроконтроллера, жаль но это нас не остановит.
У микроконтроллера AVR имеется 32 восьмиразрядных регистра общего назначения. Нижняя группа регистров r0-r15 может быть использована только в командах с операндами-регистрами. Верхняя группа регистров r16-r31 может использоваться в командах и с непосредственными операндами. Поскольку места внутри нашего чипа на плате Марсоход действительно не много, нам придется реализовать только некоторые регистры. Это довольно существенное ограничение, и его нужно будет учитывать при написании программ для нашего микроконтроллера.
Мы реализуем только 7 регистров: r16-r22:
Схема нашего микроконтроллера создана в среде Altera QuartusII и выглядит вот так (нажмите на картинку, чтобы увеличить):
Наш микроконтроллер работает по простому алгоритму:
У нас сейчас нет цели сделать высокопроизводительный микроконтроллер, мы не будем делать конвейерную обработку данных. Это объясняется тем, что команды из флеш памяти чипа мы можем считывать только в последовательном формате, то есть на чтение одной команды нужно как минимум 16 тактов. Быстрее здесь сделать нельзя (да нам и не нужно сейчас).
Ход выполнения программы может изменяться в зависимости от результата исполнения команд. Специальные команды переходов позволяют переходить к нужной операции в нужных условиях.
Перечислим команды микроконтроллера AVR, которые мы собираемся реализовать:
ADD 0000 11rd dddd rrrr
SUB 0001 10rd dddd rrrr
AND 0010 00rd dddd rrrr
EOR 0010 01rd dddd rrrr
OR 0010 10rd dddd rrrr
MOV 0010 11rd dddd rrrr
CP 0001 01rd dddd rrrr
LSR 1001 010d dddd 0110
SUBI 0101 KKKK dddd KKKK
ANDI 0111 KKKK dddd KKKK
ORI 0110 KKKK dddd KKKK
CPI 0011 KKKK dddd KKKK
LDI 1110 KKKK dddd KKKK
BREQ 1111 00kk kkkk k001
BRNE 1111 01kk kkkk k001
BRCS 1111 00kk kkkk k000
BRCC 1111 01kk kkkk k000
Слева написаны названия команд, а справа — их бинарное представление (кодирование). Так буква «r» обозначает регистр источник, буква «d» — регистр приемник, «K» — это непосредственно операнд.
Конечно — это только малая часть от «настоящей системы команд», но уже и эти команды позволять писать вполне работающие программы.
У нас будет упрощенное АЛУ (Арифметико-Логическое Устройство). Оно реализует только некоторые, наиболее употребительные команды, а так же всего 2 флага для условных переходов: «Z» и «C».
Флаг «Z» устанавливается, если результат АЛУ это ноль. Если результат из АЛУ не нулевой, то флаг «Z» сбрасывается. Флаг «C» устанавливается при возникновении переноса в арифметических операциях ADD и SUB/SUBI или сравнения CP/CPI. Флаги влияют на исполнение команд условных переходов: флаг «Z» влияет на BREQ, BRNE, а флаг «C» влияет на BRCS, BRCC.
Вообще всеь проект мы уже реализовали и его можно взять здесь:
Ядро микропроцессора Atmel AVR ( 109584 bytes )
.Теперь посмотрим, как мы сможем написать программу для нашего микроконтроллера? Для написания программы на языке ассемблер воспользуемся средой разработки компании Atmel AVRStudio4. Эту среду разработки можно скачать прямо с сайта компании Атмел (после регистрации), вот здесь. Или поищите в яндексе — наверняка найдете в свободном доступе.
Создаем проект в AVRStudio4 и пишем простую программу. Программа будет моргать светодиодом на плате Марсоход и опрашивать состояние нажатых кнопочек. Если нажать одну кнопочку, то моргающий светодиод «побежит» в одну сторону, а если нажать другую кнопочку, то светодиод «побежит» в другую сторону. Вот исходный текст на ассемблере для нашего примера:
.include «1200def.inc»
.device AT90S1200
.cseg
.org 0
start:
;initial one bit in register
ldi r16,$80
rd_port:
;read port (key status)
mov r17,r22
cpi r17,$0f
;go and blink one LED if no key pressed
breq do_xor
cpi r17,$0e
;go and right shift LEDs if key[0] pressed
breq do_rshift
cpi r17,$0d
;go and left shift LEDs if key[1] pressed
breq do_lshift
;jump to read keys
or r16,r16
brne rd_port
do_rshift:
cpi r16,1
breq set80
lsr r16
mov r20,r16
brne pause
set80:
ldi r16,$80
mov r20,r16
or r16,r16
brne pause
do_lshift:
cpi r16,$80
breq set1
lsl r16
mov r20,r16
brne pause
set1:
ldi r16,$01
mov r20,r16
or r16,r16
brne pause
do_xor:
eor r20,r16
pause:
ldi r18,$10
cycle2:
ldi r19,$FF
cycle1:
or r19,r19
or r19,r19
subi r19,1
brne cycle1
subi r18,1
brne cycle2
or r16,r16
brne rd_port
Видите? Чтение состояния кнопочек — это чтение из регистра r22. Изменение состояния светодиодов — это запись в регистр r20.
Настройте AVRStudio так, что бы выходной формат был «Generic». Это в свойствах проекта, «Assembler Options», настройка «Hex Output Format».
После компиляции программы получается вот такой текстовый файл с кодами программы:
000000:e800
000001:2f16
000002:301f
000003:f0c1
000004:301e
000005:f021
000006:301d
000007:f059
000008:2b00
000009:f7b9
00000a:3001
00000b:f019
00000c:9506
00000d:2f40
00000e:f471
00000f:e800
000010:2f40
000011:2b00
000012:f451
000013:3800
000014:f019
000015:0f00
000016:2f40
000017:f429
000018:e001
000019:2f40
00001a:2b00
00001b:f409
00001c:2740
00001d:e120
00001e:ef3f
00001f:2b33
000020:2b33
000021:5031
000022:f7e1
000023:5021
000024:f7c9
000025:2b00
000026:f6d1
Этот файл нам почти подходит для QuartusII. В нашем проекте для ПЛИС есть файл avr_prog. mif (Memory Initialization File), куда мы и вставляем полученный из AVRStudio код (только нужно добавить точку с запятой в конце каждой строки). Таким образом, после компиляции QuartusII эти коды попадут во флеш UFM нашей ПЛИС.
Теперь можно компилировать и пробовать наш проект в плате Марсоход. Вот видеоролик, демонстрирующий работоспособность нашего процессора:
youtube.com/embed/zABN8733wlY?rel=0&autoplay=1> <img src=https://img.youtube.com/vi/zABN8733wlY/hqdefault.jpg>▶</a>»>Все работает так как и задумывалось!
Обратите внимание, что после компиляции, весь проект занимает только 205 логических элемента из 240 имеющихся в нашей ПЛИС. Это значит, что наш микроконтроллер можно и дальше усложнять или добавить какую-то новую логику. Так что проект может быть полезен для создания Ваших устройств.
Список инструкций | ||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Мнем. | P1 | P2 | Description | Action | Flags affected | Clk | Limitations | Words | ||||||||||||||||||||||||||||||||||
Arithmetical and logical operations | ||||||||||||||||||||||||||||||||||||||||||
ADD | Rx | Ry | Add register | Rx ← Rx + Ry | Z,C,N,V,S,H | 1 | 1 | |||||||||||||||||||||||||||||||||||
ADC | Rx | Ry | Add register and carry | Rx ← Rx + Ry + C | Z,C,N,V,S,H | 1 | 1 | |||||||||||||||||||||||||||||||||||
ADIW | RdL | K | Add constant to register pair | RdH:RdL ← RdH:RdL + K | Z,C,N,V,S | 2 | RdL=24/26 /28/30, K: от 0 до 63 | 1 | ||||||||||||||||||||||||||||||||||
SUB | Rx | Ry | Subtract register | Rx ← Rx — Ry | Z,C,N,V,S,H | 1 | 1 | |||||||||||||||||||||||||||||||||||
SUBI | Rh | K | Subtract constant | Rh ← Rh — K | Z,C,N,V,S,H | 1 | R: 16 to 31 | 1 | ||||||||||||||||||||||||||||||||||
SBC | Rx | Ry | Subtract register and carry | Rx ← Rx — Ry — C | Z 1 ,C,N,V,S,H | 1 | 1 | |||||||||||||||||||||||||||||||||||
SBCI | RH | K | Константа вычтения и переноска | RH ← RH — C | Z | 132, S | Z | 131, S | Z | 13. | 1 | R: 16-11 | 1 | |||||||||||||||||||||||||||||
CP | RY1 | RY2 | Сравнение | RX — RY | Z, C, C, S, S, S | . | 2 2. | 1 | ||||||||||||||||||||||||||||||||||
КТК | Рай1 | Рай2 | Сравните регистр и переносить | RY1 — RY2 — C | Z 1 , C, N, V, S, H | 1 | 1 | |||||||||||||||||||||||||||||||||||
CPI | 2932 293213232.9. | 132932 2 | 9.. | . | 9003 900332. | 932.10032932132932. | ||||||||||||||||||||||||||||||||||||
2 | 2 | |||||||||||||||||||||||||||||||||||||||||
. С постоянной | RX — K | Z, C, N, V, S, H | 1 | R: 16–11, K: от 0 до 255 | 1 | |||||||||||||||||||||||||||||||||||||
SBIW | RDL | 99329932.SBIW | RDL | 333933932 9003.Вычесть константу из пары регистров | RdH:RdL ← RdH:RdL — K | Z,C,N,V,S | 2 | RdL=24/26/28/30, K: 0 to 63 | 1 | |||||||||||||||||||||||||||||||||
AND | Rx | Ry | Binary AND register | RX ← RX и RY | Z, N, V, S | 1 | 1 | |||||||||||||||||||||||||||||||||||
Andi | RH | K | и с константом | rh | . ,N,V,S | 1 | R: от 16 до 31, K: от 0 до 255 | 1 | ||||||||||||||||||||||||||||||||||
OR | Rx | Ry | Binary OR | Rx ← Rx OR Ry | Z,N,V,S | 1 | 1 | |||||||||||||||||||||||||||||||||||
ORI | Rh | K | Binary Или с постоянной | RH ← RH или K | Z, N, V, S | 1 | R: 16–11, K: от 0 до 255 | 1 | ||||||||||||||||||||||||||||||||||
EOR | RX | |||||||||||||||||||||||||||||||||||||||||
EOR | RX | 133323333333333333333333339 | RX | |||||||||||||||||||||||||||||||||||||||
RX | 9233323333333333333.RX | 92333233333233333333333333333.Исключающее ИЛИ | Rx ← Rx XOR Ry | Z,N,V,S | 1 | 1 | ||||||||||||||||||||||||||||||||||||
COM | RX | RX ените | Rx | Two’s complement | Rx ← 256 — Rx | Z,C,N,V,S,H | 1 | 1 | ||||||||||||||||||||||||||||||||||
SBR | Rh | K | Set bits в константе K | Rh ← Rh OR K | z, n, v, s | 1 | R: от 16 до 31, K: от 0 до 255 | 1 | ||||||||||||||||||||||||||||||||||
CBR | RH | K | CLEAR BITS In Constrant K | RHA | RH | RH | RH | RH | RH | K | RH | K | . RH и (NEG K) | Z, N, V, S | 1 | R: от 16 до 31, K: от 0 до 255 | 1 | |||||||||||||||||||||||||
Inc | RX | Увеличение на один | RX | . Rx ← Rx + 1 | Z,N,V,S | 1 | 1 | |||||||||||||||||||||||||||||||||||
ДЕК | Rx | Decrease by one | Rx ← Rx — 1 | Z,N,V,S | 1 | 1 | ||||||||||||||||||||||||||||||||||||
TST | Ry | Compare with zero | Rx OR RX | Z, N, V, S | 1 | 1 | ||||||||||||||||||||||||||||||||||||
CLR | RX | CLEAR ALL BIT | 1 | |||||||||||||||||||||||||||||||||||||||
СЕР | Правая | Set all bits | Rh ← 255 | — | 1 | R: 16 to 31 | 1 | |||||||||||||||||||||||||||||||||||
MUL | Ry1 | Ry2 | Multiply 8 bits | R1:R0 ← Ry1 * RY2 | Z, C | 2 | 1 | |||||||||||||||||||||||||||||||||||
MULS | RY1 | RY2 | Sulty Sulded | R1: R1. 100 * ry1 * ry1 * ry1 * ry1 * ry1 * ry1 * ry1 * ry1 * ry1 * ry1 * ry1 * ry1 * ry1 * ry1 * ry1 * ry1 * ry1 * ry1 * ry1 * ry1 * ry1 * ry1 * ry1 * ry1 *. Ry2: с 16 по 31 | 1 | |||||||||||||||||||||||||||||||||||||
MULSU | Rx | Ry | Multiplipy unsigned and signed | R1:R0 ← Ry1 * Ry2 | Z,C | 2 | Ry1,Ry2: 16 to 31 | 1 | ||||||||||||||||||||||||||||||||||
FMUL | Ry1 | Ry2 | Floating point multiplication | R1:R0 ← Ry1 * Ry2 | Z,C | 2 | Ry1,Ry2: 16 to 23 | 1 | ||||||||||||||||||||||||||||||||||
FMULS | Ry1 | Рай2 | Умножение плавающей точки. multiplication signed and unsigned | R1:R0 ← Ry1 * Ry2 | Z,C | 2 | Ry1,Ry2: 16 to 23 | 1 | ||||||||||||||||||||||||||||||||||
DES | K | Data encoding and decoding | (R7:R0, R15:R8) | — | 1/2 | (только MEGA/XMEGA), K<16 | 1 | |||||||||||||||||||||||||||||||||||
Флаг Z устанавливается в единицу, если эта инструкция дала ноль И если он был установлен предыдущей инструкцией. Это позволяет проводить 16-битные сравнения. | ||||||||||||||||||||||||||||||||||||||||||
IJMP | Непрямой скачок | (ПК) ← Z | — | 2 | 1 | |||||||||||||||||||||||||||||||||||||
EIJMP | ||||||||||||||||||||||||||||||||||||||||||
EIJMP | ||||||||||||||||||||||||||||||||||||||||||
EIJMP | 9003.RIVE 9003.RIND | 9003.RIVE 9003.RIND 9003.RIND 9003.RIND 9003.00. | 2 | (XMEGA only) | 1 | |||||||||||||||||||||||||||||||||||||
JMP | K | Direct (wide) jump | (PC) ← K | — | 3 | K: 0 to 65535 | 2 | |||||||||||||||||||||||||||||||||||
RCALL | K | Относительный вызов | (стек) ← (ПК), (ПК) ← (ПК) +/- K | — | 2/3/4 | K: -20042 K: -200481 | ||||||||||||||||||||||||||||||||||||
ICALL | Indirect call | (Stack) ← (PC), (PC) ← Z | — | 2/3/4 | 1 | |||||||||||||||||||||||||||||||||||||
EICALL | Расширенный непрямой вызов | (стек) ← (ПК), (ПК) ← EIND+Z | — | 3/4 | 1 | |||||||||||||||||||||||||||||||||||||
CALL | K | Wide call | (Stack) ← (PC), (PC) ← K | — | 3/4/5 | 2 | ||||||||||||||||||||||||||||||||||||
RET | Return from call | (PC) ← (Stack) | — | 4 | 1 | |||||||||||||||||||||||||||||||||||||
RETI | Return from interrupt service routine | (PC ) ← (стек), I ← 1 | — | 4 | 1 | |||||||||||||||||||||||||||||||||||||
CPSE | Ry1 | Ry2 | Jump over next instruction if equal | Ry1=Ry2: (PC) ← (PC + 2) | — | 2/ 3 | 1 | |||||||||||||||||||||||||||||||||||
SBRC | RY | B | Следующая инструкция. | 1 | ||||||||||||||||||||||||||||||||||||||
СБРС | Рай | B | Jump over next instruction if bit set | (Bit)=1: (PC) ← (PC+2) | — | 2/3 | 1 | |||||||||||||||||||||||||||||||||||
SBIC | PL | B | Прыгайте следующую инструкцию, если Portbit Clear | (бит) = 0: (ПК) ← (ПК+1) | — | 2/3 | 1 | |||||||||||||||||||||||||||||||||||
SBIS | 13333333339 2 | 9003|||||||||||||||||||||||||||||||||||||||||
. B | Переход к следующей инструкции, если бит порта установлен | (Бит)=1: (ПК) ← (ПК+1) | — | 2/3 | 1 | |||||||||||||||||||||||||||||||||||||
BRBS | K | B | Прыгание относительно, если бит в наборе SREG | (SREG -BIT = 1): (PC) (PC) (PC) (PC) (PC) (PC). / — K | — | 1/2 | K: от -63 до + 64 | 1 | ||||||||||||||||||||||||||||||||||
BRBC | K | B | Относительный режим JUMP ALI BIT IF BIT | B | Джаменный относитель IF BIT BIT | B | Jump Reliati 0): (ПК) ← (ПК) +/- K | — | 1/2 | K: от -63 до + 64 | 1 | |||||||||||||||||||||||||||||||
BREQ | K | Относительный переход, если Z в наборе SREG | (SREG-Z=1): (PC) ← (PC) +/- K | — | 1 90K: от -63 до + 64 | 1 | ||||||||||||||||||||||||||||||||||||
BRNE | K | Относительный скачок при сбросе Z в SREG | (SREG-Z=0): (PC) ← (PC) +/- | — | 1/2 | K: от -63 до + 64 | 1 | |||||||||||||||||||||||||||||||||||
BRCS | K | Относительный переход, если C в наборе SREG. | ||||||||||||||||||||||||||||||||||||||||
BRCC | K | Относительный переход, если C в SREG очистить | (SREG-C=0): (PC) ← (PC) +/- K | — | K 1/2 | 3 : От -63 до + 64 | 1 | |||||||||||||||||||||||||||||||||||
БРШ | K | Относительный скачок, если C в SREG очистить | (SREG-C=0): (PC) ← (PC) +/- K | — | 1/2 | K: от -63 до + 64 | 1 | |||||||||||||||||||||||||||||||||||
BRLO | K | СПАС ) ← (ПК) +/- K | — | 1/2 | К: от -63 до + 64 | 1 | ||||||||||||||||||||||||||||||||||||
BRMI | K | ПРИМЕР. SREG-N=1): (PC) ← (PC) +/- K | — | 1/2 | K: от -63 до + 64 | 1 | ||||||||||||||||||||||||||||||||||||
BRPL | K | Относительный переход при сбросе Z в SREG | (SREG-N=1): (PC) ← (PC) +/- K | — | 3 K 9 9 032 1/2 : от -63 до + 64 | 1 | ||||||||||||||||||||||||||||||||||||
BRGE | K | Относительный переход, если S в SREG очистить | (SREG-S=0): (PC) ← (PC) +/- K | —1/2 | K: от -63 до + 64 | 1 | ||||||||||||||||||||||||||||||||||||
BRLT | K | Относительный переход, если S в наборе SREG | (SREG-S=1): (PC) ← (PC) +/- K | — | 1/2 | K: от -63 до + 64 | 1 | |||||||||||||||||||||||||||||||||||
Относительный скачок, если H в SREG установлен | ||||||||||||||||||||||||||||||||||||||||||
BRHC | K | Относительный переход при сбросе H в SREG | (SREG-H=0): (PC) ← (PC) +/- K | — | 1/2 1/2(PC) K | — | 1/2 | K: от -63 до + 64 | 1 | |||||||||||||||||||||||||||||||||
BRTC | K | . ПК) ← (ПК) +/- К | — | 1/2 | К: от -63 до + 64 | 1 | ||||||||||||||||||||||||||||||||||||
БРВС | K | Относительный скачок, если V в SREG установлен | (SREG-V=0): (PC) ← (PC) +/- K | —2 | K: от -63 до + 64 | 1 | ||||||||||||||||||||||||||||||||||||
BRIE | K | Относительный переход, если I в наборе SREG | (SREG-I=1): (PC) ← (PC) +/- K | — | 1/2 | K: от -63 до + 64 | 1 | |||||||||||||||||||||||||||||||||||
BRID | 3 K | 3 | Относительный переход, если I в сбросе SREG | (SREG-I=0): (PC) ← (PC) +/- K | — | 1/2 | K: от -63 до + 64 | 1 | ||||||||||||||||||||||||||||||||||
Инструкции по копированию и загрузке данных | ||||||||||||||||||||||||||||||||||||||||||
MOV | Rx | Ry | Регистр копирования | Rx ← Ry | — | 1 | 1 | |||||||||||||||||||||||||||||||||||
MOVW | Rx | Ry | Copy register pair | Rx+1:Rx ← Ry+1:Ry | — | 1 | Rx, Ry: Even | 1 | ||||||||||||||||||||||||||||||||||
LDI | Rh | K | Load constant | Rh ← K | — | 1 | R: 16 to 31, K: 0 to 255 | 1 | ||||||||||||||||||||||||||||||||||
LDS | Rh | A | Скопировать SRAM BYTE | RX ← (SRAM -A) | — | 2/3/4 | R: 16-11 | 2 | ||||||||||||||||||||||||||||||||||
LD | RX | |||||||||||||||||||||||||||||||||||||||||
LD | RX | |||||||||||||||||||||||||||||||||||||||||
RX ← (x) | — | 2/3/4 | 1 | |||||||||||||||||||||||||||||||||||||||
LD | RX | x+ | Копия SRAM SRAM на статус на адрес. Х), Х = Х + 1 | — | 2/3 | 1 | ||||||||||||||||||||||||||||||||||||
LD | Rx | -X | Decrement X and copy SRAM byte from address X | X = X — 1, Rx ← (X) | — | 2/3/4 | 1 | |||||||||||||||||||||||||||||||||||
LD | Rx | Y | Copy SRAM byte on address Y | Rx ← (Y) | — | 2/3/4 | 1 | |||||||||||||||||||||||||||||||||||
LD | Rx | Y+ | Скопировать байт SRAM по адресу Y и увеличить адрес | RX ← (Y), y = Y + 1 | — | 2/3 | 1 | |||||||||||||||||||||||||||||||||||
LD | RX | DEDECENT Y и COPION Y и COPER -IT -ARMETE | DEDENT Y и COPITE ByTE | . Y = Y — 1, Rx ← (Y) | — | 2/3/4 | 1 | |||||||||||||||||||||||||||||||||||
LDD | Rx | Y+K | 3 байт Адрес копировать из SRAM+K | 3 байтRx ← (Y+K) | — | 2/3 | K: от 0 до 63 | 1 | ||||||||||||||||||||||||||||||||||
LD | Rx | Z | Copy SRAM byte from address Z | Rx ← (Z) | — | 2/3/4 | 1 | |||||||||||||||||||||||||||||||||||
LD | Rx | Z+ | Copy SRAM byte from address Z and increment address | Rx ← (Z), Z = Z + 1 | — | 2/3 | 1 | |||||||||||||||||||||||||||||||||||
LD | Rx | -Z | Уменьшить Z и скопировать байт SRAM с адреса Z | z = z — 1, Rx ← (z) | — | 2/3/4 | 1 | |||||||||||||||||||||||||||||||||||
LDD | RX | Z+K | SCR+SRAM. K) | Rx ← (Z+K) | — | 2/3 | K: 0 to 63 | 1 | ||||||||||||||||||||||||||||||||||
STS | A | Rh | Copy to SRAM | (SRAM- A) ← Rx | — | 2/3/4 | R: от 16 до 31 | 2 | ||||||||||||||||||||||||||||||||||
ST | X | Rx | Copy to SRAM address in X | (X) ← Rx | — | 2/3/4 | 1 | |||||||||||||||||||||||||||||||||||
ST | X+ | Rx | Copy to SRAM address in X and increment address | (X) ← Rx, X = X + 1 | — | 2/3 | 1 | |||||||||||||||||||||||||||||||||||
ST | -X | Rx | Decrement X и скопировать на адрес SRAM X | X = X — 1, (X) ← Rx | — | 2/3/4 | 1 | |||||||||||||||||||||||||||||||||||
ST | Y | RX | Скопируйте в SRAM ADRED Y | (Y) ← RX | 332 —3333333333333333333333333333333333333333 гг.1 | |||||||||||||||||||||||||||||||||||||
ST | Rx | Y+ | Copy to address Y and increment Y | (Y) ← Rx, Y = Y + 1 | — | 2/3 | 1 | |||||||||||||||||||||||||||||||||||
ST | Rx | -Y | Уменьшить Y и скопировать на адрес SRAM Y | y = y — 1, (y) ← Rx | — | 2/3/4 | 1 | |||||||||||||||||||||||||||||||||||
СТД | Y+K | RX | . ) | (Y+K) ← RX | — | 2/3 | K: от 0 до 63 | 1 | ||||||||||||||||||||||||||||||||||
ST | Z | RX | 333. ) ← Rx | — | 2/3/4 | 1 | ||||||||||||||||||||||||||||||||||||
ST | Z+ | RX | Копия в SRAM ADDRED Z и увеличение Z | (Z) ← RX, Z = Z + 1 | — | 2/3 | 1 | |||||||||||||||||||||||||||||||||||
ST | -Z | |||||||||||||||||||||||||||||||||||||||||
. | Декализация z и копия по адресу sram z | z = z — 1, (z) ← Rx | — | 2/3/4 | 1 | |||||||||||||||||||||||||||||||||||||
STD | Z+K | |||||||||||||||||||||||||||||||||||||||||
STD | Z+K | 9003 9003|||||||||||||||||||||||||||||||||||||||||
STD | Z+K | 9003|||||||||||||||||||||||||||||||||||||||||
. | Копировать в адрес SRAM (Z+K) | (Z+K) ← Rx | — | 2/3 | K: 0 to 63 | 1 | ||||||||||||||||||||||||||||||||||||
LPM | Copy from program memory address (Z) to R0 | R0 ← (Flash Z) | — | 3 | 1 | |||||||||||||||||||||||||||||||||||||
LPM | Rx | Z | Copy from program memory address (Z) to register | Rx ← (Flash Z) | — | 3 | 1 | |||||||||||||||||||||||||||||||||||
LPM | Rx | Z+ | Копия из адреса памяти программы (z) для регистрации и приращения z | RX ← (Flash z), z = z + 1 | — | 3 | 1 | |||||||||||||||||||||||||||||||||||
ELPM | ELPM | |||||||||||||||||||||||||||||||||||||||||
R0 ← (Flash Z) | — | 3 | 1 | |||||||||||||||||||||||||||||||||||||||
ELPM | RX | Z | Уменьшение. EIND+Z) для регистрации | RX ← (Flash z) | — | 3 | 1 | |||||||||||||||||||||||||||||||||||
ELPM | RX | Z+ | Копия из Exted Program Memory Address (EIND+ Z) ZERSERSTER и ZERSERSERSTER и Z -Z). ← (Flash Z), Z = Z + 1 | — | 3 | 1 | ||||||||||||||||||||||||||||||||||||
SPM | Копировать слово R1:R0 в адрес программной памяти (Z) 9003 9003 :R0 | — | N | 1 | ||||||||||||||||||||||||||||||||||||||
SPM | Z+ | Скопировать слово R1:R0 в адрес памяти программ (Z) и увеличить Z | (Flash Z) ← R1:R0, Z = N+ 1 | —1 | ||||||||||||||||||||||||||||||||||||||
IN | Rx | P | Copy port byte | Rx ← P | — | 1 | P: 0 to 63 | 1 | ||||||||||||||||||||||||||||||||||
OUT | P | Rx | Скопировать байт в порт | P ← RX | — | 1 | P: от 0 до 63 | 1 | ||||||||||||||||||||||||||||||||||
Push | RX | Степень и DEKREM SP — 1 | — | 2 | 1 | |||||||||||||||||||||||||||||||||||||
POP | RX | Копия из стека и приращения (SP) | RX ← (Stack), SP = SP + 1 | .. 9003.. | RX ← (Степ 2 | 1 | ||||||||||||||||||||||||||||||||||||
ХСН | Z | Rx | Exchange register with SRAM address (Z) | Rx ↔ (Z) | — | 1 | 1 | |||||||||||||||||||||||||||||||||||
LAS | Z | Rx | OR register and SRAM (Z) UND Exchange | RX ← RX Oder (z), (z) ↔ RX | — | 1 | 1 | |||||||||||||||||||||||||||||||||||
LAC | Z | RX | и STATE ) и скопировать в SRAM (Z) | RX ← (255 -RX) UND (Z), (Z) ↔ RX | — | 1 | 1 | |||||||||||||||||||||||||||||||||||
LAT | Z, | RD | xor Region и SRAM (Z). exchange | Rx EXOR (Z), Rx ↔ (Z) | — | 1 | 1 | |||||||||||||||||||||||||||||||||||
Bit operations | ||||||||||||||||||||||||||||||||||||||||||
LSL | Rx | Logical shift left | Rx ← Rx * 2 | Z,C,N,V,H | 1 | 1 | ||||||||||||||||||||||||||||||||||||
LSR | Rx | Logical shift right | Rx ← Rx / 2 | Z,C,N,V | 1 | 1 | ||||||||||||||||||||||||||||||||||||
ROL | Rx | Binary rotate Слева с C | RX ← Rx * 2 с битом 0 = C/C = бит 7 | Z, C, N, V, H | 1 | 1 | ||||||||||||||||||||||||||||||||||||
ROR | RX | BINO повернуть вправо с C | Rx ← Rx / 2 с битом 7 = C/C = бит 0 | z, c, n, v | 1 | 1 | ||||||||||||||||||||||||||||||||||||
ASR | RX | Арифметический сдвиг справа | RX ← RX (6: 0) / 2, бит 6. | 3RX ← Rx (6: 0) / 2, 6 arithmetication Shift | RX ← RX (6: 0) / 2, 0 | 2RX. , C, N, V | 1 | 1 | ||||||||||||||||||||||||||||||||||
SWAP | RX | Верхняя часть обмена и нижняя Nibble | RX ← (7: 4) ↔ (3: 0) | 92-9003.1003.1003. 9003.1003 3 3 3 3 9003.1003. 9003.1003. 9003.1003. 3 9003.1003. 3 3 3 3 3 3 3 3 RX ← (4: 4).1 | ||||||||||||||||||||||||||||||||||||||
BSET | B | Установить бит в SREG | SREG ← SREG OR (1 << B) | — | 1 | B: от 0 до 7 | 1 | |||||||||||||||||||||||||||||||||||
BCLR | B | BIT In SS SPR. 255- (1 << B)) | — | 1 | B: от 0 до 7 | 1 | ||||||||||||||||||||||||||||||||||||
SBI | PL | B | SET BIT BIT | PL вели 10032 STIT BIT в PART | 32.11.10032 PL вели 10032 STIT BIT в PART 32. <— | 2 | PL: от 0 до 31, B: от 0 до 7 | 1 | ||||||||||||||||||||||||||||||||||
CBI | PL | B | Чистый бит в порту | PL ← PL и (255- (1B B)) | — | 2 | . B: 0 to 7 | 1 | ||||||||||||||||||||||||||||||||||
BST | Rx | B | Copy register bit to T | SREG-T ← Rx-Bit B | — | 1 | B: 0 to 7 | 1 | ||||||||||||||||||||||||||||||||||
BLD | Rx | B | Копировать T в регистр, бит | Rx-Bit B ← T | — | 1 | B: 0 to 7 | 1 | ||||||||||||||||||||||||||||||||||
SEC | Set SREG C | SREG-Bit C ← 1 | — | 1 | 1 | |||||||||||||||||||||||||||||||||||||
CLC | Clear SREG C | SREG-Bit C ← 0 | — | 1 | 1 | |||||||||||||||||||||||||||||||||||||
SEN | Set SREG N | SREG- Бит N ← 1 | — | 1 | 1 | |||||||||||||||||||||||||||||||||||||
CLN | Clear SREG N | SREG-Bit N ← 0 | — | 1 | 1 | |||||||||||||||||||||||||||||||||||||
SEZ | Set SREG Z | Sreg -bit z ← 1 | — | 1 | 1 | |||||||||||||||||||||||||||||||||||||
CLZ | CLEAR SREG Z | SREG -BIT Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z. 0003 | SEI | Set SREG I | SREG-Bit I ← 1 | — | 1 | 1 | ||||||||||||||||||||||||||||||||||
CLI | Clear SREG I | SREG-Bit I ← 0 | — | 1 | 1 | |||||||||||||||||||||||||||||||||||||
SES | Set SREG S | SREG-Bit S ← 1 | — | 1 | 1 | |||||||||||||||||||||||||||||||||||||
CLS | Clear SREG S | SREG-Bit S ← 0 | — | 1 | 1 | |||||||||||||||||||||||||||||||||||||
SEV | Set SREG V | SREG-Bit V ← 1 | — | 1 | 1 | |||||||||||||||||||||||||||||||||||||
CLV | CLEAR SREG V | SREG-BIT V ← 0 | — | 1 | 1 | |||||||||||||||||||||||||||||||||||||
SET | SET SET 9003.RRAIR 9003.REG 7.GREG3.REG 3 9003.REG 7.REG3.REG 3 9003.REG 3 | .REG 3 9003.REG 7.GREG3. — | 1 | 1 | ||||||||||||||||||||||||||||||||||||||
CLT | Clear SREG T | SREG-Bit T ← 0 | — | 1 | 1 | |||||||||||||||||||||||||||||||||||||
SEH | Set SREG H | SREG- Bit H ← 1 | — | 1 | 1 | |||||||||||||||||||||||||||||||||||||
CLH | Clear SREG H | SREG-Bit H ← 0 | — | 1 | 1 | |||||||||||||||||||||||||||||||||||||
Controller instructions | ||||||||||||||||||||||||||||||||||||||||||
BREAK | Stop execution, control to debugger | — | 1 | 1 | ||||||||||||||||||||||||||||||||||||||
NOP | Do nothing | — | 1 | 1 | ||||||||||||||||||||||||||||||||||||||
Sleep | Sleep | — | 1 | 1 | ||||||||||||||||||||||||||||||||||||||
WDR | Clear Watchdog | WDRClear Watchdog | WDR | WDRWDR | WDRWDR | WDR WDR WDR WDR WDRWDR. 0033 | — | 1 | 1 |
архитектура чипа.
В отличие от компиляторов, которые могут выдавать разные выходные данные при наличии одного и того же исходного кода, ассемблеры, по сути, выполняют один к одному перевод мнемоник инструкций и операндов в машинный код. Все ассемблеры должен выдавать тот же результат при использовании того же исходного кода. Основное различие между ассемблерами заключается в их поддержке различных директив и предлагаемых ими сред разработки.
Существует ряд доступных бесплатных ассемблеров AVR, подробная информация о которых приведена ниже.
AVRASM2 — официальный ассемблер Atmel. AVRASM2 поставляется с Atmel Studio и будет использоваться автоматически при создании решения в Studio. Он имеет наибольшую поддержку и гибкость среди всех ассемблеров AVR.
Если самая большая проблема с AVRASM2 связана со средой разработки Atmel, у меня есть хорошие новости. AVRASM2 можно вызывать из командной строки, то есть вы можете использовать любой редактор кода и make-файл, который вам нравится.
Однако одной из наиболее полезных функций Atmel Studio являются встроенные средства моделирования и отладки. Программы можно выполнять построчно, а содержимое регистров, SRAM и EEPROM можно просматривать напрямую. Это бесценный ресурс, особенно в ассемблере, который значительно облегчит вашу жизнь при обучении программированию.
Самым большим недостатком Atmel Studio является то, что он доступен только в Windows, хотя его можно запустить с помощью Wine в Linux и Mac.
Если вы разрабатываете для Windows, это, вероятно, ваш лучший вариант, даже если вы решите использовать его без интегрированной среды разработки Atmel Studio. Однако, если вы используете Linux или Mac, вы можете рассмотреть одну из следующих альтернатив.
AVRA — это ассемблер с открытым исходным кодом, который во многом использует тот же синтаксис, что и AVRASM2.