Деление. Описание программы деления с плавающей точкой. Умножение и описание программы умножения, страница 5

Двенадцатая команда 0812: 92 (SUB D) – вычесть из числа в регистре A (промежуточное делимое (0001 теперь уже)) число в регистре D (делитель (0011)). Получим число 1110, но при этом произойдет займ, то есть флаг CY станет равен 1.

Тринадцатая команда 0813: D2 1708 (JNC 0817h) – условный переход команды по адресу 0817h, если значение флага CY равно 0, то есть при вычитании не было займа. В нашем случае займ был, CY равен 1, перехода не будет.

Четырнадцатая команда 0816: 82 (ADD D) – прибавить к числу в регистре A (1110) число из регистра D (0011). Результат – 0001.

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

По сути это означает, что из числа 0001 можно вычесть число 0011.

Пятнадцатая команда 0817: 4F (MOV C, A) – переместить число (промежуточное делимое (0001 теперь уже)) из регистра A в регистр C.

Шестнадцатая команда 0818: 3F (CMC) – перевернуть значение флага CY. Эта команда отражает результат попытки вычитания. В нашем случае вычитание не удалось, займ был, CY равен 1, мы его переворачивает, получаем 0. Иначе говоря, вычесть из последнего разряда делимого – числа 1 (0001 – промежуточное делимое) число делитель (0011) нельзя.

Семнадцатая команда 0819: 7C (MOV A, H) – переместить число (ответ – пока 1 – 0001) из регистра H в регистр A.

Восемнадцатая команда 081A: 17 (RAL) – сдвинуть влево число в регистре A (0001). Сдвигаем число 0010. Крайнее правое положение занимает значение флага CY, в нашем случае 0, который показывает результат деления на данном этапе. Результат деления пока равен 0010 в двоичной системе или 2 в десятичной.

Девятнадцатая команда 081B: 67 (MOV H, A) – переместить число (ответ – пока 2 – 0010) из регистра A в регистр H.

Двадцатая команда 081C: 2D (DCR L) – уменьшить значение числа (счётчика) в регистре L на 1. Мы уменьшаем счётчик, так как один разряд делимого мы уже выписали отдельно в виде промежуточного делимого, и пытались вычесть из него делитель, стало быть, осталось выписать ещё 4 разрядов, поскольку число восьмизначное.

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

Двадцать первая команда 081D: C2 0D08 (JNZ 080Dh) – условный переход программы по адресу 080Dh, в случае если число в регистре L (счётчик) не равно 0. То есть ещё не проверены все разряды.

Программа не осуществляет переход по адресу 080Dh и начинает выполнять двадцать вторую команду.

Двадцать вторая команда 0820: 7C (MOV A, H) – переместить число (ответ (0010)) из регистра H в регистр A.

Двадцать третья команда 0821: 32 000B (STA 0B00h) – переместить число (ответ (0010)) из регистра A в ячейку памяти с адресом 0B00h, в которой мы будем смотреть ответ от деления (0010).

Двадцать четвёртая команда 0824: 79 (MOV A, C) – переместить число (промежуточное деление (0001)) из регистра C в регистр A.

Двадцать пятая команда 0825: 32 010B (STA 0B01h) – переместить число (промежуточное деление (0001)) из регистра A в ячейку памяти с адресом 0B01h, в которой мы будем смотреть остаток от деления.

Двадцать шестая команда 0828: CF (RST) – прекращение выполнения программы.

Результат деления числа 7 на число 3 это 2 и 1 в остатке.

Умножение