Ассемблер: взгляд издалека {}Инфарх Продолжение. Начало - в ||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) Должен заметить, что я, например, пока такую таблицу перед глазами не повесил, всё время в условиях путался. До новых встреч! ──══════════──