Ликбез - Ассемблер взгляд издалека: Работа с битами, Сравнение чисел, Команда сравнения.
Ассемблер: взгляд издалека
{}Инфарх
Продолжение. Начало - в ||20, 21, 24
Работа с битами
Логические операции, рассмотренные нами
в прошлый раз, производились над всем бай-
том. Теперь обратим внимание на команды,
работающие с отдельными битами. Ну, что с
ними можно делать? Очевидно, присваивать
им конкретное значение, проверять состоя-
ние и... всё! Начнём с установок.
Команда, которая установит конкретный
бит, записывается, как "SET" (от англ.
"установить"). А параметрами её служат
указания на обрабатываемый байт и бит,
подлежащий установке. Как водится, при-
ведём варианты написания этой команды:
SET b,r
SET b,(HL)
SET b,(ii+n)
Как Вы думаете, что такое "b"? Да, со-
вершенно верно! Это номер того бита, кото-
рый мы мучаем командой. А нумеруются эти
биты от младшего разряда к старшему. Вот,
посмотрите:
╔════╤════╤════╤════╤════╤════╤════╤════╗
║ D7 │ D6 │ D5 │ D4 │ D3 │ D2 │ D1 │ D0 ║
╚════╧════╧════╧════╧════╧════╧════╧════╝
Таким образом, если процессор встретит
невзначай команду
SET 4,E
то в разряде "D4" регистра "E" окажется
единица.
Теперь на очереди у нас команда "RES".
Нетрудно догадаться, что её действие
прямо противоположно команде "SET", и зак-
лючается оно в сбросе заданного бита. Вот
варианты её написания:
RES b,r
RES b,(HL)
RES b,(ii+n)
Итак, мы умеем уже устанавливать и сбра-
сывать биты. Но есть ещё одно, очень важ-
ное, действие. Оно заключается в проверке
бита, и у Z80 такая команда, конечно,
есть.
Её мнемоника - "BIT". А результат её вы-
полнения мы получим в виде флага "Z", ко-
торый установится, если проверяемый бит
равен нулю или, выражаясь точнее, сброшен.
А вот и возожные варианты:
BIT b,r
BIT b,(HL)
BIT b,(ii+n)
Как видите, варианты написаний всех
рассмотренных выше команд абсолютно одина-
ковы. Нам остаётся только вспомнить, что
при выполнении команды возможно её влияние
на флаги и посмотреть, в чём оно выражает-
ся...
╔═════════════╤═══════════════════╗
║ МНЕМОНИКА │Разряды регистра F ║
║ │ (флаги) ║
╟────┬────────┼───────────────────╢
║Опе-│ │ ║
║ ра-│Операнд │ C Z P/V S N H ║
║ ция│ │ ║
╟────┴────────┼───────────────────╢
║ BIT b,r │ . x ? ? 0 1 ║
║ BIT b,(HL) │ ║
║ BIT b,(ii+n)│ ║
║ │ ║
║ RES b,r │ . . . . . . ║
║ RES b,(HL) │ ║
║ RES b,(ii+n)│ ║
║ │ ║
║ SET b,r │ . . . . . . ║
║ SET b,(HL) │ ║
║ SET b,(ii+n)│ ║
╚═════════════╧═══════════════════╝
Пояснения:
"." - флаг не меняется в результате опе-
рации;
"x" - флаг устанавливается в зависимости
от результата операции;
"?" - значение флага не определено;
прочие обозначения - см. |21.
Из таблицы видно, что только команда
"BIT" оказывает воздействие на флаги, а
прочие команды оставляют их без изменений.
Ну, а коль скоро речь зашла о проверке
бита, уместно вспомнить и методы контроля
всего байта. Итак...
Сравнение чисел
В создаваемой программе вам наверняка
понадобится производить сравнение неких
чисел для последующего управления процес-
сами в этой самой программе.
Но как сравнить числа и получить ре-
зультат в форме, понятной процессору? И
что означает выражение "числа совпадают"?
А значит это, что они равны. Если сей
факт выразить арифметически, то это будет
A - B = 0
А если сравниваемое с A число больше
(ведь сравнение предполагает отношение
между двумя числами)? Тогда результат вы-
читания будет отрицательным. А если
меньше, то положительным.
А теперь на основе команды вычитания SUB
попробуем разработать систему сравнения на
Ассемблере.
Допустим, необходимо сравнить число не-
которого диапазона с числом 16:
LD A,16 ;имеющееся число
SUB n ;сравниваемое число
Тогда получится следующее:
- если n = 16, то флаг нуля (Z) установ-
лен, а флаг переноса (CY) - сброшен;
- если n < 16, то флаги нуля и переноса
сброшены;
- если n > 16, то флаг нуля сброшен, а
флаг переноса установлен.
Как видите, метод вполне работоспособен.
Однако, есть у него и недостаток: измене-
ние содержимого регистра "A".
И вот здесь к нам на подмогу приходит...
Команда сравнения
Она имеет мнемонику "CP" (сокращение от
английского "compare" - сравнить). Команда
полностью аналогична вычитанию, за исклю-
чением того, что содержимое "A" не изменя-
ется. Результат сказывается только на фла-
гах.
Траиционно приведём возможные варианты:
╔═════════════╤═══════════════════╗
║ МНЕМОНИКА │Разряды регистра F ║
║ │ (флаги) ║
╟────┬────────┼───────────────────╢
║Опе-│ │ ║
║ ра-│Операнд │ C Z P/V S N H ║
║ ция│ │ ║
╟────┴────────┼───────────────────╢
║ CP r │ x x V x 1 x ║
║ CP (HL) │ ║
║ CP n │ ║
║ CP (ii+n) │ ║
╚═════════════╧═══════════════════╝
Пояснение:
Флаг P/V (parity/overflow) индицирует
сразу два разных условия, относящихся к
двум принципиально разным группам команд.
При выполнении операции сравнения наличие
флага Overflow показывает, что в результа-
те арифметического действия изменился знак
операнда.
А в завершение взгляните на небольшую
таблицу: она поможет вам выбрать, какие
операнды в каких регистрах следует размес-
тить для наиболее оптимального использова-
ния команды сравнения.
┌──────────┬───────────┬──────────┐
│Результат │ Состояние │ Мнемоника│
│сравнения │ флагов │ условия │
├──────────┼───────────┼──────────┤
│ A=X │ Z=1 │ Z │
├──────────┼───────────┼──────────┤
│ A<>X │ Z=0 │ NZ │
├──────────┴───────────┴──────────┤
│ Беззнаковое сравнение (0...255) │
├──────────┬───────────┬──────────┤
│ A<X │ CY=1 │ C │
├──────────┼───────────┼──────────┤
│ A>=X │ CY=0 │ NC │
├──────────┴───────────┴──────────┤
│ С учетом знака (-128...+127) │
├──────────┬───────────┬──────────┤
│ A<X │ S=1 │ P │
├──────────┼───────────┼──────────┤
│ A>=X │ S=0 │ M │
└──────────┴───────────┴──────────┘
Пояснения:
1) Таблица показывает, какие флаги уста-
новятся при равенстве или отличии операн-
дов в любую сторону.
2) В графе "Мнемоника условия" описыва-
ются проверяемые флаги при вводе команд
условного типа.
3) Обозначения в таблице:
CY=C=Carry
NZ=(Z=0)
NC=(C=0)
Должен заметить, что я, например, пока
такую таблицу перед глазами не повесил,
всё время в условиях путался.
До новых встреч!
──══════════──
Другие статьи номера:
|
|
|
|
Ликбез - Ассемблер взгляд издалека: Работа с битами, Сравнение чисел, Команда сравнения.
|
|
|
|
|
|
|
|
|