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)0810 |
Загрузить в регистровую пару HL адрес ячейки памяти 0810 |
0814 |
10 | ||||
0815 |
08 | ||||
0816 |
36 |
MVI M, 05 |
M(HL)05 |
Записать количество слагаемых в ячейку памяти, адрес которой хранится в регистровой паре HL | |
0817 |
05 | ||||
0818 |
23 |
INX H |
(HL)HL+1 |
Инкрементирование регистровой пары HL | |
0819 |
36 |
MVI M, 00 |
M(HL)00 |
Обнулить ячейку памяти | |
081A |
00 | ||||
081B |
23 |
INX H |
(HL)HL+1 |
Инкрементирование регистровой пары HL | |
081C |
36 |
MVI M, 00 |
M(HL)00 |
Обнулить ячейку памяти | |
081D |
00 | ||||
081E |
21 |
LXI H, 0000 |
(HL)0000
|
Обнулить промежуточную сумму в регистровой паре HL | |
081F |
00 | ||||
0820 |
00 | ||||
0821 |
01 |
LXI B,0800 |
(BC)0800 |
Загрузить в регистровую пару BC начальный адрес массива данных | |
0822 |
00 | ||||
0823 |
08 | ||||
0824 |
0A |
LDAX B |
(A) |
Загрузить в аккумулятор младший байт, адрес которого хранится в регистровой паре BC | |
0825 |
0F |
RRC |
|
Сдвиг аккумулятора вправо без переноса | |
0826 |
E6 |
ANI 80 |
(A)(A)^10000000 |
Операция логическое И аккумулятора с данными 80h | |
0827 |
80 | ||||
0828 |
5F |
MOV E,A |
(E)(A) |
Переслать маску из регистра А в регистр E | |
0829 |
37 |
STC |
C=1 |
Установить бит переноса в значение 1 | |
082A |
3F |
CMC |
C= |
Инвертировать значение бита переноса | |
082B |
03 |
INX B |
(BC)BC+1 |
Инкрементирование регистровой пары BC | |
082C |
0A |
LDAX B |
(A) |
Загрузить в аккумулятор старший байт, адрес которого хранится в регистровой паре BC | |
082D |
1F |
RAR |
|
Cдвиг аккумулятора вправо с переносом | |
082E |
B3 |
ORA E |
(A)(A)˅(E) |
Операция логическое ИЛИ аккумулятора и регистра E | |
082F |
57 |
MOV D,A |
(D)(A) |
Переслать старший байт из регистра А в регистр D | |
0830 |
C6 |
ADI 00 |
(A)(A)+00 |
Прибавить к содержимому аккумулятора 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)(A)+FF |
Прибавить к содержимому аккумулятора FFh | |
0839 |
FF | ||||
083A |
32 |
STA 0812 |
M(0812)(A) |
Записать содержимое аккумулятора в ячейку памяти 0812 | |
083B |
12 | ||||
083C |
08 | ||||
083D |
0B |
DCX B |
(BC)(BC)-1 |
Декрементирование регистровой пары BC | |
083E |
0A |
LDAX B |
(A) |
Загрузить в аккумулятор младший байт, адрес которого хранится в регистровой паре BC | |
083F |
1F |
RAR |
|
Cдвиг аккумулятора вправо с переносом | |
0840 |
5F |
MOV E,A |
(E)(A) |
Переслать содержимое регистра А в регистр E | |
0841 |
19 |
DAD D |
(HL)(HL)+(DE) |
Сложить регистровые пары 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)(A)+1 |
| |
0849 |
32 |
STA 0811 |
M(0811)(A) |
Записать содержимое аккумулятора в ячейку памяти 0811 | |
084A |
11 | ||||
084B |
08 | ||||
M3 |
084C |
3A |
LDA 0810 |
(A)
|
Загрузить в аккумулятор количество слагаемых |
084D |
10 | ||||
084E |
08 | ||||
084F |
3D |
DCR A |
(A)(A)-1 |
Декрементирование содержимого аккумулятора | |
0850 |
CA |
JZ M4 |
JMP if Z=1 |
Переход на метку M4, если бит ноля Z равен единице | |
0851 |
5B | ||||
0852 |
08 | ||||
0853 |
32 |
STA 0810 |
M(0810)(A) |
Записать содержимое аккумулятора в ячейку памяти 0810 | |
0854 |
10 | ||||
0855 |
08 | ||||
0856 |
03 |
INX B |
(BC)(BC)+1 |
Инкрементирование регистровой пары BC | |
0857 |
03 |
INX B |
(BC)(BC)+1 |
Инкрементирование регистровой пары 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)(A) |
Переслать содержимое регистра А в регистр D | |
085F |
3A |
LDA 0812 |
(A)
|
Загрузить в аккумулятор знак | |
0860 |
12 | ||||
0861 |
08 | ||||
0862 |
82 |
ADD D |
(A) |
Сложить содержимое регистров A и D | |
0863 |
22 |
SHLD 0900 |
M(0900)(L) M(0901)(H) |
Записать содержимое регистровой пары HL в ячейки памяти 0900h и 0901h | |
0864 |
00 | ||||
0865 |
09 | ||||
0866 |
FF |
RST 7 |
|
Остановка программы |
Вывод
Основной сложностью, при составлении программы, было составление цикла представления чисел к обычному виду, то есть когда знак находится в седьмом бите старшего байта. В связи с этим были задействованы все регистры, и для учета знака и переноса из старшего бита суммы пришлось использовать ячейки памяти: в одной учитывались переносы, в другой – знак.
Программа может посчитать не только сумму 5 чисел, а например 256 двухбайтных чисел. Для этого следует изменить проверку на последний адрес ячейки памяти массива чисел.
Ответ выводится в ячейки памяти 0900h – 0901h, причем младший байт записывается в ячейку 0900h, а старший в ячейку 0901h. Третий байт суммы хранится в аккумуляторе.