Программа №8
Деление двух целых беззнаковых чисел
адрес |
машинный код |
метка |
мнемокод |
t |
примечание |
загрузка операндов |
|||||
0800 |
0E YY |
|
MVI C, YY |
7 |
(C)(YY) (делитель) |
0802 |
21 XXXX |
|
LXI H XXXX |
10 |
(H,L)(XXXX) (делимое) |
0805 |
CD00009 |
|
CALL D16 |
17 |
вызов программы деления |
0808 |
FF |
|
RST7 |
11 |
переход на связь с пультом |
проверка частного на переполнение Z>8 |
|||||
0900 |
7C |
D16 |
MOV A,H |
5 |
(A)(H) |
0901 |
91 |
|
SUB C |
4 |
(A)(A)-(C) |
0902 |
D0 |
|
RNC |
11 |
возврат если переполнение CY=0 |
0903 |
0608 |
|
MVI B,08 |
7 |
(B)(08) |
сдвиг влево остатка и частного |
|||||
0905 |
29 |
M1 |
DAD H |
10 |
(H,L)(H,L)+(H,L) |
0906 |
7C |
|
MOV A,H |
5 |
(A)(H) |
0907 |
DA1309 |
|
JC 0913 |
10 |
переход если CY=1 |
вычитание делителя из остатка |
|||||
090A |
91 |
|
SUB C |
4 |
(A)(A)-(C) |
090B |
D21409 |
|
JNC 0914 |
10 |
переход если СY=0 |
восстановление остатка если Q-Y<0 |
|||||
090E |
81 |
|
ADD C |
4 |
(A)(A)+(C) |
090F |
67 |
|
MOV H,A |
5 |
(H)(A) |
0910 |
C31609 |
|
JMP 0916 |
10 |
переход безусловный |
переполнение остатка разряд частного равен 1 |
|||||
0913 |
91 |
M2 |
SUB C |
4 |
(A)(A)-(C) |
0914 |
67 |
M3 |
MOV H,A |
5 |
(H)(A) |
0915 |
23 |
|
INX H |
5 |
(H,L)(H,L)+1 |
проверка конца цикла |
|||||
0916 |
05 |
M4 |
DCR B |
5 |
(B)(B)-1 |
0917 |
C20509 |
|
JNZ 0905 |
10 |
переход если Z=0 |
091A |
37 |
|
STC |
4 |
(CY)1 |
091B |
C9 |
|
RET |
11 |
возврат из подпрограммы безусловный |
Время выполнения программы:
t=7+10+17+5+4+11+7+(10+5+10+4+10+4+5+10+4+5+5+5+10)*16+4+11+11=1479T
t=1479/2=739,5мкс
