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
| | |