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

Данная группа включает в себя команды, непосредственное выполнение которых обеспечивает арифметическо-логическое устройство (АЛУ) процессора 8080. Поэтому способ выполнения и возможности этих команд целиком определяются архитектурными особенностями АЛУ.

Возможности арифметических команд ограничиваются только операциями сложения и вычитания. Умножение, деление и более сложные арифметические операции можно организовать, составив соответствующие подпрограммы на основе имеющихся в распоряжении команд. Кроме того, возможности АЛУ позволяют одной команде оперировать лишь с однобайтными (и немного с двухбайтными) числами. Реализовать операции с многобайтными числами можно программным путём, понимая и используя признаки результатов однобайтных операций, которые устанавливаются командами этой группы в регистре признаков. К арифметическим командам относятся также команды сравнения, поскольку сравнение производится путём вычитания и установки признаков Z и CY, способных отразить равенство сравниваемых чисел или указать на большее из них.

Логические команды предоставляют возможности непосредственно выполнить следующие операции с однобайтными числами: “И” (конъюнкция), “ИЛИ” (дизъюнкция), “исключающее ИЛИ” (сложение по модулю два), “НЕ” (инверсия).

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

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

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

(A) (A) <op> <2-й операнд>

где <op> – символ операции: “+”, “–”, “&” и т.д. Второй операнд может храниться в регистре процессора, в ячейке памяти или быть в составе самой команды. Первый операнд (или единственный операнд для операций с одним операндом) всегда хранится в аккумуляторе. Результат операции отправляется командой в аккумулятор, а признаки этого результата устанавливаются в регистре признаков.

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

Команды сложения позволяют выполнять операции сложения однобайтных или двухбайтных операндов.

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

Команды сложения двухбайтных операндов работают с операндами только в регистровых парах: первое слагаемое и результат все такие команды хранят в регистровой HL (регистровая пара HL выступает в роли аккумулятора для однобайтных операций), второе слагаемое можно определять в любой из регистровых трёх пар процессора. Двоичное сложение выполняется в соответствии с правилами двоичной арифметики, представленными в Табл.9.1.

Таблица 1.8

Правила двоичного сложения

0 + 0 = 0
0 + 1 = 1
1 + 1 = 0 + перенос 1 в следующий разряд
1 + 1 + 1 = 1 + перенос 1 в следующий разряд

 

Сначала рассмотрим команды сложения однобайтных чисел.

Команды типа ADD r, ADС r обеспечивают выбор второго операнда регистровым методом. Выполняемое командой ADD r действие:

(A) (A) + (r)

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

Пример1.31

Требуется сложить числа 8Eh и C5h.

Адрес Число Мнемокод Комментарий

0800 3E 8E MVI A,8Eh ;поместить в аккумулятор 1-е слагаемое

0802 06 C5 MVI B,C5h ; поместить в регистр B 2-е слагаемое

0804 80 ADD B ; выполнить сложение: (A) (A) + (B)

Операция сложения должна дать такой результат:

1 0 0 0 1 1 0 0 8 C

+ 1 1 1 0 0 1 0 1 + E 5

1 0 1 1 1 0 0 0 1 1 7 1

Процессор, выполнив команду ADD B, сохранит младшие 8 разрядов результата в аккумуляторе, а 9-й старший разряд – в бите CY регистра признаков. Бит CY в этом случае как бы дополняет до 9 количество разрядов хранения результата. Другие команды могут использовать бит CY для новых операций сложения, когда выполняется сложение следующих байтов многобайтных чисел.

Команды типа ADC r обеспечивают сложение двух операндов подобно команде ADD r, но кроме того к результату ещё суммируется бит CY регистра признаков:

(A) (A) + (r) + (CY)

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

Пример1.32

Запрограммировать сложение двухбайтных чисел 358Eh+24C5h.

Адрес Число Мнемокод Комментарий

0800 01 8E 35 LXI B,358E ; поместить в BC 1-е слагаемое

0803 11 C5 24 LXI D,24C5 ; поместить в DE 2-е слагаемое

0806 79 MOV A,C ; подготовить и

0807 83 ADD E ; выполнить сложение младших байтов без

;учёта переноса

0808 6F MOV L,A ; поместить младший байт результата в L

0809 78 MOV A,B ; подготовить и

080A 8A ADC D ; выполнить сложение старших байтов с

;учётом переноса

080B 67 MOV H,A ; поместить старший байт результата в H

