ZX Ассемблер 1969 г.

Раздел 3 - флаги и их применение. Увеличенине и уменьшение чисел. Арифметические операции нал 8-ра зрялными числами.


Флаги и их применение.

В машинном языке "флаг" означает "отметка". Флаг - это то, что вы поднимаете, если хо-
тите пометить для кого-то другого, что выполнено определенное условие.

Причина, по которой конструкторы Z80 (как и большинство конструкторов ЦП) используют
ф'1аги в своих машинных языках - в том, чтобы дать программисту информацию о числе, нахо-
дящемся в регистре "а", или ин формацию о только что выполненном последнем вычислении.

Напомним, что один из регистров ЦП отведен под флаги - это регистр Т". Вы могли также
обратить внимание на то, что в начале последней главы в таблице сведены различные коман-
ды, которые должны были в этой главе рассматриваться, и часть таблицы была отведена на
описание воздействия каждой команды на флаги. (К счастью, ни одна из команд зтой послед-
ней главы не влияла ни на один флаг. )

S Z н p/V N с

i.sJgn

flag

2.ZERO
FLAG

3.HALF-CARRY
FLAG

4.PARITY FLAG
5.OVERFLOW FLAG

6.SUBTRACT
FLAG

7. CARRY
FLAG

Нлаг знака; 2-флаг нуля; 3-флаг половинного переноса
4-флаг четности; 5-флаг переполнения; 6-флаг вычитания;
7-флаг переноса

На самом деле разработчики придумали семь флагов, но решили, что одним регистром (так
в оригинале. Очевидно, имеется в виду бит.8 (Примеч. Пе-р. )) Можно реализовать два флага:
и четности и переполнения.

Давайте теперь подробнее рассмотрим каждый из этих флагов.

Флаг нуля

Зтот флаг мы уже рассматривали выше. Его прикладное значение очевидно, он обычно уста-
навливается после арифметических операций, поскольку служит для описания содержимого ре-
гистра "а".

Обратите, однако, особое внимание на то, что в регистре "а" может содержаться 0, а
флаг нуля установлен не будет. Так легко может случиться при выполнении команды
LD а, 0

флаг нуля также устанавливается, если нулевым оказывается результат команд из группы
"перемещений в круговом порядке и сдвигов".

Кроме того, флаг нуля оказывается единственным зримым результатом некоторых команд
проверки, таких как группа команд "проверка бита". В этих случаях флаг нуля устанавлива-
ется, если проверяемый бит равен нулю.

Флаг знака

Флаг знака очень напоминает флаг нуля и действует по преимуществу на том же самом на-
боре команд (расхождение в основном касается группы "проверки бита", где понятие отрица-
тельного бита при любой интерпретации лишено смысла).

Флаг переноса

Зто - один из наиболее важных флагов, имеющихся в языке ассемблера, поскольку без него
результаты арифметических действии в ассемблере были бы совершенно бессмысленными.

Что нужно помнить, это что команды языка ассемблера всегда относятся либо к 8-би-
товым числам или к 16-битг " числам.

Зто означает, что числа, с которыми мы имеем дело, могут быть либо
8-BIT ** 0-255

16-BIT **) 0-65535 либо, если вы включаете перенос,
8-BIT ** 0-256

16-BIT **) 0-65536 рассмотрим ситуацию, в которой мы выполняем следующее вычита-
ние

2 0 0
2 0 1

результат = 2 5 5 !!!

Это - прямое следствие того, что у нас имеется только ограниченный диапазон чисел, и
то
же самое может произойти, очевидно, и с 16-битовыми числами.

Мы видели, что флаг переноса может быть установлен в результате вычитания при наличии
"ухода за ноль". Флаг переноса может быть также установлен в результате операции сложения
если должно быть "переполнение".

Поэтому удобно представлять себе бит переноса как 9-й бит регистра "а":
NUMBER CARRY BIT NUIBER IN BIT FORM
132 - 1 0 0 0 0 1 0 0

+ 135 - 1 0 0 0 0 1 1 1

267 1 0 0 0 0 1 0 1 1

NUMBER - число; CARRY BIT - бит переноса; NUMBER IN BIT FROM число в виде битов

Однако поскольку у нас нет 9 битов, а регистре "а" будет содержаться число Йен (деся-
тичное - И) и перенос будет установлен (т.е. равен 1).

