При выполнении команд сдвига флаг CF всегда содержит значение последнего выдвинутого бита. Существуют следующие команды сдвига:
SHR;Логический (беззнаковый) сдвиг вправо
SHL;Логический (беззнаковый) сдвиг влево
SAR;Арифметический сдвиг вправо
SAL;Арифметический сдвиг влево
Следующий фрагмент иллюстрирует выполнение команды SHR:
MOV AX,10110111B; AX=10110111
SHR AX,4; 01011011;Сдвиг вправо на 4
Команда SHR сдвигает содержимое регистра AX вправо на 4 бит. Обратите внимание, что одна команда SHR AX,4 в отладчике выглядит как последовательность из четырех команд SHR AX,1. Это особенность языка Ассемблер в режиме masm. Выдвинутые в результате сдвига биты по очереди попадают в флаг CF, а самый левый бит регистра AX заполняется нулем.
Рассмотрим действие команд арифметического вправо SAR:
MOV AX,10110111B; AX=10110111
SAR AX,4; 11111011;Сдвиг вправо на 4
Команда SAR имеет важное отличие от команды SHR: для заполнения левого бита используется знаковый бит. Таким образом, положительные и отрицательные величины сохраняют свой знак. В приведенном примере знаковый бит содержит единицу.
|
|
При сдвигах влево правые биты заполняются нулями. Таким образом, результат команд сдвига SHL и SAL идентичен.
Сдвиг влево часто используется для удваивания чисел, а сдвиг вправо - для деления на 2. Эти операции осуществляются значительно быстрее, чем команды умножения или деления. Деление пополам нечетных чисел дает деление нацело и устанавливает флаг CF в 1. Для проверки бита, занесенного в флаг CF используется команда JC (переход, если есть перенос).