Команды типа ADD M, ADС M обеспечивают выбор второго операнда косвенно-регистровым методом, когда адрес операнда определяется в регистровой паре HL. Выполняемое командой ADD M действие:

(A) (A) + M(HL)

Выполняемое командой ADC M действие:

(A) (A) + M(HL) + (CY)

Пример1.33

Выполнить сложение 8Eh+C5h, если 2-е слагаемое C5h находится в ячейке с адресом 0B00h.

Адрес Число Мнемокод Комментарий

0800 3E 8E MVI A,8E ; поместить в аккумулятор 1-е слагаемое

0802 21 00 0B LXI H,0B00 ; подготовить в HL адрес ячейки M

0804 86 ADD M ; выполнить сложение: (A) (A) + M(HL)

Команды типа ADI d8, ACI d8 обеспечивают выбор второго операнда непосредственным методом, то есть путём указания числа в составе самой команды. Выполняемое командой ADI d8 действие:

(A) (A) + d8

Выполняемое командой ACI d8 действие:

(A) (A) + d8 + (CY)

Пример1.34

Выполнить сложение 8Eh+C5h.

Адрес Число Мнемокод Комментарий

0800 3E 8E MVI A,8E ; поместить в аккумулятор 1-е слагаемое

0802 C6 C5 ADI C5 ; выполнить сложение: (A) (A) + C5h

Ещё один тип команд сложения обеспечивает сложение задаваемого операнда с числом 1, то есть инкремент операнда. Операнд может быть определён одним из двух способов. В команде INR rоперанд определён регистровым способом и схема выполнения команды выглядит следующим образом:

(r) (r) + 1

В команде INR M операнд определён косвенно-регистровым способом по адресу в регистровой паре HL и схема выполнения команды выглядит следующим образом:

M(HL) M(HL) + 1

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

Пример2.35

Пусть в исходном состоянии было: M(0B00)=8Eh, M(0B01)=C5h. Затем выполнятся следующие команды.

Адрес Число Мнемокод Комментарий

0800 21 00 0B LXI H,0B00 ; подготовить в HL адрес ячейки M

0803 34 INR M ; инкремент содержимого ячейки M(0B00)

0804 2C INR L ; инкремент содержимого регистра ;(L)(L)+1

0805 34 INR M ; инкремент содержимого ячейки M(0B01)

и после выполнения этих команд в памяти данных будет: M(0B00)=8Fh, M(0B01)=C6h.

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

Кроме команд сложения однобайтных операндов есть среди команд сложения команды сложения двухбайтных операндов – DAD B, DAD D, DAD H, DAD SP. Схема их выполнения

(HL) (HL) + (rp),

где rp – регистровая пара BC, DE, HL или регистр SP. Характерным отличием таких команд сложения от команд однобайтных операций является то, что эти команды воздействуют своим выполнением не на все признаки регистра признаков, а только на один из них – на признак CY. Команды двухбайтных операций с участием бита CY вообще отсутствуют, поэтому для суммирования многобайтных чисел (более 3-х байтов) их применять не рекомендуется, а лучше использовать команды однобайтных операций.

Пример1.36

Адрес Число Мнемокод Комментарий

0800 09 DAD B ; выполнить сложение: (HL)(HL)+(BC)

Существуют также команды сложения двухбайтного операнда регистровой пары с числом 1 то есть инкремент регистровых пар: INX B, INX D, INX H. Схема их выполнения

(rp) (rp) + 1

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

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

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

Таблица 1.9

Правила двоичного вычитания

0 – 0 = 0
1 – 0 = 1
1 – 1 = 0
0 – 1 = 1 – заём 1 из следующего разряда

Команды вычитания SUB r и SBB r определяют второй операнд (вычитаемое) регистровым способом. Команды SUB r выполняется по схеме:

(A) (A) – (r)

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

Пример1.37

Требуется вычесть из числа 8Eh число C5h.

Адрес Число Мнемокод Комментарий

0800 3E 8E MVI A,8E ; поместить в аккумулятор уменьшаемое

0802 06 C5 MVI B,C5 ; поместить в регистр B вычитаемое

0804 90 SUB B ; выполнить вычитание: (A) (A) – (B)

Операция вычитания должна дать такой результат:

1 0 0 0 1 1 0 0 8 C

– 1 1 1 0 0 1 0 1 – E 5

1 1 0 1 0 0 1 1 1 1 A 7