Можно заметить, что при вычитании занимание из 9-го бита также приведет к появлению в
нем "1".

Использование флагов в конструкции на машинном языке, эквивалентной предложению
"IF...THEN.... " в языке "бейсик" у нас есть возможность конструировать ситуацию типа
"IF... THEN", такие как

IF а=0 THEN.....

1. WHERE WHAT FOOLLOWS CAN ве "LET.... "
2 OR "GOTO.... "
2 OR "GOSUB... "

1 - Где-то, что следует, может быть: 2 - или принятия решения точно такого же типа можно
запрограммировать на машинном языке (за исключением предложения "LET... ") Вместо того
чтобы написать "IF а=0", мы просто проверяем флаг нуля: если он установлен, то мы знаем,
что а=0.

Три рассмотренных нами к настоящему моменту флага - это в основном все, что нам нужно,
чтобы выбрать следующую команду для выполнения.

Подобная команда имеет следующий формат: например: JP сс, END, где "JP" - мнемони-
ческое обозначение команды перехода (JUMP), а "ЕЖ - удобная метка.

Зта команда по-русски читается как "перейти при условии сс на END"

условие "сс" может быть любым из следующих:
Z (г ноль)
NZ (= не ноль)
р (= положительное)
м (= минус)

с = перенос установлен)
NC (= нет переноса

флаг четности/переполнения

лот флаг для некоторых команд действует как флаг четности, а для других - как флаг
переполнения, однако путаница возникав редко, поскольку зти два типа команд обычно не
встречаются вместе.

Роль флага как указателя четности выступает в логических операциях, и он устанавлива-
ется в том случае, если в результате установленным оказывается четное количество битов.
Более подробно этот вопрос мы рассматриваем в главе логических операциях.

Переполнение говорит вам о том, что только что выполненная вами арифметическая опера-
ция может дать результат, не умещающийся в 8 битов. Вместо того, чтобы на самом деле оз-
начать, что для записи результата понадобился 9-й бит, этот флаг говорит о том, что в ре-
зультате операции 8-й бит изменился!

В приведенном выше примере до сложения 132 и 135 8-й бит был равен "1", а после - "0",
так что должен был быть установлен флаг переполнения. Но флаг переполнения будет также

установлен и в результате такого сложения.
64 0 1 0 0 0 0 0 0

+ 65 0 1 0 0 0 0 0 1

129 1 0 0 0 0 0 0 1

Флаг вычитания

Зтот флаг устанавливается, если последней операцией было вычитание!

Флаг половинного переноса

Зтот флаг устанавливается способом, аналогичным флагу переноса, но только в том слу-
чае, когда имеется переполнение или занимание из 5-го бита, а не из 9-го!

Как флаг вычитания, гак и флаг половинного переноса применяются только для арифмети-
ческих операций над "двоично кодированными десятичными числами", мы рассматриваем зти
флаги в главе "арифметические действия над двоично-кодированными десятичными числами"

Увеличенине и уменьшение чисел

Увеличение

INC R "INC" по-английски читается как "INCREASE" (увеличить) и говорит само за себя.

Увеличение числа на парах регистров записываются так:
INC RR
INC IX

INC IY где "RR" обозначает пару регистров, такую как "вс", "DE", "HL"

Обратите еще раз внимание на простой способ обозначения того, какие операции использу-
ют 8-битовые числа, а какие 16- битовые

8-битовые числа обозначаются одной буквой, а

16-битовые - двумя.

Однако команда "увеличения" на самом деле имеет еще большие возможности, чем видно из
приведенных примеров. Можно увеличить содержимое любой ячейки памяти, если мы сможем за-
дать ее адрес с помощью индексных регистров или привилегированной пары регистров, HL:

INC IY + д)

INC (HL) где "д " - смещение (DISPLACEMENT) а не регистр D!

Уменьшение числа симметричность набора команд Z80 почти наверняка должна обеспечивать,
чтобы все, что вы можете уменьшить, вы могли также и увеличить, и именно так обстоит дело
DEC R
DEC RR
DEC IX
DEC IY
DEC HL) %
DEC IX+ д

DEC (IY+ д) . . . . ,

