Таким образом, команды сдвига делают
Таким образом, команды сдвига делают эффективным умножение и
деление на степень 2. Фактически, воэможность замены умножения
сдвигом становится хорошим выходом в ситуациях, когда необходимо
исключить умножение, даже если множитель не есть степень 2.
При арифметическом сдвиге вместо деления на 2 отрицательного
числа возникает следующая проблема. Если команда вдвигает 0 в
старший бит, результат становится положительным. Команда
арифметического сдвига вправо SAR решает эту проблему путем
восстановления значения старшего бита во время сдвига. Поэтому
отрицательное число остается отрицательным, а положительное -
положительным. Эта проблема не возникает в случае сдвига влево,
поскольку бит знака находится у операнда слева. Из=за этого команды
логического сдвига влево SHL и арифметического сдвига влево SAL
идентичны.
В связи с арифметической природой, все команды сдвогов влияют
на флаг переполнения так же, как и на флаг переноса. Флаг
переполнения не определен в случае счетчиков сдвига больших
единицы, но при единичных сдвигах команды устанавливают флаг
переполнения только в случае, если в результате операции изменился
знак числа. Если старший бит не изменился, флаг переполнения
сбрасывается, т.е. флаг переполнения показывает, дает ли
подразумеваемое сдвигом умножение или деление правильный результат
в дополнительном коде.
На Фиг. 4.21 приведены два примера команд сдвига. Первый пример
демонстрирует умножение на число с помощью команд сдвига влево. В
примере выполняется умножение на 9, не являющееся степенью 2.
Сначала в примере данные сдвигаются влево на три позиции, чтобы
умножить число на 8. Затем программа складывает полученное значение
с первоначальным, давая результат, равный первоначальному числу,
умноженному на 9.
Недостатки этого метода очевидны. Он требует много больше
команд, чем простое умножение - которое выглядело бы примерно так:
Содержание Назад Вперед