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

Первый ноль из числа «отрезался» флаг CY стал равняться нулю, три единицы передвинулись на одну позицию влево, пустое место справа заняло значение флага CY, которое он имел до начала сдвига. При выполнении этой команды возможно появление в последнем разряде или ноля или единицы, поскольку значение флага CY в начале программы не обнулялось и могло быть любым в зависимости от программы, которую УМК выполнял до этой программы деления. Но это неважно, так как в счетчике разрядов находится число 8. Подробное объяснение будет представлено ниже. Допустим, получилось число 1110.

Команда 1F (RAR) – сдвиг вправо работает аналогично, только вправо.

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

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

Одиннадцатая команда 0811: 17 (RAL) – сдвинуть число в регистре A влево. Этой командой мы и создаём «промежуточное делимое». В регистре A находилось число 0000, мы его сдвигаем влево, крайнее правое положение занимает значение флага CY (0) получаем число 0000, флаг CY становится равным нулю, но это совсем неважно, смотри двенадцатую команду.

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

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

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

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

Три описанные выше команды – это попытка компьютера вычесть из «промежуточного делимого» делитель. Как видно из примера – попытка не удалась, CY равен 1, то есть при вычитании был займ, и компьютер восстановил «промежуточное делимое».

По сути это означает, что из числа 0000 нельзя вычесть число 0011.

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

Шестнадцатая команда 0818: 3F (CMC) – перевернуть значение флага CY. Эта команда отражает результат попытки вычитания. В нашем случае вычитание не удалось, был займ, CY равен 1, мы его переворачивает, получаем 0. 0 это пока и есть ответ, иначе говоря, вычесть из первого разряда делимого – числа 0 (0000 – промежуточное делимое) число делитель (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. Мы уменьшаем счётчик, так как один разряд делимого мы уже выписали отдельно в виде промежуточного делимого, и пытались вычесть из него делитель, стало быть, осталось выписать ещё 7 разрядов, поскольку число восьмизначное.