Команды сдвига

При выполнении команд сдвига флаг CF всегда содержит значение последнего выдвинутого бита.

Существуют следующие команды cдвига:

SHR ;Логический (беззнаковый) сдвиг вправо

SHL ;Логический (беззнаковый) сдвиг влево

SAR ;Арифметический сдвиг вправо

SAL ;Арифметический сдвиг влево

Следующий фрагмент иллюстрирует выполнение команды SHR:

MOV CL,03 ; AX:

MOV AX,10110111B ; 10110111

SHR AX,1 ; 01011011 ;Сдвиг вправо на 1

SHR AX,CL ; 00001011 ;Сдвиг вправо на 3

Первая команда SHR сдвигает содержимое регистра AX вправо на 1 бит.

Выдвинутый в результате один бит попадает в флаг CF, а самый левый бит регистра AX заполняется нулем. Вторая команда cдвигает содержимое регистра AX еще на три бита. При этом флаг CF последовательно принимает значения 1, 1, 0, а в три левых бита в регистре AX заносятся нули.

Рассмотрим действие команд арифметического вправо SAR:

MOV CL,03 ; AX:

MOV AX,10110111B ; 10110111

SAR AX,1 ; 11011011 ;Сдвиг вправо на 1

SAR AX,CL ; 11111011 ;Сдвиг вправо на 3

Команда SAR имеет важное отличие от команды SHR: для заполнения левого бита используется знаковый бит. Таким образом, положительные и отрицательные величины сохраняют свой знак. В приведенном примере знаковый бит содержит единицу.

При сдвигах влево правые биты заполняются нулями. Таким обpазом, результат команд сдвига SHL и SAL индентичен.

Сдвиг влево часто используется для удваивания чисел, а сдвиг вправо — для деления на 2. Эти операции осуществляются значительно быстрее, чем команды умножения или деления. Деление пополам нечетных чисел (например, 5 или 7) образует меньшие значения (2 или 3, соответственно) и устанавливает флаг CF в 1. Кроме того, если необходимо выполнить сдвиг на 2 бита, то использование двух команд сдвига более эффективно, чем использование одной команды с загрузкой регистра CL значением 2.

Для проверки бита, занесенного в флаг CF используется команда JC (переход, если есть перенос).