Адрес |
Код |
Мнемокод |
Комментарий |
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.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.