Ассемблер - взгляд издалека
Продолжение.
Начало в || 20, 21, 24, 25, 28, 29
{}Инфарх, 1999
Команды сдвига
Что такое сдвиг?
Смысл сдвига в том, что все биты в бай-
те, не меняя своего положения относительно
друг друга, смещаются вправо или влево. А
в завсимости от типа команды биты, "уходя-
щие за край" байта, могут появиться с про-
тивоположной стороны (циклические сдвиги)
или затеряться в первозданном хаосе (сдви-
ги простые или нециклические).
Пример.
Применим к числу
%01100010
циклический сдвиг вправо.
Результатом будет число
%00110001
А используя простой сдвиг влево, получим
%1100010?
Знак "?" означает, что бит принял состо-
яние, нам заранее неизвестное, и зависящее
от типа команды, состояния флагов и т.д.
Команды сдвига аккумулятора
Существуют четыре команды смещения битов
в аккумуляторе:
RLCA
RLA
RRCA
RRA
Вторая буква здесь красноречиво свиде-
тельствует о направлении сдвига. Команды
"RLCA" и "RLA" сдвигают содержимое "А"
влево, "RRCA" и "RRA" - вправо. А если в
мнемонике команды есть буква "C", то это
указывает на участие в операции флага пе-
реноса CY.
Для пущей наглядности проиллюстрируем
исполнение таких команд.
┌──┐ ┌─┬─┬─┬─┬─┬─┬─┬─┐
│CY│<─┬┤7│6│5│4│3│2│1│0│<─┐
└──┘ │└─┴─┴─┴─┴─┴─┴─┴─┘ │
└───────────────────┘
Как видно из привeдённой схемы, при вы-
полнении "RLCA" происходит циклический
сдвиг битов аккумулятора влево. Бит, зани-
мавший крайнее левое положение (D7), пере-
ходит на место крайне правого (D0) и ко-
пируется в флаг переноса "CY", а прочие
биты просто смещаются влево. Это можно с
успехом применять для проверки содержимого
крайнего бита:
LD A,%10011010
RLCA
JR C,MET
...
MET
Приведённый фрагмент программы вполне
пригоден к эксплуатации. Естественно, за-
грузка "A" будет не такой явной, иначе ка-
кой смысл в проверке? Но суть в том, что
если в старшем бите аккумулятора будет
"1", то процессор совершит переход на мет-
ку "MET", тем самым отказав в исполнении
фрагменту програмы, обозначенному в нашем
примере многоточием.
А теперь - команда "RLA":
┌──┐ ┌─┬─┬─┬─┬─┬─┬─┬─┐
┌─┤CY│<──┤7│6│5│4│3│2│1│0│<─┐
│ └──┘ └─┴─┴─┴─┴─┴─┴─┴─┘ │
└───────────────────────────┘
Перед вами циклический свиг аккумулятора
вправо. В отличие от "RLCA" здесь флаг пе-
реноса тоже принимает участие в работе,
предоставляя своё содержимое в качестве
ещё одного бита для сдвига.
Пример.
Если в "А" находится число
%01101010,
и флаг переноса установлен, то после ис-
полнения "RLA" в "А" будет находится число
%11010101,
и флаг "CY" окажется сброшенным.
А вот сдвиги в противоположную сторону:
┌─┬─┬─┬─┬─┬─┬─┬─┐ ┌──┐
┌─>│7│6│5│4│3│2│1│0├─┬>│CY│
│ └─┴─┴─┴─┴─┴─┴─┴─┘ │ └──┘
└────────────────────┘
┌─┬─┬─┬─┬─┬─┬─┬─┐ ┌──┐
┌─>│7│6│5│4│3│2│1│0├──>│CY├─┐
│ └─┴─┴─┴─┴─┴─┴─┴─┘ └──┘ │
└───────────────────────────┘
Как видите, команды "RRCA" и "RRA" пол-
ностью идентичны рассмотренным ранее, за
исключением направления сдвига.
Команды сдвига регистров
общего назначения
Выше мы рассмотрели действия с аккумуля-
тором. Но и все прочие регистры также "не
остались обездоленными" в этом плане. Даже
наоборот, команд для них ещё больше.
Есть, например, группа команд:
RLC s
RL s
RRC s
RR s
В них "s" обозначает
"(HL)", "(IX+d)", "(IY+d)"
или один из регистров:
"A", "B", "C", "D", "E", "H", "L"
Во всём остальном эти комады аналогичны
тем, что относятся к "A": "RLC s", "RL s"
выполняют сдвиг "s" влево, "RRC s", "RR s"
- вправо. Флаг переноса участвует в опера-
ции аналогичным образом.
Рассмотрим теперь "SLA s" и "SRL s":
┌──┐ ┌─┬─┬─┬─┬─┬─┬─┬─┐
│CY│<──┤7│6│5│4│3│2│1│0│<──0
└──┘ └─┴─┴─┴─┴─┴─┴─┴─┘
┌─┬─┬─┬─┬─┬─┬─┬─┐ ┌──┐
0──>│7│6│5│4│3│2│1│0├──>│CY│
└─┴─┴─┴─┴─┴─┴─┴─┘ └──┘
Эти команды весьма широко распростране-
ны, т.к. помимо сдвига влево или вправо
они заполняют освобождающееся место нуле-
вым значеием, следовательно, могут
рассматриваться как умножение и деление на
два соответственно.
И, наконец, команда "SRA s":
┌────┐
│ ┌┴┬─┬─┬─┬─┬─┬─┬─┐ ┌──┐
└──>│7│6│5│4│3│2│1│0├──>│CY│
└─┴─┴─┴─┴─┴─┴─┴─┘ └──┘
Её можно рассматривать как операцию "де-
ление на два со знаком". В сдвиге принима-
ют участие только 7 младших бит, а старший
остаётся без изменения.
Но не подумайте, что это всё! Существует
ещё...
Сдвиг полубайтов
Он выполняется по "RLD" и "RRD". Эти ко-
манды используются не так уж и часто. Быть
может, вам вообще не придётся обращаться к
ним. Но, тем не менее, рассмотреть их всё
же надо. Итак, схема:
┌───────────────┐
┌─────╥──┴──┐ ┌─────╥──v──┐
│7...4║3...0│ │7...4║3...0│
└─────╨──^──┘ └─┬─^─╨──┬──┘
A └────────┘ └────┘ (HL)
┌───────────────┐
┌─────╥──v──┐ ┌─────╥──┴──┐
│7...4║3...0│ │7...4║3...0│
└─────╨──┬──┘ └─^─┬─╨──^──┘
A └────────┘ └────┘ (HL)
Как видите, в работе принимают участие
одновременно как "A", так и "(HL)". Обмен
между ними происходит группами по 4 бита,
причём старшие 4 бита аккумулятора остают-
ся без измнений.
Пример.
Если в аккумуляторе содержится байт
%11010010,
а по адресу "HL" хранится байт
%01111001,
то после исполнения команды "RLD" в акку-
муляторе окажется число
%11010111,
а "HL" будет адресовать байт
%10010010
Команда "RRD" выполняется аналогично, за
исключением, конечно, направления сдвига,
как и видно на схеме.
Ну и, конечно, рассмотрим такую важную
часть любой команды ассемблера, как...
Влияние команд сдвига на флаги
╔═══════════╤═══════════════╗
║ Мнемоника │ Флаги ║
║ операции ├───────────────╢
║ │ C Z P/V S N H ║
╟───────────┼───────────────╢
║ RL s │ x x P x 0 0 ║
║ RR s │ x x P x 0 0 ║
║ RLC s │ x x P x 0 0 ║
║ RRC s │ x x P x 0 0 ║
║ RLA │ x . . . 0 0 ║
║ RRA │ x . . . 0 0 ║
║ RLCA │ x . . . 0 0 ║
║ RRCA │ x . . . 0 0 ║
║ RLD │ . x P x 0 0 ║
║ RRD │ . x P x 0 0 ║
╚═══════════╧═══════════════╝
Вот и всё влияние!
Все обозначения в таблице должны быть
вам знакомы из прошлых занятий. Единствен-
ный новый знак - "s", но о нём было сказа-
но выше.
Продолжение следует...