Программирование в машинных кодах и на языке ассемблера 1993 г.

Арифметические и логические команды - Команды сложения. Команды вычитания. Команды сравнения. Команды логики.


5.5. Команды сложения

 

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

 

5.5.1. Простое сложение.

Все команды этой подгруппы влияют на флаг переноса (С-флаг). В зависимости от того, превосходит ли результат сложения FF (255) для однобайтного сложения или FFFF (65535) для двухбайтного сложения содержимого двух регистровых пар, С-флаг либо включается, либо выключается.

 

Например: 2D + C0 = ED (45+192=237) -> C=0;

5D + C0 = 1D (93+192=29)  -> C=1.

 

Однобайтное сложение.

Мнемоника

Код

Мнемоника

Код

ADD A,n

C6 n

ADD A,A

87

ADD A,H

84

ADD A,L

85

ADD A,B

80

ADD A,C

81

ADD A,D

82

ADD A,E

83

ADD A,(HL)

86

ADD A,(IX+s)

DD 86 s

ADD A,(IY+s)

FD 86 s

 

 

 

Двухбайтное сложение.

Мнемоника

Код

Мнемоника

Код

ADD HL,HL

29

ADD HL,BC

09

ADD HL,DE

19

ADD HL,SP

39

ADD IX,IX

DD 29

ADD IY,IY

FD 29

ADD IX,BC

DD 09

ADD IY,BC

FD 09

ADD IX,DE

DD 19

ADD IY,DE

FD 19

ADD IX,SP

DD 39

ADD IY,DE

FD 39

 

5.5.2. Приращение.

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

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

 

Мнемоника

Код

Мнемоника

Код

INC A

3C

INC H

24

INC L

2C

INC B

04

INC C

0C

INC D

14

INC E

1C

INC (HL)

34

INC (IX+s)

DD 34 s

INC (IY+s)

FD 34 s

INC HL

23

INC BC

03

INC DE

13

INC SP

33

INC IX

DD 23

INC IY

FD 23

 

Обратите внимание на разницу команд INC HL и INC (HL).

INC HL - прямая команда для регистра HL, она гласит «увеличить на единицу содержимое регистровой пары HL».

INC (HL) - пример применения косвенной адресации; эта команда означает «увеличить на единицу содержимое ячейки  памяти, адрес которой находится в регистре HL».

 

5.5.3. Сложение с учетом переноса.

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

После окончания операции флаг переноса устанавливается в соответствии с результатом (есть перенос - включен, нет - выключен).

Применяются они при сложении многобайтных чисел. Так, например, при сложении двухбайтных чисел 035D и A0C0:

03 5D

+ A0 C0

-----

A4 1D

 

возникает ситуация, когда сумма младших байтов дает число, большее 255 (FF). В этот момент и устанавливается флаг переноса. При сложении же старших байтов эта единица будет к ним прибавлена, если сложение производится командой ADC.

 

Мнемоника

Код

Мнемоника

Код

ADC A,n

CE n

ADC A,A

8F

ADC A,H

8C

ADC A,L

8D

ADC A,B

88

ADC A,C

89

ADC A,D

8A

ADC A,E

8B

ADC A,(HL)

8E

 

 

ADC A,(IX+s)

DD 8E s

ADC A,(IY+s)

FD 8E s

ADC HL,HL

ED 6A

ADC HL,BC

ED 4A

ADC HL,DE

ED 5A

ADD HL,SP

ED 7A

 

5.6. Команды вычитания

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

 

5.6.1. Простое вычитание.

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

 

Мнемоника

Код

Мнемоника

Код

SUB n

D6 n

SUB A

97

SUB H

94

SUB L

95

SUB B

90

SUB C

91

SUB D

92

SUB E

93

SUB (HL)

96

 

 

SUB (IX+s)

DD 96 s

SUB (IY+s)

FD 96 s

 

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

Так, SUB (HL) означает SUB A,(HL) – «вычесть из содержимого аккумулятора то число, которое находится в ячейке памяти, адрес которой находится в регистровой паре HL».

 

5.6.2. Уменьшение (декремент).

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

 

Мнемоника

Код

Мнемоника

Код

DEC A

3D

DEC H

25

DEC L

2D

DEC B

05

DEC C

0D

DEC D

15

DEC E

1D

DEC (HL)

35

DEC (IX+s)

DD 35 s

DEC (IY+s)

FD 35 s

DEC HL

2B

DEC BC

0B

DEC DE

1B

DEC SP

3B

DEC IX

DD 2B

DEC IY

FD 2B

 

5.6.3. Вычитание с учетом «займа».

Команды этой подгруппы начинаются с мнемоник SBC. По своему смыслу они противоположны командам ADC. Отличие от команд SUB состоит в том, что если флаг переноса включен, то значит, при вычитании младшего разряда был сделан заем из старшего и поэтому при операции со старшим разрядом надо еще вычесть единицу.

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

 

Мнемоника

Код

Мнемоника

Код

SBC A,n

DE n

SBC A,A

9F

SBC A,H

9C

SBC A,L

9D

SBC A,B

98

SBC A,C

99

SBC A,D

9A

SBC A,E

9B

SBC A,(HL)

9E

 

 

SBC A,(IX+s)

DD 9E s

SBC (IY+s)

FD 9E s

SBC HL,HL

ED 62

SBC HL,BC

ED 42

SBC HL,DE

ED 52

SBC HL,SP

ED 72

 

5.7. Команды сравнения

 

