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

Раздел 4 - логические операторы. Работа с 16-битовыми числами.


Логические операторы

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

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

OR
X0R

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

Давайте рассмотрим одну из этих операций "AND":
BIT a BIT в RESULT OF BIT a AND" BIT в
0 0 0
1 0 0
0 1 0
1 1 1
BIT - бит, RESULT - результат

Очевидно, что результат операции "AND" состоит в том, что "1" получается только в том
случае, если "а" и "в" оба содержали "1".

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

Операция "AND" очень полезна тем, что позволяет нам маскировать байт, так что он изме-
няется так, чтобы содержать только определенные биты.

Если, например, мы хотим ограничить конкретную переменную диапазоном 0-7. нам хо-
чется вполне ясно указать, что информация должна содержаться только в битах 0-2. (Если
бы информация содержалась в бите 3, то число было бы равно по крайней мере 8)
например, 0 0 0 0 1 0 1 =5

эти биты должны быть "0"

Поэтому если мы берем некоторое число, значение которого нам неизвестно, и совершаем
над ним операцию "AND" с"7", то в результате получится число в диапазоне 0-7.

Например, 0 110 10 0 1 =105

0 0 0 0 0 1 1 1 = 7=) маска

результат операции "AND" 0000 0001 = 1=) в^диапазоне

Команды логических операций

1

TIME

1 EFFECT ON FLAGS

.......

ММГМЛМТГ

BYTES

TAKEN

с

Z

PV

S

N

H

AND REGISTER

1

4

0

it

it

tt

0

AND NUMBER

2

7

0

i

i

i

0

AND (HL)

1

7

0

#

it

it

0

AND IX+ д)

3

19

0

#

»

#

0

1 AND (IY+ д)

3

19

0

it

i

i

0

OR REGISTER

1

4

0

i

it

i

0

0

OR NUMBER

2

7

0

tt

it

it

0

0

OR (HL)

1

7

0

it

i

it

0

0

OR IX+ д)

3

19

0

it

it

it

0

0

OR (IY+ д)

3

19

0

it

it

0

0

XOR REGISTER

1

4

0

i

i

it

0

0

XOR NUMBER

2

7

0

it

it

it

0

0

XOR (HL)

1

7

0

it

i

it

0 0

XOR IX+ д)

3

19

0

i

it

it

0 0

XOR IY+ д)

3

19

0

it

it

it

0 0 j

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

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

1 - означает, что флаг устанавливается;
- - означает, что флаг не изменился.

Обратите внимание, что чип Z80 позволяет выполнять операцию AND только с регистром
"а". Для регистра "а можно выполнить операцию "AND" с 8-битовым числом, любым из осталь-
ных 8-битовых регистров, (HL), (IXO или (IY+);

например, AND 7 обратите вним?ние, что поскольку

AND е действие определено только для регис-
AND (HL) тра "а", нет необходимости упоминать
его в команде.

Для других булевских операций, 'ДОип и 'XOR , имеет место тот же диапазон возможностей
и ограничение использования оегистром "а".

Операция "OR" по смыслу аналогична операции AND :
BIT a BIT в BIT a OR BIT в
0 0 0
0 1 1
10 1

11 1 .........

вОчевидно, результат операции OR должен давать нам 1 , если а или в содержало

Операция "OR" также весьма полезна тем, что она позволяет нам устанавливать любой бит
числа, если, например, нам желательно гарантировать, что число будет нечетным, то совер-
шенно очевидно, что нам нужно установит бит 0. (Того же результата можно добиться с по-
мощью команды "SET").
LD a. NUMBER

OR 1: маке NUMBER ODD NUMBER - число; маке NIMBER ODD -
сделать число нечетным.

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

Иньыи словами, результат такой же, как для операции "OR' во всех случаях, за исключе-
нием того, Korga иди в jjjj|jeP*aT "l"-

BIT a BIT в BIT а "ХОР" BIT в
0 0 0
1 0 1
0 1 1 BIT - бит; BIT a XOR BIT в - результат выполнения X0R для битов айв.
Последнее, что нам необходимо рассмотреть, зто результат воздействия зтих операций на
флаги.

Флаг нуля этот флаг будет установлен (=1), если ре-
зультат равен нулю;
флаг знака этот флаг будет установлен (=1), если бит

7 результата установлен
флаг переноса флаг будет сброшен (=0), после "AND", " OR",

"XOR". т. Е. Перенос будет сброшен.
Флаг четности этот Флаг будет установлен (=1), если в резуль-
тате будет четное количество единичных битов:
0 110 1110 =) установлен
0 110 10 10 =) сброшен
обратите внимание, что этот флаг также доблирует флаг переполнения
флаг половин- оба флага сброшены (=0) после "AND", "OR , "XOR"
ного переноса

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

