
assem / Ответы по пунктам / 030
.docx-
Команды сдвига и циклического сдвига.
SAL, SAR (shift arithmetic left, right) - сдвиг со знаком.
SAR - сохраняет (дублирует) знак.
SAL - не сохраняет знака, но заносит 1 в бит регистра флагов CF вслучае изменения знака.
SHL (shift logical left) - производит логический сдвиг влево. SHR (shift logical right) - производит логический сдвиг вправо.
Две последние команды при сдвиге в освободившиеся биты заносят нули. Все команды сдвига имеют вид: <код_сдвига> <opl>,<op2> , где <opl> - данное, которое надо сдвинуть; <ор2> - константа сдвига =1, если сдвиг на один бит, если на большее количество битов, то в регистр cl, заносится константа сдвига: Пример: AL = 10110100; CF=1.
Команды сдвига дают результат:
sal al,1 ; al = 01101000 cf = 1
sar al,1 ; al = 11011010 cf=0
shr al,1 ; al = 01011010 cf=0
shl al,1 ; al = 01I01000 j cf=l
Интересное приложение команды сдвига SHL для преобразования двух неупакованных BCD чисел (старшая цифра в регистре bl, младшая - в аl) в упакованное BCD число в регистре al:
mov cl,4 ;счётчик сдвига на 4 бита в сl
slil bl, сl ; сдвинуть старшую цифру в старшие 4 бита bl
or al, bl ; получить упакованное число слиянием al и bl
Например: неупакованное десятичное число 9 в двоичной системе выглядит как
9 = (00001001) в bl после сдвига на 4 бита влево выглядит как (10010000) в bl.
Десятичное неупакованное число 7 в двоичной системе выглядит как:
7 = (00000111 ) в al Выполняем команду OR (логическое сложение) и получаем упакованный результат (10010111 )в al.
Команды сдвига можно использовать для быстрого умножения и деления на 2.
Так на 10 можно умножить следующим образом (ах = 10 ):
mov bx,ax ; 10 в bx
shl ах,1 ; сдвинуть ах на 1 бит влево т. е. ax*2
shl ах,1 ; ах * 4
add ax.bx ; сложить с исходным значением (умножение на 5 )
shl ах,1 ; умножение на 2 (т. е. на 10 ). Эти команды выполняются в 11 раз быстрее, чем команда умножения mul.
Циклический сдвиг:
ROL, ROR ( rotate left, right) - вышедший за пределы операнда бит сохраняется и заносится в операнд с противоположного конца. RCL, RCR (rotate left (right) through carry) - сдвинуть влево циклически вместе с флагом переноса и в противоположный конец операнда поместить значение флага переноса cf.
(SAL, SAR (shift arithmetic left, right) - сдвиг со знаком. SAR - сохраняет (дублирует) знак.
SAL - не сохраняет знака, но заносит 1 в бит регистра флагов CF в случае изменения знака.
SHL (shift logical left) - производит логический сдвиг влево. SHR (shift logical right) - производит логический сдвиг вправо.
Две последние команды при сдвиге в освободившиеся биты заносят нули. Все команды сдвига имеют вид: <код_сдвига> <op1>,<op2> , где <ор1> - данное, которое надо сдвинуть; <ор2> - константа сдвига =1, если сдвиг на один бит, если на большее кол-во битов, то в регистр cf, заносится константа сдвига:
Команды сдвига можно использовать для быстрого умнож. и деления на 2.
Эти команды выполняются в 11 раз быстрее, чем команда умножения mull. В компьютере данные хранятся в двоичной системе исчисления. 2 – основание этой системы. Умножение на 2 равносильно сдвигу числа на 1 влево; деление на 2 – сдвигу числа на 1 вправо.
Пусть число лежит в АХ.
Умножение:
shl ax, 1
Деление:
shr ax, 1
Циклический сдвиг: ROL, ROR (rotate left, right) - вышедший за пределы операнда бит сохраняется и заносится в операнд с противоположного конца. RCL, RCR (rotate left (right) through carry) - сдвинуть влево циклически вместе с флагом переноса и в противоположный конец операнда поместить значение флага переноса cf.)