Мнемоники команд этой группы начинаются с CP от слова compare (сравнивать).

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

В результате операции сравнения значение регистра А не изменяется. Результат операции сказывается только на флагах регистра F.

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

 

Мнемоника

Код

Мнемоника

Код

CP A,n

FE n

CP A

BF

CP H

BC

CP L

BD

CP B

B8

CP C

B9

CP D

BA

CP E

BB

CP (HL)

BE

 

 

CP (IX+s)

DD BE s

CP (IY+s)

FD BE s

 

5.8. Команды логики

 

Система команд процессора Z-80 позволяет выполнять три вида логических операций - логическое «И» (AND), логическое «ИЛИ» (OR) и «ИСКЛЮЧАЮЩЕЕ ИЛИ» (XOR). В соответствии с ними мы можем выделить три подгруппы в этой группе команд.

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

 

5.8.1. Команды «И» (AND).

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

 

Пример:     Первый операнд    1010 1010   (AA)

            Второй операнд    1100 0000   (CO)

            ---------------------------------

            Результат AND     1000 0000   (B0)

 

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

В этой подгруппе существуют 11 операций:

 

Мнемоника

Код

Мнемоника

Код

AND n

E6 n

AND A

A7

AND H

A4

AND L

A5

AND B

A0

AND C

A1

AND D

A2

AND E

A3

AND (HL)

A6

 

 

AND (IX+s)

DD A6 s

AND (IY+s)

FD A6 s

 

С помощью команды AND можно довольно эффектно сбрасывать биты аккумулятора. Например, если Вам нужно его обнулить, дайте команду:

      AND 0 (E6 0)

В программах очень часто бывает нужно проверить состояние некоторых битов, при этом остальные желательно обнулить. Например, если в игровой программе управление ведется от Кемпстон-джойстика, то сигнал от кнопки «огонь» подается по 4-му биту порта 31.

Можно было бы проверить, не включена ли эта кнопка командой CP 10 (десятичное 16), но из этого ничего не получится, т.к. часто кнопка «огонь» включается одновременно с движением объекта. Например, если объект движется вправо - вверх и при этом «стреляет», то включены биты 1,2 и 4 и код равен 2 + 4 + 10 =16. Такая «проверка» показала бы, что кнопка якобы не включена. Поэтому перед проверкой все остальные биты надо погасить. Это легко сделает команда AND 10, а потом можно давать и CP 10. Процесс гашения ненужных битов называется маскированием.

 

5.8.2. Команда «ИЛИ» (OR).

Эта команда также исполняется побитным сравнением двух двоичных чисел. Ее результат равен единице, если данный бит включен в первом или во втором операнде или в обоих вместе. Таким образом, в результате может быть 0 только если в обоих операндах 0, а в противном случае - 1.

 

Пример:     Первый операнд    1010 1010   (AA)

            Второй операнд    1100 0000   (C0)

            ---------------------------------------

            Результат OR      1110 1010   (EA)

 

Эта команда позволяет Вам столь же эффективно включать нужные биты в аккумуляторе (или проверять их включение), как команда AND позволяла их выключать. Например, если Вам надо, чтобы в аккумуляторе были гарантированно включены биты 5, 3, 2 - дайте команду OR 2С (20 + 8 + 4 = 2C).

 

Мнемоника

Код

Мнемоника

Код

OR n

F6 n

OR A

B7

OR H

B4

OR L

B5

OR B

B0

OR C

B1

OR D

B2

OR E

B3

OR (HL)

B6

 

 

OR (IX+s)

DD B6 s

OR (IY+s)

FD B6 s

 

Интересна команда OR A. В результате ее действия производится сравнение по «ИЛИ» содержимого аккумулятора с ним же самим. Разумеется, в результате в аккумуляторе ничего не изменится, но зато гарантированно будет сброшен флаг переноса (флаг С регистра F). Такой же результат дает и применение команды AND A. Обе эти команды очень часто используются в программах именно для этой цели.

 

5.8.3. Команды «ИСКЛЮЧАЮЩЕЕ ИЛИ» (XOR).

В отличие от «ИЛИ» здесь результат равен 1, если хотя бы один из операндов равен 1, но не оба вместе. В остальных случаях он равен нулю.

 

Пример:     Первый операнд    1010 1010   (AA)

            Второй операнд    1100 0000   (C0)

            ---------------------------------

            Результат XOR     0110 1010   (6A)

 

Команда XOR A часто используется для обнуления аккумулятора. Это же можно сделать и командой LD A,0, но XOR короче (один байт вместо двух), а кроме того при команде XOR, как и при всех командах логики AND, OR, XOR сбрасывается флаг переноса, а команды группы загрузки LD на флаги влияния не оказывают.

 

Мнемоника

Код

Мнемоника

Код

XOR n

EE n

XOR A

AF

XOR H

AC

XOR L

AD

XOR B

AB

XOR C

A9

XOR D

AA

XOR E

AB

XOR (HL)

AE

 

 

XOR (IX+s)

DD AE s

XOR (IY+s)

FD AE s

 




СОДЕРЖАНИЕ:


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

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



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

Похожие статьи:
Бук - Похождения Штиpлица и дpугие пpиключения Боpмана.
К авторам - Мы сможем помочь в воплощении Вашей, даже фантастической, мысли в реальность и Вы всё равно останетесь ее автором!
Юмор - подборка анекдотов.
MORTAL KOMBAT - Полнейшее описание игры MORTAL KOMBAT.
Информбюро - Путеводитель по журналу.

В этот день...   28 марта