Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лр_1_ЭВМ и ПУ.doc
Скачиваний:
3
Добавлен:
01.07.2025
Размер:
238.08 Кб
Скачать

2.2.2 Сдвиги битов

Команды сдвига битов делятся на четыре группы:

  • Простые сдвиги(shl, shr)

  • Простые ротации(rol, ror)

  • Ротации через cf (rcl, rcr)

  • Арифметические сдвиги (sal, sar)

Наиболее общая команда сдвига shl, используется следующим образом:

shl ax, n ; Сдвиг ax влево на n бит

n должно равняться 1 для процессоров 8086. Для процессоров 80386 в качестве n допускается использование беззнаковой 8-битовой константы.

Сдвиг более чем на 1 бит на процессоре 8086 выполняется в два этапа: сначала в регистр cl загружается счетчик сдвигов, затем cl используется в качестве второго операнда команды сдвига:

mov cl, 5 ;Загрузить счетчик сдвигов в cl

shl ax, cl ;Сдвиг ax на cl бит

Для счетчика сдвигов допускается использовать только регистр cl. Допускается выполнение сдвигов значений находящихся в памяти и в 8-битовых половинах регистров.

mov cl, 2 ;Загрузить счетчик сдвигов в cl

shl bh, cl ;Сдвиг влево на cl бит

shl [seconds], 1 ;Сдвиг [seconds] влево на один бит

dhl [minutes], cl ;Сдвиг [menutes] влево на cl бит

При выполнении команды shl седьмой бит (старший значащий разряд) перемещается во флаги переноса, а правый освобождающийся бит заполняется нулем. При выполнении команды shr нулевой бит (младший значащий разряд) перемещается во флаги переноса, а левый освобождающийся бит заполняется нулем. Команды ротации rol и ror не обнуляют биты слева и справа, а перемещают значения младшего или старшего значащего разряда на противоположный конец. Остальные биты переносятся в указанном направлении. Перемещаемые биты заносятся во флаги переноса. Для команд rcl и rcr однобитовый флаг переноса служит как бы расширением регистра или памяти при выполнении ротации. При выполнении команды rcl старший значащий разряд сдвигается во флаг переноса, а предыдущее значение флага переноса становится на место младшего значащего разряда. При выполнении команд rcr младший значащий разряд сдвигается во флаг переноса, а старое значение флага переноса помещается на место старшего значащего разряда. Остальные биты сдвигаются в указанном направлении. Команда sar работает аналогично shr, за исключением того, что старший значащий разряд сохраняет свое первоначальное значение. Старший значащий разряд копируется в правый от себя бит.

В отличие от других парных команд сдвига у команды sar отсутствует соответствующий левый аналог. Для устранения этого недостатка команде shl дается второе мнемоническое название - sal. Функционально команда sar заменяется командами shl/ sal, которые могут умножать отрицательные значения, представленные в виде дополнительного кода на степени числа 2, и поэтому нет необходимости в отдельной команде. Все команды сдвигов могут работать и на 16-битовых значениях.

Причины использования в программах команд сдвига:

  • передвижения битов в заданные положения;

  • деление и умножение на степени 2.

Например, dh равен 3, dl - 5 и программе требуется разместить эти два числа в регистре dh, причем 3 должна размещаться, начиная со старшего значащего разряда, а 5 - в младшей значащей части байта. Это выполняется следующим образом:

mov dh, 3 ; dh 3

mov dl, 5 ; dl 5

mov cl, 4 ; Загрузить счетчик в cl

shl dh, cl ; Сдвиг dh влево на четыре бита

or dh, dl ; dh  dh OR dl

2.2.3 Деление и умножение с помощью сдвига

Умножение - с помощью сдвига влево, деление - с помощью сдвига вправо. Например:

0110 1011 (начальное значение)

+ 0110  1011 (сложение с тем же значением)

1101 0110 (сдвиг значения влево)

Сложение значения с самим собой вызывает сдвиг всех битов на одну позицию влево. Другими словами, умножение на 2 эквивалентно сдвигу на один бит влево. Следующее умножение полученного результата на 2, т.е. начального значения на 4, или 22, снова сдвигает биты на одну позицию влево. Общее правило: чтобы умножить любое значение на степень 2, необходимо выполнить сдвиг влево на количество битов, равное показателю степени. Чтобы найти величину х*24, т.е. х*16, в значении х нужно выполнить сдвиг на четыре бита влево. Сдвиг вправо соответствует делению этого числа на значения 2, 4, 8 и т.д. Для нахождения результата деления 1010 1111 (AF в шестнадцатеричной, или 175 в десятичной системе) на 4 необходимо только дважды сдвинуть биты вправо:

1010 1111 (начальное значение)

0101 0111 (деление на два)

0010 1011 (следующее деление на два)

В результате получится значение 00101011 (2В в шестнадцатеричной, или 43 в десятичной системе), что при отбрасывании остатка равно частному от деления 175 на 4. По аналогии с умножением деление на степень числа 2 соответствует сдвигу начального значения на количество битов, равное показателю степени.

Ограничения:

  • умножать и делить на степени 2 можно только беззнаковые значения;

  • произведение должно по размеру соответствовать начальному значению.

В большинстве случае сдвиги выполняются быстрее, чем команды mul, imul, div, idiv. Например; для умножения какого-либо числа на 8 (23) необходимо сдвинуть это значение три раза влево:

mov ax, 6 ; ax  6

mov cl, 3 ; Загрузить счетчик в cl

shl ax, cl ; ax  ax*8

Для деления на 16 (24) сдвиньте соответствующее значение вправо на 4 бита:

mov cl, 4 ; Загрузить счетчик в cl

shr ax, cl ; ax  ax/16

Единственной проблемой при умножении является возможность возникновения переполнения, которое не учитывается в этих примерах. Если значение флага после сдвига влево на один бит равняется 1, значит, результат не помещается в назначенный регистр или область памяти. При сдвиге более чем на 1 определять переполнения становиться сложно. При делении теряется остаток - деление 3 на 2 с помощью сдвига на один бит вправо дает в результате 1 и найти остаток не представляется возможным.

  1. Контрольные вопросы

  1. Какие флаги изменяет команда ADD?

  2. Когда используется команда ADC?

  3. Какими могут быть операнды в команде SUB?

  4. Как складываются значения размером больше 16 бит?

  5. Как используется команда AAA?

  6. Как используется команда AAS?

  7. Как используется команда DAA?

  8. Как используется команда DAS?

  9. Как используется команда AAM?

  10. Как используется команда AAD?

  11. Для чего используется команда TEST?

  12. Перечислите логические команды процессора.

  13. Куда помещается старший бит при сдвиге влево?

  14. Как изменяется флаг OF при выполнении команды SAL?

  1. Задание

Вычислить значение, в соответствии с указанным вариантом:

  1. Вычислить

  2. Вычислить

  3. Вычислить

  4. Вычислить

  5. Вычислить

  6. Вычислить

  7. Вычислить

  8. Вычислить

  9. Вычислить

  10. Вычислить

  11. Вычислить

  12. Вычислить

  13. Вычислить

  14. Вычислить

  15. Вычислить

  16. Вычислить

  17. Вычислить

  18. Вычислить

  19. Вычислить

  20. Вычислить

A, B, C, D, X—произвольные целые числа от 0 до 255.

5 Содержание отчета

  1. Титульный лист.

  2. Краткое теоретическое описание

  3. Задание на лабораторную работу, включающее формулировку задачи.

  4. Листинг программы.

  5. Результаты выполнения программы.