Подпрограмма умножения целых двоичных чисел без знака формата 8*8=16. Вариант А. Метод умножения: 8 циклов сдвигов множителя и текущей суммы частичных произведений вправо. Входные параметры: (С) – множитель, (Е) – множимое. Выходной параметр: (H, L) – произведение. Используются все регистры, сохраняется (С). Оценка: длина – 30 байт, время – не более 679 такта. |
||||
Адрес |
Машинный код |
Метка |
Команда |
Комментарий |
Обнуление текущей суммы ЧП |
||||
0510 |
AF |
XRA A |
||
0511 |
67 |
MOV H, A |
||
0512 |
6F |
MOV L, A |
||
Перемещение множимого |
||||
0513 |
53 |
MOV D, E |
(D) – множимое |
|
0514 |
5F |
MOV E, A |
(Е) – 0 |
|
Проверка сомножителей на 0 |
||||
0515 |
81 |
ADD C |
||
0516 |
C8 |
RZ |
если множитель = 0 |
|
0517 |
AF |
XRA A |
||
0518 |
82 |
ADD D |
||
0519 |
C8 |
RZ |
если множимое = 0 |
|
051А |
0608 |
MVI B, 8 |
счётчик циклов |
|
Сдвиг множителя вправо |
||||
051C |
79 |
LOOP: |
MOV A, C |
|
051D |
0F |
RRC |
||
051E |
4F |
MOV C, A |
||
051F |
D22305 |
JNC M |
если разряд множителя = 0 |
|
Сложение множимого с текущей суммой ЧП |
||||
0522 |
19 |
DAD D |
||
Сдвиг теущей суммы ЧП вправо |
||||
0523 |
7C |
M: |
MOV A, H |
|
0524 |
1F |
RAR |
||
0525 |
67 |
MOV H, A |
||
0526 |
7D |
MOV A, L |
||
0527 |
1F |
RAR |
||
0528 |
6F |
MOV L, A |
||
Проверка конца цикла |
||||
0529 |
05 |
DCR B |
||
052A |
C21C05 |
JNZ LOOP |
зацикливание |
|
0000 |
END |
Подпрограмма умножения целых двоичных чисел без знака формата 8*8=16. Вариант Б. Метод умножения: 8 циклов сдвигов множителя и текущей суммы частичных произведений влево. Входные параметры: (С) – множитель, (Е) – множимое. Выходной параметр: (H, L) – произведение. Используются все регистры, сохраняется (С), (Е). Оценка: длина – 22 байта, время – не более 423 тактов. |
|||||
Адрес |
Машинный код |
Метка |
Команда |
Комментарий |
|
Обнуление текущей суммы ЧП |
|||||
0550 |
AF |
XRA A |
|||
0551 |
67 |
MOV H, A |
|||
0552 |
6F |
MOV L, A |
|||
0553 |
57 |
MOV D, A |
(D) = 0 |
||
Проверка сомножителей на 0 |
|||||
0554 |
81 |
ADD C |
|||
0555 |
C8 |
RZ |
если множитель = 0 |
||
0556 |
AF |
XRA A |
|||
0557 |
83 |
ADD E |
|||
0558 |
C8 |
RZ |
если множимое = 0 |
||
0559 |
61 |
MOV H, C |
(H) – множитель |
||
055А |
0608 |
MVI B, 8 |
счётчик циклов |
||
Сдвиг множителя и текущей суммы ЧП влево |
|||||
055C |
29 |
LOOP: |
DAD H |
||
055D |
D26105 |
JNC M |
если разряд множителя = 0 |
||
Сложение множимого с текущей суммой ЧП |
|||||
0560 |
19 |
DAD D |
|||
Проверка конца цикла |
|||||
0561 |
05 |
M: |
DCR B |
||
0562 |
C25C05 |
JNZ LOOP |
зацикливание |
||
0000 |
END |
||||
Подпрограмма умножения целых двоичных чисел без знака формата 8*8=16. Вариант B. Метод умножения: 8 (или менее) циклов сдвигов множителя вправо (с контролем остатка на 0), а множимого влево. Входные параметры: (С) – множитель, (Е) – множимое. Выходной параметр: (H, L) – произведение. Используются все регистры, кроме В; сохраняется (С). Оценка: длина – 22 байта, время – не более 499 тактов. |
||||||||
Адрес |
Машинный код |
Метка |
Команда |
Комментарий |
||||
Обнуление текущей суммы ЧП |
||||||||
0590 |
AF |
XRA A |
||||||
0591 |
67 |
MOV H, A |
||||||
0592 |
6F |
MOV L, A |
||||||
0593 |
57 |
MOV D, A |
(D) = 0 |
|||||
Проверка сомножителей на 0 |
||||||||
0594 |
83 |
ADD E |
||||||
0595 |
C8 |
RZ |
если множимое = 0 |
|||||
0596 |
AF |
XRA A |
||||||
0597 |
81 |
ADD C |
(А) - множитель |
|||||
0598 |
C8 |
RZ |
если множитель = 0 |
|||||
Сдвиг множителя вправо |
||||||||
0599 |
1F |
LOOP: |
RAR |
|||||
059A |
D29E05 |
JNC M |
если разряд множителя = 0 |
|||||
Сложение множимого с текущей суммой ЧП |
||||||||
059D |
19 |
DAD D |
||||||
Сдвиг множимого влево |
||||||||
059E |
EB |
M: |
XCHG |
|||||
059F |
29 |
DAD H |
||||||
0590 |
EB |
XCHG |
||||||
Проверка конца цикла |
||||||||
05A1 |
B7 |
ORA A |
||||||
05A2 |
C29905 |
JNZ LOOP |
зацикливание |
|||||
0000 |
END |
|||||||
Подпрограмма умножения целых двоичных чисел без знака формата 16*16=32. Метод умножения: 16 циклов сдвигов множителя и суммы частичных произведений влево. Входные параметры: (В, С) – множимое, (D, Е) – множитель. Выходные параметры: (D, E, H, L) – произведение. Используются все регистры, сохраняется (B, С). Оценка: длина – 40 байт, время – не более 1711 тактов. |
|||||||||||
Адрес |
Машинный код |
Метка |
Команда |
Комментарий |
|||||||
Обнуление текущей суммы ЧП |
|||||||||||
0600 |
AF |
XRA A |
|||||||||
0601 |
67 |
MOV H, A |
|||||||||
0602 |
6F |
MOV L, A |
|||||||||
Проверка сомножителей на 0 |
|||||||||||
0603 |
B2 |
ORA D |
|||||||||
0604 |
B3 |
ORA E |
|||||||||
0605 |
C8 |
RZ |
если множитель = 0 |
||||||||
0606 |
AF |
XRA A |
|||||||||
0607 |
B0 |
ORA B |
|||||||||
0608 |
B1 |
ORA C |
|||||||||
0609 |
C20F06 |
JNZ M |
если множимое не 0 |
||||||||
060C |
57 |
MOV D, A |
обнуление множителя |
||||||||
060D |
5F |
MOV E, A |
|||||||||
060E |
C9 |
RET |
|||||||||
060F |
AF |
M: |
XRA A |
счётчик циклов = 0 |
|||||||
Сдвиг множителя влево |
|||||||||||
0610 |
EB |
LOOP: |
XCHG |
||||||||
0611 |
29 |
DAD H |
|||||||||
0612 |
EB |
XCHG |
|||||||||
0613 |
1F |
RAR |
сохранение переноса в (А) |
||||||||
Сдвиг суммы ЧП влево |
|||||||||||
0614 |
29 |
DAD H |
|||||||||
0615 |
D21906 |
JNC M1 |
|||||||||
0618 |
13 |
INX D |
учёт переноса от сдвига |
||||||||
Анализ сдвинутого разряда множителя |
|||||||||||
0619 |
17 |
M1: |
RAL |
восстановление переноса |
|||||||
061А |
D22206 |
JNC M2 |
если разряд множителя = 0 |
||||||||
Сложение множимого с текущей суммой ЧП |
|||||||||||
061D |
09 |
DAD B |
|||||||||
061E |
D22206 |
JNC M2 |
|||||||||
0621 |
13 |
INX D |
учёт переноса от сложения |
||||||||
Проверка конца цикла по переполнению (А) |
|||||||||||
0622 |
C610 |
М2: |
ADI 16 |
||||||||
0624 |
D21006 |
JNC LOOP |
зацикливание |
||||||||
0000 |
END |
||||||||||
Подпрограмма деления целых двоичных чисел без знака формата 16:8=(8,8). Метод деления без восстановления остатка. Входные параметры: (H, L) – делимое, (С) – делитель. Выходные параметры: (H) – остаток, (L) – частное, СY=0 – признак переполнения частного. Используются все регистры, кроме (D, E); сохраняется (С). Оценка: длина – 58 байт, время – не более 850 тактов. |
|||||||||||
Адрес |
Машинный код |
Метка |
Команда |
Комментарий |
|||||||
Проверка частного на переполнение: частное > 8 бит? |
|||||||||||
0А20 |
7C |
MOVA, H |
|||||||||
0А21 |
91 |
SUB C |
|||||||||
0А22 |
D0 |
RNC |
если переполнение, CY=0 |
||||||||
0А23 |
0608 |
MVI B, 8 |
счётчик циклов |
||||||||
0А25 |
37 |
STC |
CY=1 – признак остатка = или > 0 |
||||||||
Проверка знака остатка: «+», если CY=1; «-», если CY=0 |
|||||||||||
0А26 |
D23B0A |
LOOP: |
JNC M1 |
если остаток < 0 |
|||||||
0А29 |
29 |
DAD H |
сдвиг влево остатка |
||||||||
0А2А |
7C |
MOV A, H |
|||||||||
0А2В |
DA36OA |
JC M2 |
если переполнение остатка |
||||||||
Вычитание делителя из остатка |
|||||||||||
0А2E |
91 |
SUB C |
|||||||||
0А2F |
67 |
MOV H, A |
|||||||||
0А30 |
D24A0A |
M6: |
JNC M3 |
если результат = или > 0 |
|||||||
0А33 |
C34F0A |
JMP M4 |
результат < 0 |
||||||||
Вычитание делителя из остатка |
|||||||||||
0А36 |
91 |
M2: |
SUB C |
||||||||
0А37 |
67 |
MOV H, A |
|||||||||
0А38 |
C34A0A |
JMP M3 |
результат = или > 0 |
||||||||
Сдвиг влево остатка и частного в (H, L) при остатке < 0 |
|||||||||||
0А3B |
29 |
M1: |
DAD H |
||||||||
0А3C |
7C |
MOV A, H |
|||||||||
0А3D |
DA450A |
JC M5 |
если переполнение остатка |
||||||||
Сложение делителя с отрицательным остатком |
|||||||||||
0А40 |
81 |
ADD C |
|||||||||
0А41 |
67 |
MOV H, A |
|||||||||
0А42 |
C3300A |
JMP M6 |
|||||||||
Сложение делителя с отрицательным остатком |
|||||||||||
0А45 |
81 |
M5: |
ADD C |
||||||||
0А46 |
67 |
MOV H, A |
|||||||||
0А47 |
D24F0A |
JNC M4 |
если сумма < 0 |
||||||||
Установка разряда частного в «1» |
|||||||||||
0А4A |
23 |
M3: |
INX H |
||||||||
0А4B |
37 |
STC |
CY=1 – положительный остаток |
||||||||
0А4C |
C3500A |
JMP M7 |
|||||||||
0А4F |
AF |
M4: |
XRA A |
CY=0 – отрицательный остаток |
|||||||
Проверка конца цикла |
|||||||||||
0А50 |
05 |
M7: |
DCR B |
||||||||
0А51 |
C2260A |
JNZ LOOP |
зацикливание |
||||||||
0А54 |
D8 |
RC |
если положительный остаток |
||||||||
Восстановление остатка |
|||||||||||
0А55 |
7C |
MOV A, H |
|||||||||
0А56 |
81 |
ADD C |
|||||||||
0А57 |
67 |
MOV H, A |
|||||||||
0А58 |
37 |
STC |
CY=1 |
||||||||
0000 |
END |
||||||||||
Подпрограмма деления целых двоичных чисел без знака формата 16:8=(16,8). Входные параметры: (H, L) – делимое, (С) – делитель. Выходные параметры: (D, E) – частное, (H) – остаток, СY=1 – признак нулевого делителя или превышения величины делителя над делимым. Используются все регистры, глубина стека - 2. Оценка: длина – 88 байт, время – не более 1831 тактов. |
||||||
Адрес |
Машинный код |
Метка |
Команда |
Комментарий |
||
Проверка: делимое > делителя? |
||||||
0BC0 |
AF |
XRA A |
||||
0BC1 |
84 |
ADD H |
(А) – СТБ делимого |
|||
0BC2 |
C2C80B |
JNZ M1 |
если СТБ > 0 |
|||
0BC5 |
85 |
ADD L |
(А) – МЛБ делимого |
|||
0BC6 |
B9 |
CMP C |
||||
0BC7 |
D8 |
RC |
если делимое < делителя |
|||
Проверка делителя на 0 |
||||||
0BC8 |
AF |
M1: |
XRA A |
|||
0BC9 |
81 |
ADD C |
(А) - делитель |
|||
0BCA |
37 |
STC |
СY=1 |
|||
0BCB |
C8 |
RZ |
если делитель = 0 |
|||
0BCC |
0608 |
MVI B, 8 |
счётчик циклов |
|||
Нормализация делителя: устранение левых нулей |
||||||
0BCE |
3F |
CMC |
СY=0 |
|||
0BCF |
17 |
LOOP1: |
RAL |
|||
0BD0 |
04 |
INR B |
увеличение счётчика |
|||
0BD1 |
D2CF0B |
JNC M1 |
если выдвинутый разряд = 0 |
|||
0BD4 |
1F |
RAR |
||||
0BD5 |
4F |
MOV C, A |
(С) – нормализованный делитель |
|||
0BD6 |
05 |
DCR B |
уменьшение счётчика |
|||
Сохранение величины сдвигов делителя |
||||||
0BD7 |
78 |
MOV A, B |
||||
0BD8 |
DE08 |
SBI 8 |
||||
0BDA |
F5 |
PUSH PSW |
||||
Нормализация делимого: устранение левых нулей |
||||||
0BDB |
AF |
LOOP2: |
XRA A |
|||
0BDC |
84 |
ADD H |
(А) – СТБ делимого |
|||
0BDD |
FAE50B |
JM M2 |
если старший разряд = 1 |
|||
0BE0 |
29 |
DAD H |
сдвиг делимого влево |
|||
0BE1 |
05 |
DCR B |
уменьшение счётчика |
|||
0BE2 |
C3DB0B |
JMP LOOP2 |
зацикливание |
|||
0BE5 |
110000 |
M2: |
LXI D, 0 |
обнуление частного |
||
Вычитание делителя из делимого ((А) – СТБ делимого) |
||||||
0BE8 |
91 |
SUB C |
||||
0BE9 |
13 |
INX D |
установка разряда частного = 1 |
|||
0BEA |
D2EF0B |
JNC M3 |
если разность > 0 |
|||
0BED |
1B |
DCX D |
сброс разряда частного = 0 |
|||
0BEE |
81 |
ADD C |
восстановление делимого |
|||
0BEF |
67 |
M3: |
MOV H, A |
|||
Проверка счётчика циклов на 0 |
||||||
0BF0 |
AF |
XRA A |
||||
0BF1 |
80 |
ADD B |
||||
0BF2 |
CA0D0C |
JZ M7 |
если счётчик = 0 |
|||
Сдвиг влево частного (D, E) и остатка (H, L) |
||||||
0BF5 |
EB |
LOOP: |
XCHG |
|||
0BF6 |
29 |
DAD H |
||||
0BF7 |
EB |
XCHG |
||||
0BF8 |
29 |
DAD H |
||||
0BF9 |
7C |
MOV A, H |
(А) – СТБ остатка |
|||
0BFА |
DA060C |
JC M4 |
если переполнение остатка |
|||
Вычитание делителя из остатка |
||||||
0BFD |
91 |
SUB C |
||||
0BFE |
D2070C |
JNC M5 |
если разность > 0 |
|||
Разность < 0, восстановление остатка |
||||||
0C01 |
81 |
ADD C |
||||
0C02 |
67 |
MOV H, A |
||||
0C03 |
C3090C |
JMP M6 |
||||
Переполнение остатка, установка разряда частного = 1 |
||||||
0C06 |
91 |
M4: |
SUB C |
вычитание делителя |
||
0C07 |
67 |
M5: |
MOV H, A |
|||
0C08 |
13 |
INX D |
разряд частного = 1 |
|||
Проверка конца цикла |
||||||
0C09 |
05 |
M6: |
DCR B |
|||
0C0A |
C2F50B |
JNZ LOOP |
зацикливание |
|||
Коррекция остатка: сдвиг вправо |
||||||
0C0D |
F1 |
M7: |
POP PSW |
(А) – счётчик сдвигов |
||
0C0E |
C8 |
RZ |
если счётчик = 0 (CY=0) |
|||
0C0F |
4F |
MOV C, A |
||||
0C10 |
AF |
XRA A |
||||
0C11 |
84 |
ADD H |
(А) - остаток |
|||
0C12 |
1F |
LOOP3: |
RAR |
|||
0C13 |
0D |
DCR C |
||||
0C14 |
C2120C |
JNZ LOOP3 |
зацикливание |
|||
0C17 |
67 |
MOV H, A |
||||
0000 |
END |
|||||
Подпрограмма деления целых двоичных чисел без знака формата 16:16=(16,16) с целым частным. Метод деления с восстановлением остатка. Входные параметры: (H, L) – делимое, (В, С) – делитель. Выходные параметры: (D, E) – частное, (H, L) – остаток, СY=0 – признак |
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.