Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
sp_avr_2009.doc
Скачиваний:
50
Добавлен:
21.04.2023
Размер:
819.2 Кб
Скачать

3.5. Команды ассемблера

У микроконтроллеров семейства AVR развитая система команд. Все команды можно разделить по назначению на 4 группы:

– арифметические и логические операции;

– операции передачи управления (ветвления), условные и безусловные;

– команды передачи данных;

– команды работы с отдельными битами.

Команды микроконтроллеров AVR шестнадцатиразрядные. Каждая команда размещается в одной или двух ячейках. Машинный цикл микроконтроллеров AVR равен одному такту системного генератора. Количество циклов на одну команду от одного до четырех. Большинство команд занимают одну ячейку памяти программ и выполняются за один машинный цикл.

Микроконтроллеры AVR разных моделей имеют различное количество команд. При программировании следует уточнять, какие команды поддерживает данная модель микроконтроллера. Система команд для каждой конкретной модели приводится в техническом описании микроконтроллера, а также в справочной службе (Help) IDE «AVR STUDIO».

Рекомендуется пользоваться справочной службой. В меню «AVR STUDIO» выбираем «Help/Assembler Help». Попадаем в справочную службу по ассемблеру. Если выбрать пункт «Instruction set overview» (краткий обзор системы команд), то будет выбрана полная система команд микроконтроллеров AVR. Целесообразно в разделе «Device specific instruction set summaries» (резюме команд выбранного устройства) выбрать конкретную модель микроконтроллера и тогда будут показаны только те команды, которые поддерживаются этим микроконтроллером. Если в открывшемся списке выбрать некоторую команду, откроется ее полное описание. В приложении приводится перевод на русский язык названия команд микроконтроллера ATmega32.

Приведем описание некоторых наиболее часто используемых команд:

Команда «LDI» – «Load Immediate» (загрузка константы):

Синтаксис команды: LDI Rd, K,

где Rd – регистр назначения в диапазоне с R16 по R31;

K – константа в диапазоне от 0 до 255.

Описание команды: загрузить 8-битную константу непосредственно в регистр с 16 по 31.

Пример:

ldi r16, $01 ; загрузить константу 01Н в регистр R16

После выполнения команды «LDI» содержимое «Program Counter» (программный счетчик) увеличивается на единицу:

PC <– PC + 1.

Содержимое регистра статуса (флажков) – (SREG) не меняется.

Команда «LDI» имеет в длину одно слово (2 байта) и выполняется за один цикл.

Команда «MOV» – «Copy Register» (копирование регистра):

Синтаксис команды: MOV Rd, Rr,

где Rd – регистр назначения в диапазоне с R0 по R31;

Rr – регистр источник в диапазоне с R0 по R31.

Описание команды: содержимое регистра с именем Rr копируется в регистр с именем Rd.

Пример:

mov r17, r16 ; копировать содержимое регистра R16 в регистр R17

После выполнения команды «MOV» содержимое «Program Counter» (программный счетчик) увеличивается на единицу:

PC <– PC + 1.

Содержимое регистра статуса (флажков) – (SREG) не меняется.

Команда «MOV» имеет в длину одно слово (2 байта) и выполняется за один цикл.

Команда «ADD» – «Add without Carry» (сложить без переноса):

Синтаксис команды: ADD Rd, Rr,

где Rd – регистр назначения в диапазоне с R0 по R31;

Rr – регистр источник в диапазоне с R0 по R31.

Описание команды: содержимое регистра с именем Rr складывается с содержимым регистра с именем Rd и сумма размещается в регистре с именем Rd.

Пример:

add r1, r2 ; сложить содержимое регистра R1 и регистра R2

После выполнения команды «ADD» содержимое «Program Counter» (программный счетчик) увеличивается на единицу:

PC <– PC + 1.

Содержимое регистра статуса (флажков) – (SREG) устанавливается соответственно результату операции.

Команда «ADD» имеет в длину одно слово (2 байта) и выполняется за один цикл.

Команда «JMP» – «Jump» (прыжок):

Синтаксис команды: JMP k,

где k – адрес перехода в пределах всего адресного пространства.

Описание команды: осуществляется безусловный переход на адрес программы, указанный в команде в пределах всего адресного пространства. При использовании программы «ассемблер» вместо адресов удобно указывать метки переходов. В процессе компиляции (перевод с языка ассемблера в машинные коды) вместо меток будут автоматически рассчитаны адреса переходов. Метка должна начинаться с буквы и может также иметь в своем составе цифры, но должна не иметь пробелов.

Пример:

START:

------ ; (некоторая команда)

------ ; (некоторая команда)

jmp START ; безусловный переход на метку «START»

После выполнения команды «JMP» содержимое «Program Counter» (программный счетчик) становится равным «К»:

PC <– К.

Содержимое регистра статуса (флажков) – (SREG) не меняется.

Команда «JMP» имеет в длину 2 слова (4 байта) и выполняется за три цикла.

Команда «RJMP» – «Relative Jump» (относительный прыжок):

Синтаксис команды: RJMP k,

где k – смещение для перехода в пределах PC – 2K +1 и PC + 2K (слов) адресного пространства.

Описание команды: осуществляется безусловный переход на адрес программы, рассчитанный относительно текущей команды и смещения, указанного в команде в пределах PC – 2K +1 и PC + 2K (слов). Для микроконтроллеров, имеющих память программ не более 4K (слов), происходит переход в пределах всего адресного пространства. При использовании программы «ассемблер» вместо адресов удобно указывать метки переходов. В процессе компиляции (перевод с языка ассемблера в машинные коды) вместо меток будут автоматически рассчитаны адреса переходов. Метка должна начинаться с буквы и может также иметь в своем составе цифры, но должна не иметь пробелов.

Пример:

START:

------ ; (некоторая команда)

------ ; (некоторая команда)

rjmp START ; безусловный переход на метку «START»

После выполнения команды «RJMP» содержимое «Program Counter» (программный счетчик) становится равным:

PC <– PC + К + 1.

Содержимое регистра статуса (флажков) – (SREG) не меняется.

Команда «RJMP» имеет в длину одно слово (2 байта) и выполняется за два цикла.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]