Применение булевских операций над флагами

Есть особый случай булевских операторов, очень удобный, случай, когда регистр а
д
ействует на самого себя. AND а "а не меняется, флаг переноса сбрасывается;
00 а "а" не меняется, флаг переноса сбрасывается;
X0R а "а" устанавливается равньы нулю, флаг перено-
са сбрасывается.

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

Флаг переноса часто приходится сбрасывать, например, в рабочем порядке перед примене-
нием арифметических операций, таких как
ADC сложение с переносом
SBC вычитание с переносом и это можно легко сделать с помощью команды AND без измене-
ния какого бы то ни было регистра.

Работа с 16-битовыми числами

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

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

Непосредственная расширенная адресация

LD RR, NN
(или другие команды)

^ Это - эквивалент непосредственной'адресации для 8-битовых чисел, Поосто непосредствен-
ней адресация расширена таким образом, чтобы применяться для передачи 16-битозых данных.

в общем случае команды, обрабатывающие 16-битовые числа, длиннее и медленнее, чем
предназначенные для 8-битовых. Например, если 8-битовые команды с непосредственной ад-
ресацией имеют длину 2 байта (один для команды и один для числа), то расширенная версия
(т. Е. Для 16 битов) требует трех байтов.

Формат для расширенной непосредственной адресации имеет вид:

байт 1 команда '

байт 2 N1 младший байт числа

байт 3 N2 старший байт числа.

Мы используем этот тип адресации команды для определения содержимого пары регистров,
' например, в качестве указателя на ячейку памяти.

Регистровая адресация

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

То же самое остается верным для 16-битовых команд, за исключением того, что в наборе
команд ЦП таких команд немного. Они в основном относятся к арифметическим операциям и
очень ограничены в плане допустимых комбинаций регистров.
Например, ADD HL, вс.

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

Косвенная регистровая адресация

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

'Например, JP (HL).

Расширенная адресация

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

Например, LD HL, (NN), где NN должно быть задано на стадии программирования.
QfoaCoTia чи<?рл на двух регистрах

Задание адресов с помощью 16-битовых иисел
Обратите, пожалуйста, внимание, что все адреса задаются с помощью 16-битовых чисел.
Вы просто не сможете задать адрес с помощью всего 8 битов, даже если этот адрес лежит
в диапазоне от 0 до 2ьь. В соответствии со способом работы ЦП это не будет адресом,
поскольку в нем нет двух байтов по 8 битов каждый.

№ подразумев^/чото, когда использовали сокращенную запись:

Так что помните также, что 16-битовые числа хранятся в паре регистров так, что первым
идет старший байт.

Хранение 16-6 и т о в ы х чисел в памяти

Есть один аспект конструкции Z80, который очень трудно объяснить или оправдать: при
загрузке 16-битовых чисел в память используется обратный порядок по сравнению с парами
регистров. Младший бит в памяти всегда хранится первым!

Давайте рассмотрим ситуацию, в которой мы помещаем в память содержимое HL:
до того: ячейка содержимое

32000 00

н L 32001 00

01 02 32002 00

предположим, что в HL содержится десятичное число 258 = 0102н. Все ячейки памяти
пусты.

После ячейка содержимое

32000 02

н L 32001 01

01 02 32002 00

порядок хранения 16-битовых чисел в памяти (и в распечатке программы) таков, что млад-
ший бит всегда хранится в начале.

Команды операций загрузки для 16-разрядных чисел

MNEMONIC JBYTES

TIME
TAKEN

EFFECT ON FLOGS

С

Z

PV

s

N

H

LD REG PAIR.NUMBER
LD IX,NUMBEl)
LD IY,NUMBER

4

10
14
14

LD (ADDRESS),BS OR DE
LD ADDRESS ,HL
LD ADDRESS IX
LD (ADDRESS),IY

4

3

4
4

20
16
20
20

-

LD bc OR DEA(ADDRESS) 4
LD HL,(ADDRESS) 3
LD IX, ADDRESS 4
LD IY,(ADDRESS) 4

