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

Команды вычитания позволяют выполняют операции только с однобайтными операндами. По схеме выполнения и способам определения 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.