|
|
RJMP K |
Безусловный
относительный переход, для передачи
управления в пределах 2k слов вперед
и назад относительно текущего
счетчика команд. K - 12-ти
разрядная константа, вычисляется
компилятором, вам в программе
достаточно написать
rjmp Label
Для
кристаллов с ПЗУ программ не более 8
кБ перекрывает весь диапазон
адресов |
| IJMP |
Безусловный
косвенный переход. Управление
передастся на адрес, который
находится в регистровой паре Z.
Основное предназначение -
вычисляемый переход, что-то типа
паскалевского CASE. |
| RCALL K |
Обращение
к подпрограмме. Передача
управления работает точно так же,
как у команды RJMP, но в стеке
сохраняется адрес следующей за RCALL
команды (см. описание RET).
Подпрограммы применяются для
уменьшения размеров программы и
улучшения ее "читабельности",
в них выносятся часто используемые
фрагменты вычислений. Так, в
примере простейшей
мигалки это подпрограмма
задержки Delay05S |
| ICALL |
Аналогично
RCALL, но управление передается на
адрес, указываемый регистровой
парой Z |
| RET |
Возврат
из подпрограммы. Адрес, куда
передается управление,
извлекается из стека. |
| RETI |
Возврат
из обработчика прерывания. Адрес,
куда передается управление,
извлекается из стека, и
устанавливается бит разрешения
прерываний в SREG |
| CPSE Rd.Rs |
Сравнивает
Rd и Rs, и пропускает следующую
команду, если они равны. При этом
флаги признаков в SREG не
меняются! Вообще команда какая-то
странная, я ее практически не
использовал никогда. |
|
Далее
следуют три команды сравнения,
которые сами по себе никаких
ветвлений не вызывают, но
устанавливают признаки в SREG -
которые потом используются для
ветвлений. наверное, именно
поэтому во всех описаниях команды
сравнения относятся к группе
команд передачи управления. Не
буду и я ничего переделывать, тем
более что тогда пришлось бы
разъединить CP и CPSE. Пусть уж
живут вместе :-) |
| CP Rd,Rs |
Сравнение
Rd и Rs. По сути, это та же команда
вычитания, только результат
вычисления нигде не сохраняется.
Изменяются признаки: H
S V N Z C |
|
CPC Rd,Rs |
То
же - но вычитается еще и бит
переноса C.
Используется для реализации
сравнения многобайтных чисел,
например, для сравнения
двухбайтных чисел, размещенных в
регистрах R23:R22 и R21:R20 необходимо
выполнить следующее:
cp R22,R20 ;младшие
байты
cpc R23,R21 ;и старшие
Изменяются
признаки: H S V N Z C
|
|
CPI Rd,K |
Сравнение
регистра Rd и константы. Работает со
"старшими" регистрами. Изменяются
признаки: H S V N Z C |
|
SBRC Rd,b
SBRS Rd,b |
Проверка
бита b (b=0..7) в регистре Rd и пропуск
следующей команды, если он очищен
(SBRC) или установлен (SBRS). Биты
признаков не изменяются.
Поскольку
обычно требуется "обойти"
более чем одну команду, то делается
так:
sbrs R17,3 ;перепрыгиваем
команду RJMP
rjmp OBHOD
; тут выполняется то, что
; должно быть выполнено
; при единичном значении R17.3!
OBHOD: |
SBIC IO,b
SBIS IO,b |
То
же, что и SBRC - только проверяются
биты не регистров, а портов ввода-вывода.
Напомню, что побитовое обращение к
портам ввода-вывода возможно
только для портов с адресами до 0x20! |
BRBS
BRBC |
Две абсолютно
бесполезные мнемоники. По сути, это
общее обозначение всех
последующих мнемоник, но я не думаю,
что найдется человек, пишущий
brbs 0, Label ;
перейти, если бит 0 SREG равен 1
если можно
написать
brcs Label ; перейти,
если C-разряд установлен (BRanch if Carry
Set)
Хотя это
абсолютно одно и то же! Но во втором
случае гораздо читабельнее. |
|
Далее
идут команды - ветвления, то есть
передача управления по условию.
Флаги условий - в регистре
состояния SREG. Передача
управления возможна на 64 слова
назад или 63 слова вперед
относительно текущего счетчика
команд. Если необходим переход на
большее расстояние, используют
пару команд с противоположным
условием:
brne OBHOD
rjmp LABEL ; переход по "равно"
OBHOD:
|
BREQ
BRNE |
Переход
при Z=1 (нулевой результат)
|
|
Переход
при Z=0 (НЕнулевой результат)
|
BRCS
BRCC |
Переход
при C=1 (перенос)
|
|
Переход
при C=0 (отсутствие переноса)
|
BRGE
BRLT |
Переход
при S=1 (больше или равно)
|
|
Переход
при S=0 (меньше)
|
BRSH
BRLO |
То
же самое что BRCC/BRCS
|
BRMI
BRPL |
Переход
при N=1 (отрицательный результат)
|
|
Переход
при N=0 (положительный результат. 0 -
тоже положительный!)
|
BRHS
BRHC |
Переход
при H=1 (перенос из младшей тетрады)
|
|
Переход
при H=0
|
BRTS
BRTC |
Переход
при T=1
|
|
Переход
при T=0
|
BRVS
BRVC |
Переход
при V=1 (переполнение)
|
|
Переход
при V=0
|
BRIE
BRID |
Переход
при I=1 (прерывания разрешены) |
|
Переход
при I=0 (прерывания запрещены) |
Ну и осталось совсем немного -
команды сдвигов, установок разрядов
портов и регистра состояния и парочка
специальных команд. Итак - последний
рывок!
| LSL Rd |
Логический
сдвиг содержимого регистра влево.
Старший бит выдвигается в C разряд SREG,
на его место становится 6-й бит, на
место 6-го - 5-й и так далее. В самый
младший - задвигается 0
|
До
выполнения: |
|
|
|
После выполнения: |
|
|
Изменяет
признаки:Z,C,N,V,H
Ну а вообще-то это
команда ADD Rd,Rd :-) |
| LSR Rd |
То же самое но в другую сторону. В
общем, смотрите на рисунок лучше...
Изменяет
признаки:Z,C,N,V
|
| ROL Rd |
Циклический
сдвиг содержимого регистра влево. Отличается
от LSL тем, что в нулевой бит
задвигается C-разряд:
|
До
выполнения: |
|
|
|
После выполнения: |
|
|
Изменяет
признаки:Z,C,N,V,H
Ну а вообще-то это
команда ADC Rd,Rd |
| ROR Rd |
То же самое но в другую сторону.
Изменяет
признаки:Z,C,N,V
|
| ASR Rd |
Арифметический
сдвиг вправо - иными словами,
целочисленное деление на 2. Старший
бит повторяет сам себя - поскольку
это знак.
Изменяет
признаки:Z,C,N,V
|
| SWAP Rd |
Обмен
тетрад - смотрите на рисунок.
Признаки
не изменяются
|
|
| SBI IO,b |
Установить
в "1" бит с номером b(b=0..7) в
регистре ввода-вывода IO. Признаки не
изменяются. |
| CBI IO,b |
То же
самое - только установить в "0" |
|
| BST Rs,b |
Скопирует
бит b регистра Rs в бит T SREG (регистр
состояния ) |
| BLD Rd,b |
Бит T SREG
занесет в бит b регистра Rd. Эти две
команды позволяют переставлять биты
как угодно, жаль только, что нет
команды инверсии T-бита |
| Далее
следуют 16 команд установки или
сброса битов признаков SREG. Я не буду
всех их описывать, тут все ясно из
мнемоники - SEC - Set C - установить
признак C в единицу, CLC - Clear C - в ноль.
Но для порядка все-таки их перечислим.
И опять посожалеем, что нет команд их
инверсии... |
| SEC |
CLC |
SEN |
CLN |
SEZ |
CLZ |
SEI |
CLI |
| SES |
CLS |
SEV |
CLV |
SET |
CLT |
SEH |
CLH |
|
| Вот
мы и подошли к концу. Осталось
описать три специфические команды... |
| NOP |
Пустая
операция. Не делает ничего, кроме
того, что занимает один такт
процессора. Имеет код операции 0x000,
что дает возможность "забить" ею
любую другую команду без стирания
всей программы (подробнее об этом
чуть позже) |
| SLEEP |
Перевод
процессора в режим пониженного
энергопотребления. См. описание
режимов |
| WDR |
Сброс
сторожевого таймера. См. описание |
|