Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скляров И. Изучаем Assembler за 7 дней (2010).pdf
Скачиваний:
1335
Добавлен:
23.02.2015
Размер:
2.11 Mб
Скачать

http://www.sklyaroff.ru

78

mov eax, FFFF0000h ; eax = 11111111111111110000000000000000b

not eax ; eax = 00000000000000001111111111111111b = 0000FFFFh (результат)

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

Команды сдвига выполняют побитовый сдвиг в поле операнда вправо или влево, в зависимости от кода операции. Команды сдвига делятся на две основные группы:

команды линейного (нециклического) сдвига;

команды циклического сдвига.

Все команды сдвига устанавливают флаг переноса CF, причем последний выдвинутый бит становится значением флага переноса CF.

4.6.1. Команды линейного (нециклического) сдвига

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

SHR приемник,счетчик ; логический сдвиг вправо

SHL приемник,счетчик ; логический сдвиг влево

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

SAL приемник,счетчик ; арифметический сдвиг влево

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

Примеры:

mov al,57h ; al= 1010111b shl al,4

; Теперь al = 1110000b. Флаг переноса cf=0, т. к. последний выдвинутый слева бит был 0.

mov bh,5C ; bh= 1011100b shr bh,3

; Теперь bh=0001011b. Флаг переноса cf=1, т. к. последний выдвинутый слева бит был 1.

Команды арифметического линейного сдвига отличаются от команд логического сдвига тем, что они особым образом обрабатывают знаковый разряд операнда.

Команда SAL такая же, как SHL, а вот команда SAR имеет одно принципиальное отличие от SHR. Команда SAR не обнуляет самый левые (старшие) биты после сдвига, как это делает SHR, а заполняет их значением самого старшего бита операнда, т. е. команда SAR сохраняет знак числа.

Примеры:

mov al,57h ; al= 1010111b sal al,4

; Теперь al = 1110000b. Флаг переноса cf=0, т. к. последний выдвинутый слева бит был 0.

mov bl, B5 ; al = 10110101b sar bl, 3

; Теперь al = 11110110b. Флаг переноса cf=1, т. к. последний выдвинутый слева бит был 1.

mov dl,26h ; dl = 00100110b sar dl, 5

; Теперь dl = 0000001b. Флаг переноса cf=0, т. к. последний выдвинутый слева бит был 0.

Команды арифметического сдвига имеют одну уникальную особенность, которая часто используется программистами на ассемблере. Дело в том, что сдвиг влево