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

Адрес

Код

Мнемокод

Комментарий

0800

3A 000B

LDA, 0B00h

Данные по адресу 0B00h à A.

0803

57

MOV D, A

Передача A à D (множимое).

0804

3A 010B

LDA, 0B01h

Данные по адресу 0B01h à A.

0807

5F

MOV E, A

Передача А à E (множитель).

0808

01 0000

LXI B, 0000h

Очистить содержимое регистров ВС.

080B

3E 01

MVI A, 01h

Загрузить в А указатель разряда.

080D

A7

ANA A

Убрать флаг CY (перенос).

080E

F5

PUSH PSW

Сохранить указатель разряда в стеке.

080F

A3

ANA E

Проверить очередной разряд множителя.

0810

78

MOV A, B

Загрузить в A старший байт суммы.

0811

CA 1508

JZ 0815h

Если в очередном разряде записан 0, то идти на 0815h.

0814

82

ADD D

Прибавить множимое к сумме.

0815

1F

RAR

Сдвинуть сумму на 1 разряд вправо.

0816

47

MOV B, A

Передача A à B (старший байт).

0817

79

MOV A, C

Передача C à A (младший байт).

0818

1F

RAR

Сдвинуть число в A вправо.

0819

4F

MOV C, A

Передать младший байт в регистр С.

081A

F1

POP PSW

Получить из стека указатель разряда.

081B

17

RAL

Указать на следующий разряд.

081C

D2 0E08

JNC 080Eh

Если разряд не последний, идти на 080Eh.

081F

78

MOV A, B

Передать старший байт в А.

0820

32 000B

STA 0B00h

Поместить старший байт по адресу 0B00h.

0823

79

MOV A, C

Передать младший байт в А.

0824

32 010B

STA 0B01h

Поместить младший байт по адресу 0B01h.

0827

CF

RST

Завершить выполнение программы.

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

Рассмотрим на примере умножения числа 6 на 3:

01102=610; 00112=310

Первая команда 0800: 3A 000B (LDA, 0B00h) – поместить число (так называемое множимое – один из множителей (0110)) в регистр А из указанного адреса памяти.

Вторая команда 0803: 57 (MOV D, A) – переместить число (множимое (0110)) в регистр D из регистра A.

Третья команда 0804: 3A 010B (LDA, 0B01h) – поместить число (множитель (0011)) в регистр А из указанного адреса памяти.

Четвёртая команда 0807: 5F (MOV E, A) – переместить число (множитель (0011)) в регистр E из регистра A.

Пятая команда 0808: 01 0000 (LXI B, 0000h) – эта команда записывает в пару регистров BC число 00. В эти регистры мы будем записывать произведения, поэтому их необходимо очистить.

Шестая команда 080B: 3E 01 (MVI A, 01h) – поместить число 01 в регистр A, это число попросту является 00000001, но для простоты примера, мы возьмём не восьмизначное число, а четырёхзначное 0001, хотя программа предназначена для работы именно с восьмизначными числами. Для чего оно, будет описано ниже.

Седьмая команда 080D: A7 (ANA A) – переместить число (делимое (0111)) в регистр A из регистра E.

Восьмая команда 080E: 17 (RAL) – сдвинуть число в регистре A влево. При сдвиге числа влево каждый разряд числа перемещается на одну позицию влево, крайний левый разряд «отрезается» и записывается в регистре флагов как CY, а на пустое место крайнего правого занимается значением из флага CY, которое он имеет до начала сдвига.

Было 0111 – сдвигаем влево получаем 1110 (или 1111 описано в двадцатой команде).

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