Виды данных. Операции с числами и структура системы команд, страница 4

Как ведут себя флаги при выполнении команд умноженияи деления, следует смотреть в полном описании команд.

Есть «ублюдочные» процессоры, в которых умножение и деление – неполноценные (например, 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.