Скачиваний:
17
Добавлен:
11.04.2015
Размер:
182.7 Кб
Скачать
  1. Команды сдвига и циклического сдвига.

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.)

Соседние файлы в папке Ответы по пунктам