3.1.2. Команды арифметических операций

Команды этой группы могут выполнять операции сложения, вычитания, инкрементирования, декрементирования, сравнения. Аккумулятор (регистр А) содержит одно из слагаемых. Каждая команда точно оговаривает различные источники другого слагаемого.

Рассмотрим некоторые из них, приведенные в табл. 3.4.

Рассмотрим первую из команд сложения в табл. 3.4.  Команда сложить непосредственно является двухбайтовой. Ее формат КОП (в этом случае C6H) содержится в первом байте команды, непосредственно за ним во втором байте находятся данные для сложения с содержимым аккумулятора. Команда ADI выполняется по схеме, приведенной на рис 3.6, а, данные, находящиеся в памяти непосредственно за КОП, складываются с содержимым аккумулятора (0000 1111). Сумма (0001 1111) помещается в аккумулятор.

Второй является команда сложить содержимое регистров A и L (мнемоника ADD L), на рис. 3.6, б показано ее выполнение. Содержимое аккумулятора (0000 1000) складывается с содержимым регистра L (0000 0001), получающаяся в результате выполнения команды сумма (00001001) помещается в аккумулятор.

Рис. 3.5. Интерпретация операции сложения:

а – сложение (А) с данными, следующими непосредственно за КОП;

б – сложение (L) и (А); в – сложение (Н) и (А);

г – сложение с косвенной адресацией

Третья команда представляет собой однобайтовую команду сложить с косвенным регистром (мнемоника ADD M). Адрес данного слагаемого числа задан в более сложной форме с использованием способа косвенной регистровой адресации. Рис. 3.6, г является примером выполнения этой команды. Пара  HL указывает 16-разрядный адрес ячейки памяти, то есть LOC. Ее содержимое (0000 0011) сложено с содержимым аккумулятора (0110 0000), сумма (0110 0011) помещена в аккумулятор.

Команды косвенного сложения используют в качестве указателя адреса              16-разрядный регистр (обычно пару HL). 

Рассмотрим снова команду сложить с косвенным регистром (ADD M). Предписание символики указывает: сложить LOC (H+L) с А, которое мы прочтем как сложить содержимое памяти, на которую указывает пара регистров HL, с содержимым регистра А. Следуя соответствующей строке в табл. 3.4, мы найдем, что способом адресации является косвенная регистровая и соответствующей мнемоникой будет ADD M с КОП 86H. Эта команда является однобайтовой. Представленный формат ее показывает, что

единственным байтом является КОП. Следуя предписанию, данному разработчиком, символическую запись читают справа налево. Справа стрелки первый операнд идентифицирован как содержимое А (аккумулятора). Скобки в рамках этой записи означают содержимое. Знак + означает выполняемую операцию, а двойная скобка (()) указывает команду косвенной адресации. Выражение ((H)(L)) означает: содержимое пары HL указывает адрес расположения в памяти второго операнда. Иначе говоря, второй операнд расположен в ячейке памяти, на которую указывает пара регистров HL. После того как операция выполнена, ее результат помещается в аккумулятор A.

Таблица 3.4 Группа арифметических команд

Операция

Адресация

Мнемоника

КОП

Байты

Формат команды

Символика

Индикаторы

Сложить (А) с данными

Сложить (L) с (А)

Сложить LOC (HL) с (А)

Вычесть (H) из (А)

Инкремент (А)

Декремент (В)

Сравнить (А) с (L)

непосредственная

регистровая

косвенная регистровая

регистровая

регистровая

«»

«»

ADI

ADD L

ADD M

SUB H

INR A

DCR B

CMP L

C6

85

86

96

3C

4D

BD

2

1

1

1

1

1

1

(A)  (A)+

(bite2)

(A)     (A)+(L)

(A)          (A)+

((H)(L))

(A)       (A)-

(H)

(A)        (A)+1

(B)        (B)-1

(A)-(L)

Все

Все

Все

Все

Все

Все

Z, CY

Рассмотрим команду вычитания содержимого регистра L из содержимого регистра А, приведенную на рис. 3.7, а. Пусть надо вычесть двоичное число 0000 0110 из двоичного 0000 0101. Уменьшаемое складывается с результатом преобразования вычитаемого в дополнительный код 1111 1010, что дает 1111 1111. Этот результат является  представлением в дополнительном коде числа -110. Сложение не вызывает переполнения тогда, когда имеем 0 в регистре переполнения. Этот результат инвертируется, так как речь идет о вычитании, что дает 1 в регистре переноса СУ. Когда индикатор СУ устанавливается в 1 после вычитания, это означает, что число, содержащееся в аккумуляторе, младше числа в памяти или в регистре.

Индикатор переноса в состоянии 1 показывает, что число, содержащееся в аккумуляторе после того, как вычитание было выполнено, является дополнительным кодом,

представляя отрицательное число. 1111 1111 в аккумуляторе на рис. 3.7, а представляет собой  -110.

Рис. 3.6. Арифметические команды: а – вычитания (L) из (А); 

б – команда сравнения (А) с (L)

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

На рис. 3.7, б приведен пример использования команды СРАВНИТЬ регистр (L). Равные числа 0001 0000 являются содержимым аккумулятора и регистра (L) и сравниваются микропроцессором. Заметим на рис. 3.7, б, что ни одно, ни другое из содержимых не изменяется после операции сравнения. Индикаторы же подвержены влиянию результата сравнения. При выполнении команды первое число 0001 0000 и дополнительный код второго числа 1111 0000 складываются, что дает результат 1 0000 0000.

Затем проверяется равенство 0 восьми младших разрядов. Индикатор нуля принимает значение 1. Переполнение 1 инвертируется АЛУ, и в этом примере индикатор переноса принимает значение 0. Сброшенный индикатор переноса СУ означает, что содержимое аккумулятора больше или равно содержимому регистра L.

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