Программирование на языке ASM (и не только на ASM) предполагает условное или
безусловное решение какой-либо задачи . Для безусловного решения мы можем реализовать , так называемый ,
последовательный алгоритм , который состоит из последовательных операций перехода
и операций обработки:

Условное решение предполагает набор операций
перехода и обработки , в зависимости от условия:

Под «набором команд» мы подразумеваем выполнение от одной команды до целого ряда сложных последовательностей(участка кода) программы.
Набор команд для архитектуры AVR предполагает 2 типа условных
команд:
- Команды условного перехода – BR_OP LABEL.
- Команды игнорирования следующей инструкции – SB_OP.
Реализация алгоритмов при помощи
команд условного перехода
Команды такого рода
(типа) – это команды , которые после проверки определённого условия , обычно ,
это один из битов регистра SREG , выполняют переход на
фиксированный адрес , указанный меткой (label). В контексте , будем называть такого рода
команды , как BR_OP-операции ветвления.
.png)
Для данного типа команд
мы можем сделать некоторые сравнения с условными командами языков более
высокого уровня , таких , как язык программирования С.
Например:
BREQ if == если «равно»
BRNE if != если «не равно»
BRSH if >= если «больше или
равно»
BRLO if < если «меньше»
и т.д.
Команде типа BR_OP чаще всего предшествует
команда сравнения CP,CPI или TEST . Команды сравнения
предназначены для оценки взаимосвязи между элементами , участвующих в
тестировании , имеющих , как результат – изменение регистра состояния SREG. До команды BR_OP может и не следовать
команда сравнения в том случае , когда операция обработки , до операции
разветвления , изменяет единственный регистр SREG в состоянии необходимом
операции разветвления .Например , после декриментации до нуля в циклах . В
общем случае , под сравнением , подразумевается операция вычитания , без сохранения результата операции , но ,
как последствие операции вычитания , устанавливаются биты в регистре состояния SREG.
.png)
.png)

Конструкция алгоритмов
разветвления на языке ASM может быть составлена по
следованию меток: L1,L2,L3,L3 в соответствии с
приведённым выше рисунком.
L1:
; Начало
инструкции разветвления
cp R1,R2
; Операция сравнения (R2
- R1)
BR_OP L3
; Операция перехода по условию разветвления
L2:
; F - тест FALSE
...
...
; OP1 – набор
команд для ветви FALS
...
rjmp L4 ; Относительный безусловный переход в конец
;
L3:
; T - тест TRUE
...
...
; OP2 - набор команд для ветви TRUE
...
(rjmp
L4) ; Может
быть пропущен
L4: ; Конец конструкции разветвления
Использование команд
игнорирования следующей команды
Команды такого типа
предполагают игнорирование выполнения последующей за ней команды . Такого типа команды , мы будем
называть – команды типа SB_OP . Такие команды , чаще
всего , предполагают проверку одного бита РОН , РВВ , SREG . Проверяемый бит можно
найти в «таблице команд» , для каждой команды – с края . Условный переход для
этой команды будет представлен переходом через одну команду и , если нет
необходимости уточнять адрес , на который был сделан переход . Формат
инструкций показан следующим образом :
- SB_OP TST_REG, N где :
- SB_OP – название команды , которая будет проверят установлен бит или нет
- TST_REG – названия регистра , который будет протестирован
- N – порядковый номер бита , который будет тестироваться в указанном регистре
Но различие команд выглядит следующим образом
:
Переход через команду (PC=PC+2) осуществляется ,
если бит N регистра TST_REG установлен \
не установлен . В обратном случае , будет выполнятся следующая команда (PC=PC+1) .

На языках высокого уровня , будет выглядеть
следующим образом :
if
( TST_REG[N] == 0 ) или if ( TST_REG[N] == 1 )
Эти команды не нуждаются в предварительном
сравнении , они выполняют необходимое сравнение и выполняют переход , в связи с
этой же командой .
Ниже реализована конструкция алгоритма
разветвления и использование его в языке ASM , где метки L1,L2,L3 и L4 подразумеваю пункты
с этим же именем :

.png)
L1:
; Начало
инструкции разветвления
SB_OP
; Операция игнорирования следующей команды
rjmp L3 ; Переход , если FALSE
(rjmp
L2)
; Переход , если TRUE, может
быть пропущена
L2:
; T - тест TRUE
...
...
; OP1 - набор
команд для ветви TRUE
...
rjmp L4 ; Относительный безусловный переход в конец
;
L3:
; F - тест FALSE
...
...
; OP2 - набор
команд для ветви FALSE
...
(rjmp
L4) ; Может
быть пропущена
L4:
; Конец
конструкции разветвления
Реализация инструкций if…else if
Реализация инструкций
типа if…else if совпадают с реализацией конструкции разветвления . Добавим
только тот факт , что пункт FALSE обладает ещё одним
разветвлением этого же типа . Таким образом , мы получим цепочку проверок по
пункту FALSE . Разветвление может осуществляться как
командами BR_OP , так и SB_OP . Разветвление может
быть комбинированным из двух типов :



Случай с SB_OP такой же , как и был
представлен выше , с перестановкой операций разветвления .
Инструкция выбора switch / case
Инструкция выбора switch / case – это частный случай
инструкции if…else if с ограничением , что
проверяется та же переменная \ регистр на равенство с BREQ или BRNE а затем будет
реализована инструкция , в соответствии с данными командами .
Инструкция цикла с предварительным сравнением while
Эта инструкция
продолжает выполнение части кода , пока условие верно . Но перед этим проверяет
условие и , если условие удовлетворено , выполняется набор команд , после
которого следует переход на проверку этого же условия , образуя выполнение
цикла . Если же результат проверки не удовлетворяет условию , тогда цикл
игнорируется и выполнение программы будет выполнятся с команды , стоящей после
цикла .
Инструкция цикла с последующей проверкой do…while
В этом случае , сначала будет выполнятся код программы цикла , только потом проверка условия .
Если условие удовлетворительное , код цикла выполняется снова , если нет , цикл
заканчивается и выполняется следующая за ним инструкция .Можно сделать таким образом
, что последняя команда из цикла будет служить для выставления флагов регистра
состояния SREG . Этого можно добиться
командой BR_OP.
Цикл for
Выполнение этого цикла схоже с циклом while . Он содержит
инициализированный счётчик и в конце цикла всегда проверяет его значение
(условие) .
где BR_OP показывает нам что это
– дополнительное сравнении и вместо “<=” у нас будет “>” .
Обзор циклов
Выполнение циклов тип SB_OP идентично с выполнением
циклов типа BR_OP , только немного разные
правила их выполнения .
Делая вывод можно
отметить , что лучше использовать цикл типа do…while , это способствует
повышению производительности программы .
Niciun comentariu:
Trimiteți un comentariu