Флаги как индикаторы событийПод флагами понимаются значения некоторых битов в регистрах специального назначения. Такие биты в регистрах специального назначения после выполнения определенных команд могут устанавливаться в единицу (иначе говорят – флаг установлен или поднят), а могут опускаться в ноль (иначе – флаг опущен или сброшен).
В регистре 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 из нуля поднимется в единицу, после которого мы делаем проверку и идём по одному из вариантов.
Таким образом, флаги упрощают анализ результатов математических операций и избавляют нас от сложностей, связанных с организацией в программе постоянной проверки содержимого регистров общего назначения.
|