Сдвиги и циклические сдвиги

Микропрцессор Intel обеспечивает ряд способов для передвижения битов в регистре или переменной памяти вправо или влево. Простейший из них - логический сдвиг.

SHL (сдвиг влево, так же известный как SAL) передвигает каждый бит в назначении на 1 разряд влево или в направлении к старшему значащему биту. Значение 1010110b (96h или 150d), хранящееся в AL сдвигается влево при помощи SHL AL,1. Результат - значение 00101100b (2Ch или 44d), которое возвращается в AL. Флаг переноса устанавливается в 1.

Старшие значащие биты сдвигаются за пределы операнда и во флаг переноса, а в младшие значащие биты устанавливаются нули.

Для чего используется сдвиг влево? Наиболее общее использование SHL - это выполнение быстрого умножения на 2, поскольку каждый SHL умножает операнд на 2. Например, следующий код умножает DX на 16:

...

SHL DX,1;DX * 2

SHL DX,1;DX * 4

SHL DX,1;DX * 8

SHL DX,1;DX * 16

...

Умножение при помощи сдвига много быстрее, чем использование инструкции MUL. Заметьте, что второй операнд SHL в этом примере, имеет значение 1. Это означает, что DX должен быть сдвинут влево на 1 бит. Для сдвига на число бит большее чем 1 можно использовать CL; например,

...

MOV CL,4

SHL DX,CL

...

умножает DX на 16, как в предыдущем примере.

Если существует левый сдвиг, то наверное, должен быть и правый. SHR (сдвиг вправо) во многом подобен SHL: он сдвигает биты операнда вправо, либо на 1, либо на CL бит, при этом младший значащий бит сдвигается во флаг переноса, а старший значащий бит устанавливается в 0. SHR - это быстрый способ беззнакового деления на 2.

SAR - арифметический сдвиг вправо, такой же как SHR, за исключением того, что в SAR старший значащий бит операнда сдвигается вправо на следующий бит и затем возвращается в самого себя. Значение 10010110b (90h или -106d), хранящееся в AL сдвигается вправо с помощью SAR AL,1. Результат - значение 11001011b (0CBh или -53d) сохраняемый в AL. Флаг переноса устанавливается в 0.

В результате этого, сохраняется знак операнда, поэтому SAR полезен для знакового деления на 2. Например,

...

MOV bx,-4

SAR bx,1

...

сохраняет -2 в BX.

Существует 4 инструкции циклического сдвига: ROR, ROL, RCR и RCL. ROR подобен SHR, за исключением, что младший значащий бит кроме сдвига во флаг переноса сдвигается так же обратно в старший значащий бит. Рис.4.10 показывает, как значение 10010110b (96h или 150d), хранящееся в AL, циклически сдвигается вправо с помощью ROR AL,1. Результат - значение 01001011b (04Bh или 75d), которое сохраняется в AL. Флаг переноса установлен в 0.

ROL выполняет действие, обратное ROR, сдвигая операнд циклическим образом, но влево, помещая старший значащий бит в младший значащий бит. Например,

...

MOV SI,49f1h

MOV CL,4

ROR SI,CL

...

помещает 149fh в SI, сдвигая биты 3-0 в биты 15-12, биты 7-4 в биты 3-0 и т.д.

RCR и RCL несколько отличаются. RCR подобен сдвигу вправо, в котором старший значащий бит сдвигается из флага переноса. Значение 10010110b (96h или 150d), хранящееся в AL, циклически сдвигается вправо через флаг переноса, который содержит значение 1, с помощью RСR AL,1. Результат - значение 11001011b (0cbh или 203d) которое сохраняется в AL. Флаг переноса установлен в 0.

RCL похож на сдвиг влево, в котором младший значащий бит заполняется из флага переноса. RCR и RCL полезны для сдвигов многословных операндов. Например, значение, типа двойного слова, в DX:AX умножается на 4:

...

SHL AX,1;бит 15 AX сдвигается в перенос

RCL DX,1;перенос сдвигается в бит 0 DX

SHL AX,1;бит 15 AX сдвигается в перенос

RCL DX,1;перенос сдвигается в бит 0 DX

...

Инструкции циклического сдвига, как и инструкции сдвига могут сдвигать операнд либо на 1 бит, либо на число бит, указанных в CL.


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



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