Микропрцессор 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.