Примеры:
MOV AL,01000111b
SHL AL,1; CF=0; AL=10001110b
MOV AL,01000111b
SHR AL,1; AL=00100011b; CF=1
MOV DH,00111000b
MOV CL,3
SHL DH,CL; CF=1; AL=11000000b;
Одно из основных применений команд логического сдвига - это быстрое умножение и деление целых чисел на степени двойки.
Сдвиг двоичного числа на к разрядов влево – это приписывание справа к двоичных нулей, т.е. умножение на 2к.
При сдвиге числа 5 на 3 разряда влево:
5=101b, 101000b=40=5*23
В общем случае умножение на 2к реализуется так:
MOV СL,к
SHL ор,СL; ор:= ор*2к.
Результат сдвига должен умещаться в ячейку. Путем сдвига можно реализовать умножение на 2 всех беззнаковых чисел, меньших 128, и всех знаковых чисел от -64 до +63.
Сдвиг на к разрядов вправо – это отбрасывание последних к разрядов, что соответствует получению неполного частного (операции div) от деления на 2к.
При сдвиге числа 18 на 3 разряда вправо:
18=10010b, 10b=2=18 div 23
В общем случае деление на 2к для беззнаковых чисел реализуется так:
MOV СL,к
SHR ор,СL; ор:= ор div 2к.
Арифметические сдвиги
Арифметический сдвиг влево (shift arithmetic left):
|
|
SAL op1,op2
Эта команда в точности совпадает с командой SHL.
Арифметический сдвиг вправо (shift arithmetic right):
SAR op1,op2
Примеры:
MOV BH,10001110b
SAR BH,1; BH=11000111b; CF=0
MOV BH,00001110b
SAR BH,1; BH=00000111b; CF=0
При делении -1 на 2 (т.е. при частном -0,5) команда IDIV выдаст ответ 0, а команда SAR – ответ -1.
MOV AL,-1; AL=11111111b
SАR AL,1; AL=11111111b (-1)
При делении неотрицательных чисел команда SAR дает тот же результат, что и команды SHR, DIV и IDIV.
Циклические сдвиги