2.3.5. Сдвиговые операции

Команда

Назначение

Процессор

SAR приемник.счетчик

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

8086

SAL приемник.счетчик

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

8086

SHR приемник.счетчик

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

8086

SHL приемник.счетчик

Логический сдвиг влево

8086

Эти четыре команды выполняют двоичный сдвиг приемника (регистр или пере­менная) вправо (в сторону младшего бита) или влево (в сторону старшего бита) на значение счетчика (число или регистр СЬ, из которого учитываются только младшие 5 бит, принимающие значения от 0 до 31). Операция сдвига на 1 экви­валентна умножению (сдвиг влево) или делению (сдвиг вправо) на 2. Так, число ООЮЬ (2) после сдвига на 1 влево превращается в ОЮОЬ (4). Команды ЗАЬ и ЗНЬ выполняют одну и ту же операцию (на самом деле это одна и та же коман­да) - на каждый шаг сдвига старший бит заносится в СБ, все биты сдвигаются влево на одну позицию, и младший бит обнуляется. Команда БНЫ осуществляет прямо противоположную операцию: младший бит заносится в СБ, все биты сдви­гаются на 1 вправо, старший бит обнуляется. Эта команда эквивалентна беззнако­вому целочисленному делению на 2. Команда ЗЛЯ действует по аналогии с ЗНЯ, только старший бит не обнуляется, а сохраняет предыдущее значение, вот почему, например, число ШИЮОЬ (-4) перейдет в ШШЮЬ (-2). 8АЯ, таким обра­зом, эквивалентна знаковому делению на 2, но, в отличие от ГО1У, округление происходит не в сторону нуля, а в сторону отрицательной бесконечности. Так, если разделить —9 на 4 с помощью ГО1У, получится -2 (и остаток -1), а если вы­полнить арифметический сдвиг 'вправо числа -9 на 2, результатом будет -3. Сдви­ги больше 1 эквивалентны соответствующим сдвигам на 1, выполненным после­довательно. Схема всех сдвиговых операций приведена на рис. 7.

Сдвиги на 1 изменяют значение флага ОБ: ЗАЬ/ЗНЬ устанавливают его в 1, если после сдвига старший бит (то есть старшие два бита исходного

числа не были одинаковыми), и в 0, если старший бит остался тем же. 8АЯ уста­навливает ОБ в 0, а БНЫ - б значение старшего бита исходного числа. Для сдви­гов на несколько битов значение ОБ не определено. Флаги РБ назначаються всеми сдвигами в соответствии с результатом, параметр ЛЬ не определен (кроме случая, когда счетчик сдвига равен нулю: ничего не происходит и флаги не изме­няются).

В процессорах 8086 в качестве второго операнда можно было задавать лишь число 1 и при использовании СЬ учитывать все биты, а не только младшие 5, но уже начиная с 80186 эти команды приняли свой окончательный вид.

Команда

Назначение

Процессор

SHRD приемник.источник.счетчик SHLD приемник.источник.счетчик

Сдвиг повышенной точности вправо Сдвиг повышенной точности влево

80386 80386

Приемник (регистр или переменная) сдвигается влево (в случае 8НЬО) или впра­во (в случае 8НКЬ)) на число битов, указанное в счетчике (число или регистр СЬ, откуда используются только младшие 5 бит, принимающие значения от 0 до 31). Старший (для БНЬБ) или младший (в случае БНЬШ) бит не обнуляется, а счи-тывается из источника (регистр), значение которого не изменяется. Например, если приемник содержит ООЮІООІЬ, источник - 1010Ь,то счетчик равен 3, 8НКЬ) даст в результате 0100010Ш, а 8НЬБ - 01001101Ь (см. рис. 8).

источник

приемник

 

 

СИ

 

15,31

15,31

0

БНЬХ> -СБ ■<-приемник

15,31 0 15,31 О

Рис. 8. Сдвиги двойной точности

Флаг ОБ устанавливается при сдвигах на 1 бит, если изменился знак прием­ника, и сбрасывается в противном случае; при сдвигах на несколько битов флаг ОБ не определен. Во всех случаях БЬ, и РБ устанавливаются в соответствии с результатом и ЛБ не определен, кроме варианта со сдвигом на 0 бит, в котором значения флагов не изменяются. Если счетчик больше, чем разрядность прием­ника, - результат и все флаги не определены.

Команда Назначение Процессор

г-ЮГ-і приемник.счетчик

Циклический сдвиг вправо

8086

гГО1_ приемник.счетчик

Циклический сдвиг влево

8086

ЯСЯ приемник.счетчик

Циклический сдвиг вправо через флаг переноса .

8086

гГС1_ приемник.счетчик

Циклический сдвиг влево через флаг переноса

8086

Эти команды осуществляют циклический сдвиг приемника (регистр или пе­ременная) на число битов, указанное в счетчике (число или регистр СЬ, из кото­рого учитываются только младшие 5 бит, принимающие значения от 0 до 31). При выполнении циклического сдвига на 1 команды ЯОЯ (ЯОЬ) перемещают каждый бит приемника вправо (влево) на одну позицию, за исключением самого младшего

(старшего), который записывается в позицию самого старшего (младшего) бита.

Команды ДСЯ и ЯСЬ выполняют аналогичное действие, но включают флаг СБ в цикл, как если бы он был дополнительным битом в приемнике (см. рис. 9).

После выполнения команд циклического сдвига флаг СБ всегда равен последне­му вышедшему за пределы приемника биту, флаг ОБ определен только для сдвигов на 1 - он устанавливается, если изменилось значение самого старшего бита, и сбра­сывается в противном случае. Флаги ББ,      ЛБ и РБ не изменяются.