marți, 18 martie 2014

Реализация алгоритмов при помощи команд условного перехода.

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


  •     Команды условного перехода – BR_OP LABEL.
  •      Команды игнорирования следующей инструкции – SB_OP.


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


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

Реализация инструкций ifelse if
Реализация инструкций типа ifelse if совпадают с реализацией конструкции разветвления . Добавим только тот факт , что пункт FALSE обладает ещё одним разветвлением этого же типа . Таким образом , мы получим цепочку проверок по пункту FALSE . Разветвление может осуществляться как командами BR_OP , так и SB_OP . Разветвление может быть комбинированным из двух типов :
                          
Случай с SB_OP такой же , как и был представлен выше , с перестановкой операций разветвления .

Инструкция выбора switch / case
Инструкция выбора switch / case – это частный случай инструкции ifelse if с ограничением , что проверяется та же переменная \ регистр на равенство с BREQ или BRNE а затем будет реализована инструкция , в соответствии с данными командами .

Инструкция цикла с предварительным сравнением while
Эта инструкция продолжает выполнение части кода , пока условие верно . Но перед этим проверяет условие и , если условие удовлетворено , выполняется набор команд , после которого следует переход на проверку этого же условия , образуя выполнение цикла . Если же результат проверки не удовлетворяет условию , тогда цикл игнорируется и выполнение программы будет выполнятся с команды , стоящей после цикла .
                       

Инструкция цикла с последующей проверкой dowhile
В этом случае , сначала будет выполнятся код программы цикла , только потом проверка условия . Если условие удовлетворительное , код цикла выполняется снова , если нет , цикл заканчивается и выполняется следующая за ним инструкция .Можно сделать таким образом , что последняя команда из цикла будет служить для выставления флагов регистра состояния SREG . Этого можно добиться командой BR_OP.
                 

Цикл for
Выполнение этого цикла схоже с циклом while . Он содержит инициализированный счётчик и в конце цикла всегда проверяет его значение (условие) .
        
где BR_OP показывает нам что это – дополнительное сравнении и вместо “<=” у нас будет “>” .

Обзор циклов
Выполнение циклов тип SB_OP идентично с выполнением циклов типа BR_OP , только немного разные правила их выполнения .


Делая вывод можно отметить , что лучше использовать цикл типа dowhile , это способствует повышению производительности программы .