Как ведут себя флаги при выполнении команд умноженияи деления, следует смотреть в полном описании команд.
Есть «ублюдочные» процессоры, в которых умножение и деление – неполноценные (например, i8051).
Частный случай умножения – умножение на степень 2-х, (т.е. на степень основания системы счисления) можно реализовать сдвигом операнда на соответствующее число разрядов влево для положительной степени или вправо для отрицательной. Для этого в системе команд может иметься команда арифметического сдвига. При арифметическом сдвиге вправо (деление на степень двойки) знаковый разряд числа сохраняет свое значение неизменным, а при сдвиге влево (умножение на степень двойки) правый конец операнда заполняется нулями. Если при сдвиге влево знаковый разряд операнда изменял свое значение – это означает, что при умножении произошло переполнение (выход за пределы диапазона представимых значений), это вызывает изменение флагов cf и of
Сравнение в ЦВМ используется для организации последующего ветвления алгоритма (условного перехода в программе) в зависимости от результата сравнения.
Сравнение можно производить по условиям:
а) равно / неравно
б) больше / меньше
Условие а) всегда осмысленно и формально означает, что все биты сравниваемых операдов одинаковы.
Условие б) - его семантика понятна для данных, которые неким образом упорядочены, таких как числа или символы алфавита. Для такого вида данных, как битовые поля - не всегда понятно, что такое "больше/.меньше"
Сравнение в процессоре происходит по одной из двух схем:
1) Сравнение операнда с нулем (его можно произвести
специальной командой проверка – в системе команд i*86 – команда test a,
b ее рассмотрим при обсуждении работы с битовыми полями)
2) Сравнение двух операндов между собой (вычитанием и последующим сравнением
результата с нулем)
Для сравнения двух чисел можно использовать команды
вычитания, кроме того обычно в системе команд есть специальные команды для
сравнения. В i*86 это команда
cmp a,b - она делает вычитание a – b, по результату операции
устанавливаются флаги, после чего результат вычитания теряется, а операнды
сохраняются неизменнымиОбычно в процессоре имеются еще два триггера (флага),
которые меняют свое состояние при выполнении команд в зависимости от
получившегося результата:
Z (zf - от Zero) - флаг нулевого результата: zf ß 1, если результат равен нулю.
N (sf - от Negatve или от Sign) - флаг отрицательного результата (знака) -
значение этого флага совпадает со знаковым разрядом результата, т.е. 1
соответствует знаку "минус".
Для сравнения с нулем есть специальные команды "проверить
операнд" (в i*86 команда
test a, b), а кроме того флаги zf и sf могут
устанавливаться при выполнении других команд (таких как загрузки и пересылки).
После выполнения команды, осуществляющей сравнение (и переустанавливающей флаги) надо осуществить ветвление. Для этого в процессоре обычно существует большая группа команд условного ветвления, которое происходит (или нет) в зависимости от состояния тех или иных флагов.
В группе команд ветвления можно выделить три подгруппы:
Ветвление по простому условию:
Описание |
Условие |
Альтернативное |
Семантика |
По знаку |
sf = 0 |
sf = 1 |
Результат положителен/отрицателен |
По нулю |
zf = 0 |
zf = 1 |
Результат равен/не равен нулю |
По переносу |
cf = 0 |
cf = 1 |
Установлен/нет флаг cf |
По переполнению |
of = 0 |
of = 1 |
Установлен/нет флаг of |
При сравнении двух чисел в результате вычитания может быть получен как правильный результат, так и переполнение разрядной сетки. Однако оказывается, что и при переполнении можно определить, какой из операндов был больше, анализируя комбинацию флагов.
Ветвление по результату сравнения беззнаковых чисел
Описание |
Условие |
Если больше |
cf zf = 0 |
Если меньше или равно |
cf zf = 1 |
Если больше или равно |
cf = 0 |
Если меньше |
cf = 1 |
Ветвление по результату сравнения чисел со знаком
Описание |
Условие |
Если больше или равно |
sf of = 0 |
Если меньше |
sf of = 1 |
Если больше |
(sf of) zf = 0 |
Если меньше или равно |
(sf of) zf = 1 |
[1] Использован оборот «не превышает» вместо «равно» так как не все кодовые комбинации могут использоваться для представления числовых значений, см., например кодирование чисел в формате плавающей точки.
*) Единица в старшем разряде HEX-представления изображена условно, чтобы показать значение знакового бита. Реально, например в 16-разрядной сетке старшая HEX-цифра отрицательных чисел может быть от 8 до F.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.