демоническое сокращение DEC по-английски читается как DECREASE (уменьшить, и
здесь нужно тоже быть внимательным при использовании скобок.

Влияние на флаги

Поскольку команды уменьшения и увеличения 8-битовых чисел воздействуют на все флаги,
за исключением флага переноса, именно здесь удобно дать обзор работы с флагами.

Важное замечание: команды увеличения и уменьшения для 16-' битовых чисел не влияют на
какие бы то ни было флаги. Изменяют флаги только операции увеличения и уменьшения для
8-битовых чисел.

Флаг знака: этот флаг будет установлен в (=1), если бит 7 8тбитового результата равен

Флаг нуля: этот флаг будет установлен (=1), если 8-битовый результат равен нулю.

Флаг переполнения: этот флаг будет установлен (=1), если содержимое опта 7 8-битового
числа изменяется в результате операции.

Флаг половинного переноса: этот флаг будет установлен (=1), если имеется перенос или
занимание из четвертого бита 8-битового числа.

Флаг отрицания: этот флаг устанавливается, если последней выполненной командой было
вычитание. Так, он сбрасывается (=0) для "INC" и устанавливается (=1) для "DEC".

Арифметические операции нал 8-ра зрялными числами.

По поводу арифметических операций для одного регистра нужно только заметить, что все
операции в данной главе относятся только к 8-битовым числам и все они должны выполняться
с помощью привилегированного регистра а.

Зтот факт настолько органично вплетается в мнемонику машинного языка Z80, что в неко-
торых мнемонических обозначениях сокращение "а" просто опускается. Например, если нужно
вьместь "в" из "а", естественно было бы ожидать команды, подобной

SU9 а, в на самом же деле мнемоническое обозначение имеет вид:
SU6 в

Команды арифметических операций для 8-разрядных чисел

MNEMONIC

BYTES

j TIME

EFFECT ON FLAGS

j TAKEN

с

Z

PV

s

N

H

ADD a,REGISTER

! 4

tt

II

It

II

0

»

ADD a,NUMBER

2

7

#

II

II

#

0

tt

ADD a (HL)

7

#

H

1

tt

0

tt

ADD a, IX+ д)

3

19

»

II

tt

II

0

tt

ADD aj(IV+ д)

3

19

II

it

It

tt

0

It

j ADC a,REGISTR 1

4

ц

II

ц

II

0

»

| ADC a,NUMBER

2

7

II

II

II

1

0

ADC a (HL)

1

II

It

II

II

0

»

ADC a, IX+ д)

3

19 1

#

и

Ц

f

0

It

ADC a,(IY+ д)

3

19

Л

e

II

II

0

tt

SUB a,REGISTR

4

I #

II

1

#

1

»

SUB a,NUMBER

2

1

*

II

II

II

1

»

SUB a,fHL)

1

1

j ft

II

II

it

1

tt

SUB a,( IX+ д)

3

19

i

II

It

II

1

»

SUB a * СIY+ д;

3

19

*

#

It

#

1

tt

SBC a,REGISTER

1

4

»

1

it

II

1

tt

SBC a,NUMBER

7

II

II

i

tt

1

tt

I SBC a,(HL)

1 7

II

ц

II

tt

1

tt

SBC a, IX+ д)

19

II

II

II

1

1

SBC a,(IY+ д)

3

1

19

II

*

II

It

1

It

I cp REGISTER

1

4

*

II

II

tt

1

»

cp NUMBER

2

tt

1

tt

*

1

tt

cp (HL)

1

II

II

If

tt

1

»

cp IX+ д

19

1 It

tt

К

It

1

tt

cp (Iv+ д

3 1

:9

1 8

II

It

It

1

11

MNEMONIC-мнемоническое обозначение; BYTES-байты; TIME TAKEN- время выполнения; EFFECT
ON FLAGS - воздействие на флаги; PEGISTER-регисто; NUMBER - число.

Обозначения флагов:
t показывает, что флаг изменен операцией;

0 показывает, что флаг сбрасывается;

1 показывает, что Флаг устанавливается;

- показывает, что флаг остается неизменным.

Вопреки зтим ограничениям, накладьваемым на арифметические команды (они должны ограни-
чиваться регистром а), язык Z80 очень разносто?онен в плане того, что щ можем сложить с
произвольным числом, отложенным в регистре а.
ADD a, R сложить с а произвольный одинарный регистр;
ADD а, N сложить с а произвольное 8-битовое число;
ADD a, (HL) прибавить 8-битовое число,

адрес которого задается (HL);
ADD a, (IX+ д) прибавить 8-битовое число,

адрес которого задается (IX+ д);
ADD a, (IY+ д) прибавить 8-битовое число,

адрес которого задается № д).
Конструкторы Z83 предоставили нам еще одну команду, аналогичную ADD, но принимающую во
внимание возможность переполнения в флаге переноса.

