2.1.5. Регистр признаков CCR
(Руководство разработчика по микроконтроллерам семейства HCS08)Регистр признаков CCR — это 8-битный регистр, он содержит 6 флагов, которые также называют триггерами условий. Это флаги переноса C, нулевого результата Z, отрицательного результата N, переполнения V, дополнительного переноса H, а также бит глобальной маски прерывания I. Расположение перечисленных флагов в битах регистра CCR показано ниже:
Режим | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
---|---|---|---|---|---|---|---|---|
Чтение | V | 1 | 1 | H | I | N | Z | C |
Запись | ||||||||
Сброс | x | 1 | 1 | x | 1 | x | x | x |
Далее приведено краткое описание и логика установки каждого флага.
Флаг переполнения V
Флаг переполнения V (Overflow flag) указывает на возникновение переполнения при выполнении операций над операндами, представленными в формате со знаком.
Флаг устанавливается в 1, когда результат последней математической операции (сложение, вычитание, инкрементирование (увеличение на 1), декрементирование (уменьшение на 1), сравнение или сдвиг) получается больше +127 или меньше –128. Поэтому результат операции невозможно представить в однобайтном формате, и, следовательно, результат данной операции не верен. Примеры, подтверждающие это высказывание, приведены ниже.
Десятичная система счисления | Шестнадцатеричная система счисления, однобайтный формат со знаком, дополнительный код | ||||
+ | 10 10 | 0x0A 0x0A | V = 0 | ||
20 | 0x14 | ||||
+ | 10 120 | 0x0A 0x78 | V = 1 Переполнение! 0x82 = -126! | ||
130 | 0x82 | ||||
+ | -40 100 | 0xD8 0x64 | V = 0 | ||
60 | 0x3C | ||||
+ | -40 -100 | 0xD8 0x9C | V = 1 Переполнение! 0x74 = +116! | ||
-140 | 0x74 | ||||
Флаг дополнительного переноса H
Флаг дополнительного переноса H (Half carry) указывает на возникновении переноса между 3-м и 4-м битами результата любой арифметической операции.
Этот флаг необходим, если при обработке численных значений используют двоично-десятичный код (BDC). Примеры, демонстрирующие логику формирования флага дополнительного переноса, представлены ниже.
Шестнадцатеричная система счисления, однобайтный формат | |||
+ | 0x0A 0x01 | H = 0, нет дополнительного переноса! | |
0x0B | |||
+ | 0x1E 0x78 | H = 1, есть дополнительный перенос! | |
0x21 | |||
Флаг отрицательного результата N
Флаг отрицательного результата N (Negative flag) устанавливается, если после выполнения любой арифметической, логической операции или операции перемещения данных (чтение или запись) образуется отрицательное число. Центральный процессор считает отрицательным любое число, старший бит D7 которого установлен в 1.
На самом деле бит N копирует старший бит результата. Принято, что если старший бит числа со знаком равен 1, то это число отрицательное, а если равен 0, то это число положительное. Но для чисел в формате без знака бит N будет устанавливаться неправильно, и на него можно не обращать внимания. Пример:
знаковый бит | ||||||||
D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 | |
---|---|---|---|---|---|---|---|---|
+10 = | 0 | 0 | 0 | 0 | 1 | 0 | 1 | 0 |
–10 = | 1 | 1 | 1 | 1 | 0 | 1 | 1 | 0 |
.gif">Флаг нулевого результата Z
Флаг нулевого результата Z (Zero flag) устанавливается, когда результат любой арифметической или логической операции, а так же операции перемещения, равен 0. Если же результат отличен от 0, то флаг сбрасывается.
Флаг переноса С
Флаг переноса C (Carry/borrow flag — дословно флаг переноса/заёма) изменяет состояние в 4 случаях:
- В операциях сложения. Флаг С устанавливается в случае, когда результат операции больше 255. В таком случае он действует как флаг переноса. Обратите внимание на пример ниже: флаг переноса эквивалентен девятому биту представления числа с весом 256 (0x100)!
Десятичная система счисления | Шестнадцатеричная система счисления, однобайтный формат | ||||
+ | 10 120 | 0x0A 0x78 | С = 0 | ||
130 | 0x82 | ||||
+ | 100 180 | 0x64 0xB4 | C = 1, Перенос! Результат = 0x18+0x100 = = 0x118 = 24+256 = 280 | ||
280 | 0x1B | ||||
- В операциях вычитания. Флаг переноса устанавливается в 1, когда результат операции получается меньше 0 (отрицательная величина). В таком случае флаг C выполняет роль флага заёма (borrow), как это показано в примере ниже.
Десятичная система счисления | Шестнадцатеричная система счисления, однобайтный формат | ||||
− | 32 15 | 0x20 0x0F | С = 0 | ||
17 | 0x82 | ||||
− | 32 40 | 0x20 0x28 | C = 1 | ||
−8 | 0xF8 | ||||
Необходимо иметь в виду, что операция вычитания выполняется как операция сложения, где второе слагаемое взято с обратным знаком. Если эти действия проделать над реальными кодами (см. пример ниже), то вы увидите, что должен возникнуть заём, поскольку вычитали из меньшего (+32) большее (+40), но в примере с шестнадцатеричными кодами этого не произошло. Чтобы устранить этот неверный результат, в ЦП при операции вычитания бит переноса C сначала принудительно устанавливается в 1. Далее, если в результате операции сложения прямого кода с дополнительным произошло переполнение, то бит С автоматически сбрасывается в 0. Вышесказанное иллюстрирует пример вычитания в десятичной и шестнадцатеричной системах счисления:
Десятичная система счисления | Шестнадцатеричная система счисления, однобайтный формат | ||||
+ | 32 −40 | 0x20 0xD8 | C = 1 | ||
−8 | 0xF8 | ||||
- В операциях сдвига. Флаг С выполняет роль «девятого бита», принимая значение старшего бита (бит 7) при сдвиге влево. При сдвиге вправо он принимает значение младшего бита (бит 0).
- В операциях проверки битов. Бит С регистра признаков принимает значение проверяемого бита.
Обратите внимание! Особенностью флага нулевого результата Z и флага знака N в МК HCS08 является возможность их установки после операций пересылки данных.
Глобальная маска прерываний I
Бит маски прерываний I (Interrupt mask) разрешает или запрещает переход центрального процессора в режим прерывания. Если I = 0, то при поступлении запроса ЦП перейдет к выполнению подпрограммы прерывания. Если I = 1, то запрос на прерывание не будет обслуживаться до тех пор, пока бит I не будет сброшен в 0.
Электронные компоненты Freescale >>>
Подробнее о компании Freescale >>>