20
16
20
20

-

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

Обозначения для флагов:
Я означает, что олаг изменился в результате операции;

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

1 означает, что олаг устанавливается;
- означает, что флаг не изменяется.

Очень желательно, чтобы вы внимательно это прочли и удостоверились, что освоили это
обращение традиционных правил. Скорее всего именно это станет единственным важнейшим
источником ошибок в программах:

в регистрах: старший байт хранится первым;
в памяти и программах: младший байт хранится первым.

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

Загрузка 16-битовых чисел

Группа команд загрузки 16-битовых чисел, говоря упрощенно, сводится к загрузке 15-би-
тового числа^пар|у>егистров. Общий вид мнемонического сокращения следующий

другие команды загрузки для 16 битов

Помимо возможности загрузки 16-битовых чисел непосредственно в пары регистров у нас
ест^ еще возможность Ц^Р]^ ^битовых чисел непосредственно в индексные регистры.

LD IY', NN

Мы можем также управлять обменом информацией между парой регистров и двумя последова-
тельными ячейками памяти. (Зто 16-битовый эквивалент загрузки информации из одного ре-
гистра в одну ячейку памяти).

Общий вид командосле^ющий

LD NN К IX
LD (NN), IY

Напомним, что скобки - это сокращенное обозначение "содержимого", так что последняя
команда читается как "загрузить содержимое регистра IY в ячейку памяти NN".

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

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

LD RR, (NN)
LD IX, NN
LD IY, (NN)

Команды операций со стеком

MNEMONIC

BYTES

TAKEN

| EFFEKT ON FLAGS

С

Z

PV

s

N

H

PUSH REG PAIR
PUSH IX OR IY

1
2

11
15

-

-

-

-

-

-

Pop REG PATR
Pop IX OR IY

1
2

10
14

LD SP, ADDRESS
LD SP,(ADDRESS)
LD SP, HL
LD SP IX OR IY

3
3
1
2

10
20
6
10

_

MNEMONIC - мнемоническое обозначение; BYTES - байты; TIME TAKEN -время выполнения;
EFFEST ON FLAGS -результат воздействия на; REG PAIR - пара регистров; OR - или; ADDRESS -
адрес.

Обозначения для флагов:
1 I означает, что флаг изменяется в результате операции;

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

1 означает, что флаг устанавливается;

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

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

Общии виДрКОман^ вталкивания информации в стек следующий:

PUSH IX

PUSH IY а общий вид команд выталкивания информации назад из стека:
pop RR
pop IX

POP IY это - очень простые команды, и вы, конечно, заметите, что нет необходимости за-
давать адрес.

Для обычных пар регистров (т.е. не индексных регистров) эти команды имеют длину всего
один байт и поэтому экономны с точки зрения практики программирования.

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

Обратите внимание, что поскольку мы можем выполнять операции PUSH и pop для произволь-
ных пар регистров, регистр, для которого выполняется команда pop не осязан быть тем хе
самьы, для которого выполнялась команда PUSH!

Например,

PUSH вс

POP HL результат вьполнения этих двух команд состоит в том, что содержимое регистра
(так в оригинале, точнее было бы говорить о паре регистров. (Примеч. пер.)) вс не изменя-
ется, а содержимое HL становится равным содержимому регистра вс во время выполнения ко-
манды PUSH.

Зто по существу добавляет команду типа

LD RR, RR" к группе команд загрузки 16-битовых чисел, которая явно отсутствовала.

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

Другим дополнительны* преимуществом является то, что мы можем выполнять команды PUSH и
pop для пары регистров
AF! Зто - одна из немногих команд, в которых AF рассматривается
как пара регистров, и очевидно в этом есть смысл, поскольку нам не оаз придется сохранясь
содержимое флагов.

Зто означает, что вы можете выполнить PUSH AF (по существу записать, чему равны э и
F), провести вычисления, нежелательным побочным эффектом которых может быть изменение
флагов, и затем выполнить pop для AF, оставляя флаги неизменными.




СОДЕРЖАНИЕ:


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

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



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

Похожие статьи:
От авторов - Креаторы и всё такое.
Реклама - всё для ZX Spectrum 48/128.
TRSН'SКАZKА - ШАШЛЫКИ.
Система - Обзор системных программ: ART Studio v 2. 1
Анкета - Sinus/TGT tm.

В этот день...   24 апреля