Программирование на Ассемблере
Сначала приведем список этих команд, а затем рассмотрим их работу более
подробно: Мнемоника Действие
--------------------------------------------------------------------------
ASL Source,Dest арифметический сдвиг влево на n бит
ASR Source,Dest арифметический сдвиг вправо на n бит
LSL Source,Dest логический сдвиг влево на n бит
LSR Source,Dest логический сдвиг вправо на n бит
ROL Source,Dest прокрутка влево на n бит
ROR Source,Dest прокрутка вправо на n бит
ROXL Source,Dest прокрутка на n бит влево через перенос
ROXR Source,Dest прокрутка на n бит вправо через перенос Допустимые значения операндов Source и Dest: Source Dest
-------------------
Dn Dn
#n Dn
-- (кроме регистров) Операнд Source определяет, на сколько битов сдвигать операнд Dest (когда в
качестве Dest выступает адрес в памяти, возможен сдвиг только на один бит).
На самом деле операции арифметического сдвига на n бит влево/вправо
эквивалентны умножению/делению операнда на два в степени n. Поясним это на
небольшом примере:
Рассмотрим байт, содержащий число 16 (или %00010000 в двоичном
представлении). Что произойдет если над этим байтом выполнить операцию
сдвига влево? Имеем: %00010000 = 16 (исходное число)
%00100000 = 32 (сдвинутое на один бит влево) Каждый последующий сдвиг удваивает операнд, поэтому после n сдвигов имеем
исходное значение, умноженное на 2^n (пока рассматриваем ситуацию, когда
биты не выдвигаются за разрядную сетку). Аналогично, при сдвиге вправо происходит деление на 2^n, но здесь есть одна
особенность. Например, сдвинем вправо число 5: %00000101 = 5 (исходное число)
%00000010 = 2 (сдвинутое на один бит вправо) В результате сдвига получаем 2, а не 2.5 - ведь мы имеем дело только с
целыми числами. Как видно из примера, при арифметическом сдвиге могут
теряться отдельные биты (выдвигаемые за разрядную сетку).
|