Программы умножения двоичных чисел. Сдвиг множителя и текущей суммы частичных. Обнуление текущей суммы частичных произведений (ЧП), страница 4

;**************************  D16_16 ******************************

; Подпрограмма деления целых двоичных чисел без знака

; формата 16:16=(16,16) с целым частным.

; Входные параметры: (Н,L) - делимое, (В,С) - делитель.

; Выходные параметры: (D,E) - частное, (Н,L) - остаток.

;****************************************************************

D16_16:

XCHG

; (D,E) - делимое

LXI   H, 0

; Обнуление остатка

MVI   A, 16

; Счетчик циклов

; Сдвиг влево остатка (Н,L) и делимого (частного (D,E)) 

CYCLE:

PUSH   PSW

; Сохранение счетчика

DAD   H

XRA   A

XCHG

DAD   H

XCHG

; Вычитание делителя из остатка

ADC   L

; Учет переноса от сдвига

SUB   C

MOV   L, A

MOV   A, H

SBB   B

MOV   H, A

; Проверка знака разности и коррекция частного

INX   D

; Установка разряда частного = 1

JNC   PER

; Если разность > 0

DAD   D

; Восстановление остатка

DCX   D

; Сброс разряда частного = 0

; Проверка конца цикла

PER:

POP   PSW

; Восстановление счетчика

DCR   A

JNZ   CYCLE

; Зацикливание

RET

;**************************  D16_16A ****************************

; Подпрограмма деления целых двоичных чисел без знака

; формата 16:16=16,16 с дробным частным.

; Делимое меньше делителя.

; Входные параметры: (H,L) -  делимое, (В,С) -  делитель.

; Выходные параметры: (D,E) - частное, (H,L) -остаток.

;****************************************************************

; Дополнение делителя (В,С)

D16_16A:

MOV   A, B

CMA

MOV   B, A

MOV   A, C

CMA

MOV   C, A

INX   B

MVI   A, 16

; Счетчик циклов

; Сдвиг частного (D,E)  и остатка (H,L) влево

CYCLE:

XCHG

DAD   H

; Сдвиг частного

XCHG

DAD   H

; Сдвиг остатка

JC   PER1

; Если переполнение остатка

; Сложение остатка с дополнительным кодом делителя

PUSH   H

; Сохранение остатка

DAD   B

JNC   PER2

; Если сумма  < 0

; Сумма частного > 0, разряд частного = 1

INX   SP

INX   SP

; Баланс стека

INX   D

; +1 в частное

JMP   PER3

; Переполнение остатка, разряд частного = 1

PER1:

DAD   B

; Формирование остатка

INX   D

; +1 в частное

JMP   PER3

; Сумма < 0, восстановление остатка

PER2:

POP   H

; Проверка конца цикла

PER3:

DCR   A

JNZ   CYCLE

; Зацикливание

RET