ХАНДЫФАР

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


____________________SAR reg/mem8, 1 - Знаковое деление reg/mem8 на 2, один раз.

____________________SAR reg/mem8, CL - Знаковое деление reg/mem8 на 2, CL раз.

____________________SAR reg/mem16, 1 - Знаковое деление reg/mem16 на 2, один раз.

____________________SAR reg/mem16, CL - Знаковое деление reg/mem16 на 2, CL раз.


Сдвигает биты в первом операнде (операнд назначения) вправо на количество бит, указанное во втором операнде. Биты, сдвинутые за пределы границы целевого операнда, сначала сдвигаются во флаг CF, а затем отбрасываются. В конце операции сдвига флаг CF содержит последний бит, смещённый из целевого операнда.


Инструкции арифметического сдвига вправо (SAR) и логического сдвига вправо (SHR) сдвигают биты целевого операнда вправо (в сторону расположения менее значимых битов). При каждом подсчёте сдвигов младший бит целевого операнда сдвигается во флаг CF, а старший бит либо устанавливается, либо сбрасывается в зависимости от типа инструкции. Инструкция SHR удаляет самый старший бит, инструкция SAR устанавливает или очищает старший значащий бит, чтобы он соответствовал знаку (старшему значащему биту) исходного значения в целевом операнде. По сути, команда SAR заполняет смещённое значение пустой разрядной позиции знаком неизмененного значения.


Инструкции SAR и SHR могут использоваться для выполнения деления целевого операнда со знаком или без знака, соответственно, на степени 2-ки. Например, использование команды SAR для сдвига целого числа со знаком на 1 бит вправо приводит к делению значения на 2.


Использование инструкции SAR для выполнения операции деления не приводит к тому же результату, что и команда IDIV. Частное из команды IDIV округляется до нуля, тогда как “частное” из инструкции SAR округляется до отрицательной бесконечности. Это различие очевидно только для отрицательных чисел. Например, когда инструкция IDIV используется для деления -9 на 4, результат равен -2 с остатком -1. Если инструкция SAR используется для сдвига значения -9 вправо на два бита, то результат равен -3, а “остаток” равен +3; однако инструкция SAR сохраняет только самый старший бит из оставшегося значения (во флаге CF).


Флаг OF используется только при сдвиге на 1 бит. Для сдвигов влево флаг OF устанавливается равным 0, если старший бит результата совпадает с флагом CF (то есть два верхних бита исходного операнда были одинаковыми); в противном случае он устанавливается равным 1. Для инструкции SAR флаг OF снимается для всех 1-разрядных сдвигов. Для инструкции SHR флаг OF устанавливается равным старшему разряду исходного операнда.


  1. title Автор: Довгополов Евгений Сергеевич
  2. .model small
  3. .stack 100h
  4. code segment public _______; Начало сегмента кода
  5. ____assume cs:code
  6. ____main proc _____________; Начало процедуры main
  7. ________mov_____ax, -9_____; Копируем значение -9 в регистр ax
  8. ________mov_____cl, 2______; Копируем значение 2 в регистр cl
  9. ________cwd________________; Выполняем знаковое расширение регистра dx
  10. ________sar_____ax, cl_____; Выполняем арифметический сдвиг в ax на 2 вправо
  11. ________sub_____ax, dx_____; Вычитаем из регистра ax значение в регистре dx
  12. ________mov_____ax, 4C00h__; Копируем значение функции завершения процесса в ah а значение в al
  13. ________int_____21h _______; Вызываем прерывание DOS
  14. ____main endp _____________; Конец процедуры main
  15. code ends _________________; Конец сегмента кода
  16. end main __________________; Конец файла. Точкой входа указывается процедура main
Made on
Tilda