В результате операции присутствует заём, так как уменьшаемое меньше вычитаемого. Выполняя команду SUB B, процессор сохранит младшие 8 разрядов результата в аккумуляторе, а наличие заёма отразит состоянием бита CY регистра признаков: CY=1. Для операций вычитания бит CY, таким образом, становится битом заёма. Следующие команды вычитания могут использовать бит CY для новых операций вычитания, когда требуется выполнять вычитание более старших байтов многобайтных чисел.

Команда SBB r работает так же как команда SUB r, но кроме того из результата вычитания двух операндов вычитается ещё бит CY.

(A) (A) – (r) – (CY)

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

Пример1.38

Запрограммировать вычитание двухбайтных чисел 358Eh–24C5h.

Адрес Число Мнемокод Комментарий

0800 01 8E 35 LXI B,358E ; поместить в BC уменьшаемое

0803 11 C5 24 LXI D,24C5 ; поместить в DE вычитаемое

0806 79 MOV A,C ; подготовить и выполнить вычитание

0807 93 SUB E ; младших байтов без учёта заёма

0808 6F MOV L,A ; поместить младший байт результата в L

0809 78 MOV A,B ; подготовить и выполнить вычитание

080A 9A SBB D ; старших байтов с учётом заёма

080B 67 MOV H,A ; поместить старший байт результата в H

 

Команды типа SUB M, SBB M обеспечивают выбор операнда-вычитаемого косвенно-регистровым методом, когда адрес операнда определяется в регистровой паре HL. Выполняемое командой SUB M действие:

(A) (A) – M(HL)

Выполняемое командой SBB M действие:

(A) (A) – M(HL) – (CY)

Пример1.39

Выполнить вычитание 8Eh–C5h, если вычитаемое C5h находится в ячейке с адресом 0B00h.

Адрес Число Мнемокод Комментарий

0800 3E 8E MVI A,8E ; поместить в аккумулятор уменьшаемое

0802 21 00 0B LXI H,0B00 ; подготовить в HL адрес ячейки M

0804 96 SUB M ; выполнить вычитание: (A) (A) – M(HL)

Команды типа SUI d8, SBI d8 обеспечивают выбор операнда-уменьшаемого прямым методом, то есть путём указания числа в составе самой команды. Выполняемое командой SUI d8 действие:

(A) (A) – d8

Выполняемое командой SBI d8 действие:

(A) (A) – d8 – (CY)

Пример1.40

Выполнить вычитание 8Eh–C5h.

Адрес Число Мнемокод Комментарий

0800 3E 8E MVI A,8E ; поместить в аккумулятор уменьшаемое

0802 D6 C5 SUI C5 ; выполнить вычитание: (A) (A) – C5h

Ещё один тип команд вычитания обеспечивает вычитание из задаваемого операнда числа 1, то есть декремент операнда. Операнд может быть определён одним из двух способов. В команде DCR r операнд определён регистровым способом и схема выполнения команды выглядит следующим образом:

(r) (r) – 1

В команде DCR M операнд определён косвенно-регистровым способом по адресу в регистровой паре HL и схема выполнения команды выглядит следующим образом:

M(HL) M(HL) – 1

В отличие от большинства других арифметическо-логических команд, воздействующих на все признаки, данные команды декремента никак не влияют на один из битов признаков – бит CY. На основе таких команд удобно организовывать вычитающие счётчики повторений каких-либо циклов операций с контролем количества повторений по признаку Z (см. пример 9.11).

Существуют также команды вычитания из двухбайтного операнда регистровой пары числа 1 то есть декремент регистровых пар: DCX B, DCX D, DCX H. Схема их выполнения:

(rp) (rp) – 1

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

Пример1.41

Требуется выполнить обнуление области из 55h ячеек памяти, начинающейся по адресу 0B00.

Метка Мнемокод Комментарий

MVI C,55h ;загрузка счётчика повторений цикла

LXI H,0BF0h ;загрузка в HL указателя начала области

MVI A,00 ;обнуление аккумулятора

M00: MOV M,A ;обнуление очередной ячейки

INX H ;HLHL+1 продвижение указателя ячеек

DCR C ;CC–1 подсчёт ячеек и установка Z

JNZ M00 ;переход к M00, если не выполнено Z=1

HLT ;останов, если Z=1

На основе команды декремента DCR C здесь организуется счётчик проходов цикла, а на основе команды инкремента регистровой пары INX H реализуется модификация указателя ячеек рабочей области памяти. Вместо этой команды можно с тем же успехом применить команду DCX H, при этом число исходного значения указателя должно быть 0C45h.