Деление.
Адрес |
Код |
Мнемокод |
Комментарий |
0800 |
3A 000B |
LDA, 0B00h |
Данные по адресу 0B00h à A. |
0803 |
5F |
MOV E, A |
Поместить делимое в регистр E. |
0804 |
3A 010B |
LDA, 0B01h |
Данные по адресу 0B01h à А. |
0807 |
57 |
MOV D, A |
Поместить делитель в регистр D. |
0808 |
21 0800 |
LXI H, 0008h |
Очистить регистр H и загрузить счётчик разрядов L. |
080B |
0E 00 |
MVI C, 00h |
Очистить регистр промежуточного делимого. |
080D |
7B |
MOV A, E |
Поместить делимое в А. |
080E |
17 |
RAL |
Сдвинуть число в А влево на 1 разряд. |
080F |
5F |
MOV E, A |
Сохранить делимое в регистре E. |
0810 |
79 |
MOV A, C |
Загрузить в А промежуточное делимое. |
0811 |
17 |
RAL |
Сдвинуть число в А влево. |
0812 |
92 |
SUB D |
Вычесть делитель из содержимого А. |
0813 |
D2 1708 |
JNC 0817h |
Если нет займа (CY=0), то идти на 0817h |
0816 |
82 |
ADD D |
Иначе восстановить содержимое А. |
0817 |
4F |
MOV C, A |
Возвратить промежуточное делимое в регистр С. |
0818 |
3F |
CMC |
Инвертировать признак переноса. |
0819 |
7C |
MOV A, H |
Поместить частное в А. |
081A |
17 |
RAL |
Сдвинуть значение флага CY в младший разряд частного. |
081B |
67 |
MOV H, A |
Сохранить частное в регистре Н. |
081C |
2D |
DCR L |
Уменьшить счётчик разрядов на 1. |
081D |
C2 0D08 |
JNZ 080Dh |
Если проверены не все разряды, то продолжать (переход на 080Dh). |
0820 |
7C |
MOV A, H |
Поместить частное в А. |
0821 |
32 000B |
STA 0B00h |
Поместить частное по адресу 0B00h. |
0824 |
79 |
MOV A, C |
Поместить остаток в А. |
0825 |
32 010B |
STA 0B01h |
Поместить остаток по адресу 0B01h. |
0828 |
CF |
RST |
Завершить программу. |
Описание программы деления с плавающей точкой. Этот быстрый способ деления известен в народе как деление столбиком, он проще, чем другой способ, где делитель просто вычитается из делимого.
Рассмотрим на примере деления числа 7 на 3:
01112=710; 00112=310
Первая команда 0800: 3A 000B (LDA, 0B00h) – поместить число (делимое (0111)) в регистр А из указанного адреса памяти.
Вторая команда 0803: 5F (MOV E, A) – переместить число (делимое (0111)) в регистр E из регистра A.
Третья команда 0804: 3A 010B (LDA, 0B01h) – поместить число (делитель (0011)) в регистр А из указанного адреса памяти.
Четвёртая команда 0807: 57 (MOV D, A) – переместить число (делитель (0011)) в регистр D из регистра A.
Пятая команда 0808: 21 0800 (LXI H, 0008h) – эта команда объединяет в себе две команды. С помощью косвенной адресации число 0008 помещается в регистры H и L. В регистр H будет записываться ответ, и поэтому его нужно очистить (00), а в регистр L помещается счётчик равный 08, так как программа деления имеет дело с двузначными числами в шестнадцатеричной системе, что равно восьмизначному числу в двоичной системе. Поэтому 08 – восемь разрядов в двоичной системе – восемь бит – один байт. В нашем примере для простоты используется четырёхзначное число.
С помощью регистровой адресации эту команду можно расписать как две отдельные (очистить регистр H и поставить число 08 в регистр L), но в этом случае она будет занимать минимум 4 слова (26 00 (MVI H, 00h - Передать непосредственно следующие данные 00h в H); 2E 08 (MVI L, 00h - Передать непосредственно следующие данные 00h в H)), а при объединении операций используется косвенная адресация, и команда занимает 3 слова (21 0800).
Шестая команда 080B: 0E 00 (MVI C, 00h) – поместить число 00 в регистр C, то есть его очистить. В регистре C находится так называемое промежуточное делимое. Объяснение промежуточного делимого будет приведено ниже – одиннадцатая команда.
Седьмая команда 080D: 7B (MOV A, E) – переместить число (делимое (0111)) в регистр A из регистра E.
Восьмая команда 080E: 17 (RAL) – сдвинуть число в регистре A влево. При сдвиге числа влево каждый разряд числа перемещается на одну позицию влево, крайний левый разряд «отрезается» и записывается в регистре флагов как CY, а на пустое место крайнего правого занимается значением из флага CY, которое он имеет до начала сдвига.
Было 0111 – сдвигаем влево получаем 1110 (или 1111 описано в двадцатой команде).
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.