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

Когда счётчик разрядов закончится, это будет знаком к окончанию процесса деления. Тут становится видно, почему неважно состояние флага CY перед началом выполнения программы. Если CY равен единице, то в результате первого сдвига делимого младший разряд займет 1, то есть делимое будет больше первоначального, которое мы хотим делить, но поскольку счётчик разрядов равен 8, а числа над которыми мы работаем восьмизначные, эта единица не переползёт в промежуточное делимое, а значит вычитание делителя из неё не будет происходить, поэтому она никак не влияет на результат, а значит и не влияет начальное значение CY.

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

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

Седьмая команда 080D: 7B (MOV A, E) – переместить число (делимое (1110 теперь уже)) в регистр A из регистра E.

Восьмая команда 080E: 17 (RAL) – сдвинуть число в регистре A влево. Команда описана выше. Результат – 1100, значение флага CY стало равным 1.

Девятая команда 080F: 5F (MOV E, A) – переместить число (делимое (1100 теперь уже)) в регистр E из регистра A.

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

Одиннадцатая команда 0811: 17 (RAL) – сдвинуть число в регистре A влево. Команда описана выше. Результат 0001, так как флаг CY равен 1. Фактически мы дописали к первому разряду числа семь в двоичной системе (0) второй разряд (1). И далее будем пытаться вычесть из него делитель (0011).

Двенадцатая команда 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. 0 это пока и есть ответ, иначе говоря, вычесть из двух разрядов делимого – числа 01 (0001 – промежуточное делимое) число делитель (0011) нельзя.

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

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

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

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

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

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