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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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