Логический сдвиг вправо (shift right): SHR op,1

Примеры:

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.

Циклические сдвиги


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: