2.2 Блок схема алгоритма решения задачи.
Начало

(HL)
Addr1
1

M(Addr1)
количе-
2
ство чисел

M(Addr2)
3
M(Addr3)
4






(HL)
0000
5
(BC)
начальный
ад- 6
рес массива чисел
(A)
младший
байт 7
слагаемого
Сдвиг аккумулятора 8
вправо без переноса
(A)
A^80
9
(E)
A
10 10
1
4


2
(BC)
BC+1
11
(A)
старший
байт 12
слагаемого
Сдвиг аккумулятора 13
право с переносом
(A)
(A)˅(E)


(D)
A
14 10
S=0

1
(BC)
BC+1
11
(A)
старший
байт 12
слагаемого
Сдвиг аккумулятора 13
право с переносом
(A)
(A)˅(E)


(D)
A
14 10
S=0
4

Да
Нет

(A)
M(Addr3)
15 15
10
(A)
A+FF
16
10
M(Addr3)
A
17
10
(BC)
BC-1
18


2
4

(A)
младший
байт 19
слагаемого
2
Сдвиг аккумулятора 20
право с переносом
(E)
(A)



(HL)
HL+DE
21
C=0
(A)
M(Addr2)
22 15
10
(A)
A+1
23 10
4

Да
Нет
M(Addr2)
A
24
10


(A)
M(Addr1)
25 10
(A)
A-1
26 10
3
4
3
4

Z=1






M(Addr1)
27
10
(BC)
BC+2
28

(A)
M(Addr2)
29
10
(D)
A30
10
(A)
M(Addr3)31
10
(A)
A+D
32
10
M(Addr4)
L
33
M(Addr5)
H
Конец
M(Addr1) – ячейка памяти 0810h, M(Addr2) – ячейка памяти 0811h, M(Addr3) – ячейка памяти 0812h, M(Addr4) – ячейка памяти 0900h, M(Addr5) – ячейка памяти 0901h. Программа будет храниться в адресном пространстве, начиная с ячейки 0813h.
2.3 Описание программы на языке Ассемблера и в машинных кодах.
Описание программы представлено в таблице 1:
|
Метка |
Адрес |
Данные |
Ассемблер |
Мнемоника |
Комментарий |
|
M1
M2
|
0813 |
21 |
LXI H, 0810 |
(HL) |
Загрузить в регистровую пару HL адрес ячейки памяти 0810 |
|
0814 |
10 | ||||
|
0815 |
08 | ||||
|
0816 |
36 |
MVI M, 05 |
M(HL) |
Записать количество слагаемых в ячейку памяти, адрес которой хранится в регистровой паре HL | |
|
0817 |
05 | ||||
|
0818 |
23 |
INX H |
(HL) |
Инкрементирование регистровой пары HL | |
|
0819 |
36 |
MVI M, 00 |
M(HL) |
Обнулить ячейку памяти | |
|
081A |
00 | ||||
|
081B |
23 |
INX H |
(HL) |
Инкрементирование регистровой пары HL | |
|
081C |
36 |
MVI M, 00 |
M(HL) |
Обнулить ячейку памяти | |
|
081D |
00 | ||||
|
081E |
21 |
LXI H, 0000 |
(HL)
|
Обнулить промежуточную сумму в регистровой паре HL | |
|
081F |
00 | ||||
|
0820 |
00 | ||||
|
0821 |
01 |
LXI B,0800 |
(BC) |
Загрузить в регистровую пару BC начальный адрес массива данных | |
|
0822 |
00 | ||||
|
0823 |
08 | ||||
|
0824 |
0A |
LDAX B |
(A) |
Загрузить в аккумулятор младший байт, адрес которого хранится в регистровой паре BC | |
|
0825 |
0F |
RRC |
|
Сдвиг аккумулятора вправо без переноса | |
|
0826 |
E6 |
ANI 80 |
(A) |
Операция логическое И аккумулятора с данными 80h | |
|
0827 |
80 | ||||
|
0828 |
5F |
MOV E,A |
(E) |
Переслать маску из регистра А в регистр E | |
|
0829 |
37 |
STC |
C=1 |
Установить бит переноса в значение 1 | |
|
082A |
3F |
CMC |
C= |
Инвертировать значение бита переноса | |
|
082B |
03 |
INX B |
(BC) |
Инкрементирование регистровой пары BC | |
|
082C |
0A |
LDAX B |
(A) |
Загрузить в аккумулятор старший байт, адрес которого хранится в регистровой паре BC | |
|
082D |
1F |
RAR |
|
Cдвиг аккумулятора вправо с переносом | |
|
082E |
B3 |
ORA E |
(A) |
Операция логическое ИЛИ аккумулятора и регистра E | |
|
082F |
57 |
MOV D,A |
(D) |
Переслать старший байт из регистра А в регистр D | |
|
0830 |
C6 |
ADI 00 |
(A) |
Прибавить к содержимому аккумулятора 00h | |
|
0831 |
00 | ||||
|
0832 |
F2 |
JP M2 |
JMP if S=0 |
Переход на метку M2, если бит знака S равен нулю | |
|
0833 |
3D | ||||
|
0834 |
08 | ||||
|
0835 |
3A |
LDA 0812 |
(A) |
Загрузить в аккумулятор содержимое ячейки памяти 0812 | |
|
0836 |
12 | ||||
|
0837 |
08 | ||||
|
0838 |
C6 |
ADI FF |
(A) |
Прибавить к содержимому аккумулятора FFh | |
|
0839 |
FF | ||||
|
083A |
32 |
STA 0812 |
M(0812) |
Записать содержимое аккумулятора в ячейку памяти 0812 | |
|
083B |
12 | ||||
|
083C |
08 | ||||
|
083D |
0B |
DCX B |
(BC) |
Декрементирование регистровой пары BC | |
|
083E |
0A |
LDAX B |
(A) |
Загрузить в аккумулятор младший байт, адрес которого хранится в регистровой паре BC | |
|
083F |
1F |
RAR |
|
Cдвиг аккумулятора вправо с переносом | |
|
0840 |
5F |
MOV E,A |
(E) |
Переслать содержимое регистра А в регистр E | |
|
0841 |
19 |
DAD D |
(HL) |
Сложить регистровые пары HL и DE | |
|
0842 |
D2 |
JNC M3 |
JMP if C=0 |
Переход на метку M3, если бит переноса С равен нулю | |
|
0843 |
4C | ||||
|
0844 |
08 | ||||
|
0845 |
3A |
LDA 0811 |
(A) |
Загрузить в аккумулятор содержимое ячейки памяти 0811 | |
|
0846 |
11 | ||||
|
0847 |
08 | ||||
|
0848 |
3C |
INR A |
(A) |
| |
|
0849 |
32 |
STA 0811 |
M(0811) |
Записать содержимое аккумулятора в ячейку памяти 0811 | |
|
084A |
11 | ||||
|
084B |
08 | ||||
|
M3 |
084C |
3A |
LDA 0810 |
(A)
|
Загрузить в аккумулятор количество слагаемых |
|
084D |
10 | ||||
|
084E |
08 | ||||
|
084F |
3D |
DCR A |
(A) |
Декрементирование содержимого аккумулятора | |
|
0850 |
CA |
JZ M4 |
JMP if Z=1 |
Переход на метку M4, если бит ноля Z равен единице | |
|
0851 |
5B | ||||
|
0852 |
08 | ||||
|
0853 |
32 |
STA 0810 |
M(0810) |
Записать содержимое аккумулятора в ячейку памяти 0810 | |
|
0854 |
10 | ||||
|
0855 |
08 | ||||
|
0856 |
03 |
INX B |
(BC) |
Инкрементирование регистровой пары BC | |
|
0857 |
03 |
INX B |
(BC) |
Инкрементирование регистровой пары BC | |
|
0858 |
C3 |
JMP M1 |
|
Безусловный переход на метку M1 | |
|
0859 |
24 | ||||
|
085A |
08 | ||||
|
M4 |
085B |
3A |
LDA 0811 |
(A)
|
Загрузить в аккумулятор переносы |
|
085C |
11 | ||||
|
085D |
08 | ||||
|
085E |
57 |
MOV D,A |
(D) |
Переслать содержимое регистра А в регистр D | |
|
085F |
3A |
LDA 0812 |
(A)
|
Загрузить в аккумулятор знак | |
|
0860 |
12 | ||||
|
0861 |
08 | ||||
|
0862 |
82 |
ADD D |
(A) |
Сложить содержимое регистров A и D | |
|
0863 |
22 |
SHLD 0900 |
M(0900) M(0901) |
Записать содержимое регистровой пары HL в ячейки памяти 0900h и 0901h | |
|
0864 |
00 | ||||
|
0865 |
09 | ||||
|
0866 |
FF |
RST 7 |
|
Остановка программы |
Вывод
Основной сложностью, при составлении программы, было составление цикла представления чисел к обычному виду, то есть когда знак находится в седьмом бите старшего байта. В связи с этим были задействованы все регистры, и для учета знака и переноса из старшего бита суммы пришлось использовать ячейки памяти: в одной учитывались переносы, в другой – знак.
Программа может посчитать не только сумму 5 чисел, а например 256 двухбайтных чисел. Для этого следует изменить проверку на последний адрес ячейки памяти массива чисел.
Ответ выводится в ячейки памяти 0900h – 0901h, причем младший байт записывается в ячейку 0900h, а старший в ячейку 0901h. Третий байт суммы хранится в аккумуляторе.

0810
05
HL+1
00
HL+1
00
0000
0800
(A)^10000000
(A)
BC+1
(A)˅(E)
(A)
(A)+00
(A)+FF
(A)
(BC)-1
(A)
(HL)+(DE)
(A)+1
(A)
(A)-1
(A)
(BC)+1
(BC)+1
(A)

(L)
(H)