|
Подпрограмма умножения целых двоичных чисел без знака формата 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).
Ссылка на скачивание - внизу страницы.