Команды сдвига
Команды выполняют сдвиг содержимого аккумулятора на один разряд в указанном кодом команды направлении. Арифметически сдвиг двоичного числа влево даёт его удвоение, а сдвиг двоичного числа вправо приводит к уменьшению числа в два раза. Вместе с битами аккумулятора в этих операциях участвует бит CY регистра признаков. Причём, возможны два варианта участия бита CY в операциях сдвига. Схемы выполнения команд сдвигов приведены на рис. 1.2.
Рис.1.2. Выполнение операций сдвига
Команды сдвига влево RAL и RLC обеспечивают одновременное перемещение всех битов числа на один разряд влево: всякий бит с номером m устанавливается равным биту с номером m+1. Различия этих команд связаны с поведением бита CY при сдвиге. В команде RLC выполняется обычный сдвиг влево, при котором содержимое старшего бита уходит в бит CY, а прежнее состояние бита CY теряется. Получается, что команда RLC выполняет сдвиг без учёта предшествующего сдвигу состояния бита CY. В команде RAL бит CY становится как бы девятым битом сдвигаемого байта и его прежнее состояние не теряется, а сдвигается в бит D0. Получается, что команда RAL выполняет сдвиг с учётом состояния бита CY, предшествующего сдвигу. На этой основе можно организовывать сдвиги многобайтных чисел.
Команды сдвига вправо RAR и RRC обеспечивают одновременное перемещение всех битов числа на один разряд вправо: всякий бит с номером m устанавливается равным биту с номером m–1. Различия этих команд связаны с поведением бита CY при сдвиге. В команде RRC выполняется обычный сдвиг вправо, при котором содержимое младшего бита уходит в бит CY, а прежнее состояние бита CY теряется. Получается, что команда RRC выполняет сдвиг без учёта предшествующего сдвигу состояния бита CY. В команде RAR бит CY становится как бы девятым битом сдвигаемого байта и его прежнее состояние не теряется, а сдвигается в бит D7. Получается, что команда RAR выполняет сдвиг с учётом состояния бита CY, предшествующего сдвигу.
Пример1.47
Требуется уменьшить в 2 раза двухбайтное число, хранящееся в регистровой паре HL.
Метка Мнемокод Комментарий
ANA A ; сброс бита CY
MOV A,H ; загружаем для сдвига старший байт
RAR ; выполняем сдвиг вправо или деление на 2
MOV H,A ; сохраняем старший байт результата
MOV A,L ; загружаем для сдвига младший байт
RAR ; сдвиг вправо с учётом переноса от
;предыдущего сдвига
MOV L,A ; сохраняем младший байт результата
В результате этих операций в регистровой паре HL окажется число вдвое меньше исходного.