Программирование на Ассемблере
Итак, с помощью команд сдвига можно умножать числа на степени двойки.
При этом сдвиги выполняются значительно быстрее, чем команды деления и
умножения (DIVx и MULx).
Теперь поясним, зачем нужно столько модификаций команд сдвига (ASR, LSR
итд.). Прежде всего рассмотрим отличие сдвига от прокрутки.
При логическом сдвиге операнда к нему справа или слева добавляется нулевой
бит, в то время как при прокрутке добавится бит, \"вытолкнутый\" за разрядную
сетку. Таким образом, прокрутка (ее часто называют циклическим сдвигом)
обеспечивает сохранение всех битов слова (байта): то, что \"выталкивается\"
с одной стороны, добавляется с другой. Такая прокрутка реализуется
командами ROR и ROL. Команды ROXR и ROXL работают несколько по другому:
то, что \"выталкивается\" за разрядную сетку, попадает в X-флаг (см. описание
регистра SR), а старое его содержимое добавляется с другой стороны операнда
(происходит прокрутка через X-флаг, который играет роль дополнительного
бита сдвигаемого слова (байта)). Более наглядно схему работы сдвигов и прокруток можно представить так: LSR: 0 ---> ОПЕРАНД ---> C,X ROR: .----> ОПЕРАНД ---> C,X
| |
`--------<---------\' ROXR: .----> ОПЕРАHД ---> C,X >-.
| |
`------------<------------\' Сдвиги в свою очередь делятся на арифметические и логические. В случае
логического сдвига, к слову (байту) всегда добавляется нулевой бит, а
выдвинутый с другой стороны бит записывается в C и X-флаги. Арифметические
сдвиги позволяют выполнять умножение/деление операнда на 2^n с учетом
знака. Так, команда ASR не трогает старший бит сдвигаемого операнда,
сохраняя таким образом знак результата, а команда ASL полностью аналогична
команде LSL: ASR: .----> ОПЕРАНД ---> C,X
| |
`------\' ASL,LSL: C,X <--- ОПЕРАНД <--- 0
|