Предыдущий раздел | ОСНОВНЫЕ ОПЕРАТОРЫ АССЕМБЛЕРА | Следующий раздел |
Такие операторы перемещают все биты первого операнда (байта или слова) влево или вправо на число, заданное вторым операндом. Вторым операндом может быть только 1 или регистр CL.
Для всех восьми операторов сдвига флаг переноса CF является как бы расширением сдвигаемого операнда: в CF загружается значение бита, выдвинутого за пределы операнда.
Операторы сдвига разделяются на логические и арифметические. Логический оператор сдвига рассматривает знаковый бит операнда как обычный бит, а арифметический оператор сдвига обрабатывает бит знака особо.
1) shl - логический сдвиг влево. Этот оператор сдвигает число без знака (рис. 88). При каждом сдвиге в освободившийся нулевой бит заносится 0. Например, пусть (AL) = 10110100b, CF = 0, тогда:
shl al, 1 ; 01101000 àAL, 1 àCF
Рис. 88. Логический сдвиг влево shl
Одним из применений оператора shl является умножение беззнаковых чисел на степень числа 2. Например, пусть (CL) = 2, тогда:
shl ax, cl ; Умножение числа без знака в AX на 4
По сравнению с обычным умножением время выполнения в 6-8 раз меньше.
2) sal – арифметический сдвиг влево. Этот оператор сдвигает число со знаком. Действие аналогично shl. При этом содержимое знакового бита не сохраняется, но оно переписывается в флажок OF. Например, пусть (AL) = 10110100b, CF = 0, OF = 0, тогда:
sal al, 1 ; 01101000 à AL, 1 à CF, 1 à OF
3) shr – логический сдвиг вправо. Этот оператор сдвигает число без знака. При каждом сдвиге операнда в освободившийся старший бит (бит 7 для байта и бит 15 для слова) заносится 0 (рис. 89). Например, пусть (AL) = 10110100b, CF = 1, тогда:
shr al, 1 ; 01011010 àAL, 0 àCF
Рис. 89. Логический сдвиг вправо shr
Одним из применений оператора shr является деление беззнаковых чисел на степень числа 2. Например, пусть (CL) = 2, тогда:
shr ax, cl ; Деление беззнакового числа в AX на 4
4) sar – арифметический сдвиг вправо. Данный оператор сдвигает число со знаком. При сдвиге в старшие освобождающиеся биты дублируется знак операнда (рис. 90). Например, пусть (AL) = 10110100b, CF = 1, тогда:
sar al, 1 ; 11011010 àAL, 0 àCF
Рис. 90. Арифметический сдвиг вправо sar
Одним из применений оператора sar является деление чисел со знаком на степень числа 2. Например, пусть (CL) = 3, тогда:
sar ax, cl ; Деление числа со знаком в AX на 8
5) rol– циклический сдвиг влево. При выполнении данного оператора (как и любого другого циклического оператора) вышедший за пределы операнда бит входит в него с противоположного конца (рис. 91). Например, пусть (AL) = 10110100b, CF = 0, тогда:
rol al,1 ; 01101001 àAL, 1 àCF
Рис. 91. Циклический сдвиг влево rol
6) ror– циклический сдвиг вправо (рис. 92). Например, пусть (AL) = 10110100b, CF = 1, тогда:
ror al, 1 ; 01011010 à AL, 0 à CF
Рис. 92. Циклический сдвиг вправо ror
7) rcl– циклический сдвиг влево через перенос (рис. 93). Например, пусть (AL) = 10110100b, CF = 1, тогда:
rcl al, 1 ; 01101001 àAL, 1 àCF
Рис. 93. Циклический сдвиг влево через перенос rcl
8) rcr – циклический сдвиг вправо через перенос (рис. 94). Например, пусть (AL) = 10110100b, CF = 1, тогда:
rcr al,1 ; 11011010 àAL, 0 àCF
Рис. 94. Циклический сдвиг вправо через перенос rcr
Предыдущий раздел | В начало | Следующий раздел |