Assembler для начинающих




Операции сдвига и поворота - часть 4


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



Содержание  Назад  Вперед