
- •Обучение : Программирование на Ассемблере для pic
- •Команды сложения и вычитания регистров
- •Команды определения бита
- •Команды взаимодействия c аккумулятором w
- •Команды сложения и вычитания констант
- •Команды очистки регистров f и w (обнуления)
- •Пустышки и метки
- •Команды переходов
- •Вопросы для самопроверки
- •Команды счётчики
- •Переход по событиям в счётчиках
- •Переход по результатам бит-проверки
- •Флаги как индикаторы событий
- •Команды сравнения
- •Команды сдвига битов в регистре
- •Сдвиг вправо битов в регистре rrf f, d сдвиг влево битов в регистре rlf f, d
Переход по событиям в счётчиках
Переход по событиям в счётчиках – ни что иное, как зачатки интеллекта нашего МК. Суть работы заключается в выполнении счёта до определенного момента, т.е. до тех пор, пока регистр, увеличиваемый или уменьшаемый командой счётчиком, не станет равен нулю, а это произойдет либо при "переносе", либо при "заёме".
УВЕЛИЧЕНИЕ НА ЕДИНИЦУ в общем виде выглядит как INCFSZ F,D
если после увеличения результат равен 0,
то пропуск следующей команды
УМЕНЬШЕНИЕ НА ЕДИНИЦУ в общем виде выглядит как DECFSZ F,D
если после уменьшения результат равен 0, то пропуск следующей команды
Разберемся c этим фрагментом кода. Сначала мы записали через аккумулятор W в регистр CLOP число 255, затем его увеличили на единицу (инкрементировали), в результате у нас произошло переполнение (или перенос), т.е. результат операции равен нулю – 0 и как следствие, пропускается команда GOTO Metka1. Поскольку мы результат операции увеличения на единицу сохранили в аккумуляторе W, то в регистре CLOP осталось прежнее число. Уменьшаем регистр CLOP на единицу; результат операции 254, и этот результат отличается от нуля, следовательно, выполняется следующая команда GOTO Metka2.
Переход по результатам бит-проверки
По сравнению с предыдущими командами это более интеллектуальные команды. Их актуальность во много связана с проверкой состояния ножек МК, а если быть точнее, с проверкой битов в регистрах.
Суть работы – сравнение с единицей или нулем указанного в команде бита. Если значение указанного бита удовлетворяет команде, то выполняется следующая команда, иначе следующая команда пропускается.
Проверить бит на равенство нулю BTFSC F,B
если бит B=1, то выполняется следующая инструкция
если бит B=0, то следующая инструкция пропускается
Проверить бит на равенство единице BTFSS F,B
если бит B=0, то выполняется следующая инструкция
если бит B=1, то следующая инструкция пропускается
Разберем фрагмент этого кода. Помните, биты в регистре нумеруются справа налево и от нуля до семи, следовательно, первый бит в примере у нас равен нулю. Сделав первую проверку по команде BTFSC PORTB,1 обнаруживается совпадение и пропускается следующая команда – GOTO Metka1. Во второй проверке по команде BTFSS PORTB,1 обнаруживается несовпадение и выполняется следующая команда – GOTO Metka2.
Важный вывод. Комбинация команд "переходов по результатам проверки" и команд простых переходов позволяют разветвлять ход программы по нескольким сценариям, тем сам выполнять те или иные задачи.
Флаги как индикаторы событий
Под флагами понимаются значения некоторых битов в регистрах специального назначения. Такие биты в регистрах специального назначения после выполнения определенных команд могут устанавливаться в единицу (иначе говорят – флаг установлен или поднят), а могут опускаться в ноль (иначе – флаг опущен или сброшен).
В регистре STATUS с адресом H03 мы рассмотрим два флага:
– флаг Z (второй бит) – флаг нулевого результата
если Z=1, то был нулевой результат выполнения команды
если Z=0, то ненулевой результат выполнения команды
– флаг C (нулевой бит) – флаг переноса-займа
если C=1, то было переполнение регистра (происходил перенос)
если C=0, то не было переполнения регистра (либо был заём)
Как работать с флагами?
Если в ходе программы предполагается переполнение регистра (или ожидается заём) и нам необходимо отслеживать эти события, то выполняем следующую последовательность:
STATUS EQU H0003 ; определяем регистр
C EQU H0000 ; определяем номер бита для флага C
Z EQU H0002 ; определяем номер бита для флага Z
; ============================================================
; ПРОВЕРКА НА ФАКТ ПЕРЕНОСА
...
BCF STATUS,C ; опускаем флаг C в ноль
;... операции увеличения каких либо регистров
BTFSS STATUS,C ; делаем бит-проверку C-флага
; если бит C=0, то выполняется следующая инструкция
; если бит C=1, то следующая инструкция пропускается
; ============================================================
Установка флага из нуля в единицу подтверждает факт переноса.
; ПРОВЕРКА НА ФАКТ ЗАЙМА
...
BSF STATUS,C ; поднимаем флаг C в единицу
;... операции уменьшения каких либо регистров
BTFSC STATUS,C ; делаем бит-проверку C-флага
; если бит C=1, то выполняется следующая инструкция
; если бит C=0, то следующая инструкция пропускается
; ============================================================
Установка флага из единицы в ноль подтверждает факт займа.
Ранее было обещано рассмотрение команды "MOVF KLOP,F" , в которой результат копирования помещается назад в регистр KLOP.
Если регистр KLOP равен нулю, то после команды "MOVF KLOP,F" флаг Z из нуля поднимется в единицу; иначе из единицы опустится в ноль.
; ============================================================
; ПРОВЕРКА НА РАВЕНСТВО НУЛЮ
CLRF CLOP ; обнулим регистр KLOP
BCF STATUS,Z ; опустим флаг Z в ноль
MOVF KLOP,F ; копировать из KLOP в KLOP
BTFSC STATUS,Z ; делаем бит-проверку Z-флага
; если Z=1, то выполняется следующая инструкция, иначе – пропускается
; ============================================================
Умышленная очистка регистра KLOP командой CLRF была сделана ради примера. В результате операции "MOVF KLOP,F" флаг Z из нуля поднимется в единицу, после которого мы делаем проверку и идём по одному из вариантов.
Таким образом, флаги упрощают анализ результатов математических операций и избавляют нас от сложностей, связанных с организацией в программе постоянной проверки содержимого регистров общего назначения.