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

Логический сдвиг операнда влево/вправо

SHL операнд, количество_сдвигов 
SHR операнд, количество_сдвигов 

SHL и SHR сдвигают биты операнда (регистр/память) влево или вправо соответственно на один разряд и изменяют флаг переноса cf. При логическом сдвиге все биты равноправны, а освободившиеся биты заполняются нулями. Указанное действие повторяется количество раз, равное значению второго операнда.

Пример: 
; al = 01011011 (двоичное) 
shr al, 3 

Это означает: сдвиг всех битов регистра al на 3 разряда вправо. Так что al станет 00001011. Биты слева заполняются нулями, а биты справа выдвигаются. Последний выдвинутый бит, становится значением флага переноса cf.

Команда shl такая же, как и shr, но сдвигает влево. 
; bl = 11100101 (двоичное) 
shl bl, 2 

После выполнения команды регистр bl будет равен 10010100 (двоичное). Два последних бита заполнились нулями, флаг переноса установлен, потому, что последний выдвинутый слева бит был равен 1



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

SAL операнд, количество_сдвигов 
SAR операнд, количество_сдвигов 

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

Пример: 
; al = 10100110 
sar al, 3 
; al = 11110100 
sar al, 2 
; al = 11111101 

; bl = 00100110 
sar bl, 3 
; bl = 00000010

Команда SALсдвигает биты операнда (регистр/память) влево на один разряд, значение последнего вытолкнутого бита попадает в флаг переноса, а освободившиеся биты заполняются нулями, при этом знаковый бит не двигается.

Пример: 
; al = 10100110 
sal al, 3 
; al = 10110000
sal al, 4 
; al = 10000000



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

rol операнд, количество_сдвигов 
ror операнд, количество_сдвигов 
rcl операнд, количество_сдвигов 
rcr операнд, количество_сдвигов 

Циклический сдвиг напоминает смещение, выдвигаемые биты, снова вдвигаются с другой стороны:

Пример: команды ror (циклический сдвиг вправо)

Из рисунка выше, биты вращаются, то есть каждый бит, который выталкивается снова вставляется с другой стороны. Флаг переноса cf содержит значение последнего выдвинутого бита.

ROL и ROR сдвигают все биты операнда влево(для ROL) или вправо(для ROR) на один разряд, при этом старший(для ROL) или младший(для ROR) бит операнда вдвигается в операнд справа(для ROL) или слева(для ROR) и становится значением младшего(для ROL) или старшего(для ROR) бита операнда; одновременно выдвигаемый бит становится значением флага переноса cf. Указанные действия повторяются количество раз, равное значению второго операнда.

RCL и RCR сдвигают все биты операнда влево (для RCL) или вправо (для RCR) на один разряд, при этом старший(для RCL) или младший(для RCR) бит становится значением флага переноса cf; одновременно старое значение флага переноса cf вдвигается в операнд справа(для RCL) или слева(для RCR) и становится значением младшего(для RCL) или старшего(для RCR) бита операнда. Указанные действия повторяются количество раз, равное значению второго операнда.

17.07.2015