Зто - очень полезная команда: "ДОС", читающаяся как "сложение с переносом" (ADD WITH
CARRY).

Она совершенно совпадает с командой "ADD", имеет тот же диапазон чисел, регистров, и
т.п... Которые можно складывать с регистром "а", за исключением того, что перенос также
складывается (если он установлен).

Зто дает возможность складывать числа, превышающие 255, с помощью цепочки операций:
например, сложить 1000 (т. Е. СЗЕ8н) с 20QQ (т. Е. 07D0H) и запомнить результат в вс:
LD а, е8н: младшие разряды первого числа
ADD a, D0H: младшие разряды второго числа
LD с, а: записать результат в с
LD а, 03н: старшие разряды первого числа
ADC а, 07н: старшие разряды второго числа
LD в, а: записать результат в в

После первого сложения (е8 +D0) у нас флаг переноса будет установлен (поскольку ре-
зультат был больше FF), а в регистре а будет в8 (проверьте это самостоятельно).

Второе сложение (3+7) даст не 0ан (= li десятичное), как может показаться на первый
взгляд, а 0вн (= 11 десятичное) из-за переноса.

Поэтому конечный результат будет равен Рвв8н=3000! Такую цепочку можно продолжить и
обработать число произвольного размера, а результат будет храниться в памяти, а не в паре
регистров.

8-Битовое вычитание

Оно совершенно такс: же, как и 8-битовое сложение. Имеется два набора команд, один для
обычного вычитания, другой - для вычитания с переносом:
SUB S - вычесть S

SBC S - вычесть S с переносом. Обозначение "S" предназначено для того же диапазона
возможных операндов, что и для команд сложения.

Сравнение двух 8-битовых чисел

Давайте отвлечемся на минутку от машинного языка и посмотрим, что же мы на самом деле
понимаем под сравнением двух чисел:

мы знаем, что происходит, когда два соавнивземых числа совпадают - они "равны". Один
из способов обозначения этого факта в арифметической форме - сказать, что разность между
двумя числами равна нулю.

Что если сравниваемое число поевьиает первое число? Тогда результат после вычитания

нового числа будет отрицательным.

Диалогично, если новое число было меньше, то разность будет положительной.

Мы можем с помощью зтих понятий разработать систему сравнения на машинном языке. Все,
что нам нужно, - это флаги и операция вычитания. Предположим, нам нужно сравнить числа из
некоторого диапазона с числом, скажем 5:
LD а, 5: имеющееся число
SUB N: сравниваемое число
тогда у нас получится следующие результаты.
Если N = 5 флаг нуля установлен, флаг переноса сброшен.
Если N < 5 флаг нуля сброшен, флаг переноса сброшен.
Если N > 5 флаг нуля сброшен, флаг переноса установлен.

Поэтому ясно, что проверку на равенство дает флаг нуля, а проверку на "превьиение" -
флаг переноса. (Проверкой на меньше" будет сброс обоих флагов).

Единственное неудобство этого метода состоит в том, что содержимое регистра "а" изме-
няется в результате этой операции.

К счастью у нас есть операция "CPS". По-английски она читается как "СОИМЕ" (срав-
нить). Обратите внимание, что она позволяет сравнивать только то, что у нас уже имеется в
регистре 'а": диапазон возможных чисел для сравнения такой же, как и для сложения.

"Сравнение" совершенно совпадает с "вычитанием" за исключением того, что содержимое
регистра "а" не изменяется. Результат сказывается таким образом только на флагах.




СОДЕРЖАНИЕ:


  Оставте Ваш отзыв:

  НИК/ИМЯ
  ПОЧТА (шифруется)
  КОД



Темы: Игры, Программное обеспечение, Пресса, Аппаратное обеспечение, Сеть, Демосцена, Люди, Программирование

Похожие статьи:
Анекдоты - Юмор.
Юмор - Вредные советы. (Посвещаетс Г.Остеру).
Новости - Новости на рынке ZX-SPECTRUM в Луганске.
Post... - письма читателей...
Железо - Регистр атрибутов (порт #FF) , новый INT для Пентагона.

В этот день...   21 ноября