Сделай Сам Свою Работу на 5

Процессор х86: инструкции сдвига. Умножение и деление на константы.

Операции сдвига, как и следует из их названия, осуществляют сдвиг операнда приемника вправо или влево на заданное число битов. Приемником может быть регистр или объект в памяти, источником – непосредственное значение, либо регистр cl.

Основное назначение операций сдвига – осуществление быстрого умножения и деления. Как в десятичной системе счисления дописывание нулей справа, т.е. сдвиг числа влево, соответствует умножению на 10, 100, 1000 и т.д., так в двоичной системе счисления дописывание нулей справа соответствует умножению на 2, 4, 8 и т.д. И наоборот, отбрасывание разрядов справа, т.е. сдвиг вправо, соответствует целочисленному делению на 10, 100, 1000 и т.д. в десятичной системе счисления и на 2, 4, 8 и т.д. - в двоичной. Поэтому практически всегда, когда в целочисленных расчетах встречается умножение или деление на константу, являющуюся целой степенью числа 2, они заменяются операциями сдвига. Кроме того, современные оптимизирующие компиляторы заменяют операции целочисленного умножения и деления на константу последовательностями сдвигов и сложений или вычитаний.

Для сдвигов беззнаковых операндов влево и вправо используются операции логического сдвига с мнемокодами shl и shr – соответственно, а для знаковых - операции арифметического сдвига с мнемокодами sal и sar – соответственно. Мнемокоды sal и shl соответствуют одной и той машинной операции, при которой на освободившиеся места справа записываются нули, и имеют различные обозначения только для симметрии. При логическом сдвиге вправо на освободившиеся места слева записываются нули, а при арифметическом – знаковый бит.

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

 Команда: SAR приемник, счетчик
 Назначение: Арифметический сдвиг вправо
 Команда: SAL приемник, счетчик
 Назначение: Арифметический сдвиг влево
 Команда: SHR приемник, счетчик
 Назначение: Логический сдвиг вправо
 Команда: SHL приемник, счетчик
 Назначение: Логический сдвиг влево
 Процессор:

Эти четыре команды выполняют двоичный сдвиг приемника (регистр или переменная) вправо (в сторону старшего бита) или влево (в сторону младшего бита) на значение счетчика (число или регистр CL, из которого учитываются только младшие пять бит, которые могут принимать значения от 0 до 31), Операция сдвига на 1 эквивалентна умножению (сдвиг влево) или делению (сдвиг вправо) на 2. Так, число 0010b (2) после сдвига на 1 влево превращается в 0100b (4). Команды SAL и SHL выполняют одну и ту же операцию (на самом деле это одна и та же команда) — на каждый шаг сдвига старший бит заносится в CF, все биты сдвигаются влево на одну позицию, и младший бит обнуляется. Команда SHR выполняет прямо противоположную операцию: младший бит заносится в CF, все биты сдвигаются на 1 вправо, старший бит обнуляется. Эта команда эквивалентна беззнаковому целочисленному делению на 2. Команда SAR действует по аналогии с SHR, только старший бит не обнуляется, а сохраняет предыдущее значение, так что, например, число 11111100b (-4) перейдет в 11111110b (-2). SAR, таким образом, эквивалентна знаковому делению на 2, но, в отличие от IDIV, округление происходит не в сторону нуля, а в сторону отрицательной бесконечности. Так, если разделить -9 на 4 с помощью IDIV, результат будет -2 (и остаток -1), а если выполнить арифметический сдвиг вправо числа -9 на 2, результат будет -3. Сдвиги больше чем на 1 эквивалентны соответствующим сдвигам на 1, выполненным последовательно. Схема всех сдвиговых операций приведена на рис. 7.



 

Рис. 7. Сдвиговые операции

Сдвиги на 1 изменяют значение флага OF: SAL/SHL устанавливают его в 1, если после сдвига старший бит изменился (то есть старшие два бита исходного числа не были одинаковыми), и в 0, если старший бит остался тем же. SAR устанавливает OF в 0, и SHR устанавливает OF в значение старшего бита исходного числа. Для сдвигов на несколько бит значение OF не определено. Флаги SF, ZF, PF устанавливаются всеми сдвигами в соответствии с результатом, значение AF не определено (кроме случая, если счетчик сдвига равен нулю, в котором ничего не происходит и флаги не изменяются).

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

 Команда: SHRD приемник, источник, счетчик
 Назначение: Сдвиг повышенной точности вправо
 Команда: SHLD приемник, источник, счетчик
 Назначение: Сдвиг повышенной точности влево
 Процессор:

Приемник (регистр или переменная) сдвигается влево (в случае SHLD) или вправо (в случае SHRD) на число бит, указанное в счетчике (число или регистр CL, откуда используются только младшие 5 бит, которые могут принимать значения от 0 до 31). Старший (для SHLD) или младший (в случае SHRD) бит не обнуляется, а считывается из источника (регистр), значение которого не изменяется. Например, если приемник содержал 00101001b, источник 1010b, счетчик равен 3, SHRD даст в результате 01000101b, a SHLD — 01001101b (см. рис. 8).

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

Флаг OF устанавливается при сдвигах на 1 бит, если изменился знак приемника, и сбрасывается, если знак не изменился; при сдвигах на несколько бит флаг OF не определен. Во всех случаях SF, ZF и PF устанавливаются в соответствии с результатом и AF не определен, кроме случая со сдвигом на 0 бит, в котором значения флагов не изменяются. Если счетчик больше, чем разрядность приемника, — результат и все флаги не определены.

 Команда: ROR приемник, счетчик
 Назначение: Циклический сдвиг вправо
 Команда: ROL приемник, счетчик
 Назначение: Циклический сдвиг влево
 Команда: RCR приемник, счетчик
 Назначение: Циклический сдвиг вправо через флаг переноса
 Команда: RCL приемник, счетчик
 Назначение: Циклический сдвиг влево через флаг переноса
 Процессор:

Эти команды осуществляют циклический сдвиг приемника (регистр или переменная) на число бит, указанное в счетчике (число или регистр CL, из которого учитываются только младшие пять бит, принимающие значения от 0 до 31). При выполнении циклического сдвига на 1 команды ROR (ROL) сдвигают каждый бит приемника вправо (влево) на одну позицию, за исключением самого младшего (старшего), который записывается в позицию самого старшего (младшего) бита. Команды RCR и RCL выполняют аналогичное действие, но включают флаг CF в цикл, как если бы он был дополнительным битом в приемнике (рис. 9).

 


Рис. 9. Циклические сдвиги

После выполнения команд циклического сдвига флаг CF всегда равен последнему вышедшему за пределы приемника биту, флаг OF определен только для сдвигов на 1 — он устанавливается, если изменилось значение самого старшего бита, и сбрасывается, если старший бит не изменился. Флаги SF, ZF, AF и PF не изменяются.



©2015- 2017 stydopedia.ru Все материалы защищены законодательством РФ.