Size |
EQU |
9 |
; Определяем символическое имя Size |
ORG |
8000h |
||
Data: |
DW |
111h, 222h, 333h, 444h, 555h, 666h, 777h, 888h, 999h |
|
Delta: |
DW |
111h |
|
Count: |
DW |
Size |
; Переменная Count хранит число необрабо- ; танных элементов массива Data |
Start: |
; Инициализация цикла уменьшения
LHLD |
Delta |
(BC):= [Delta] |
|
MOV |
C, L |
||
MOV |
B, H |
||
LXI |
D, Data |
; (DE) указывает на первый элемент Data |
; Тело цикла уменьшения
DoSubst: |
LHLD |
Count |
; (HL):= число оставшихся элементов массива |
DCX |
H |
; Декрементируем число оставшихся элемен- ; тов массива |
|
JAS |
Exit |
; Есть еще не обработанные элементы массива? |
; Да есть, поэтому производим уменьшение
SHLD |
Count |
; Сохраняем число оставшихся элементов мас- ; сива |
||
LHLX |
; (HL):= [Datai] |
|||
DSUB |
; (HL):= [Datai] - [Delta] |
|||
SHLX |
; Data[i]:= [Datai] - [Delta] |
|||
INX |
D |
; Переводим указатель на следующий элемент |
||
INX |
D |
|||
JMP |
DoSubst |
|||
Exit: |
||||
RST |
4 |
|||
END |
Start |
в) Определение суммы и среднего значения элементов массива целых чисел
Задание: определить сумму и среднее значение элементов целочисленного массива Data размерности Size = 8. Сумму записать в переменную Sum, а среднее значение - в переменную Aver. Все переменные располагаются в смежных областях адресного пространства памяти МП, начиная с адреса 8000h. Предполагаем, что указатель стека уже инициализирован.
Метод решения: для вычисления суммы обнулим регистровую пару ВС, к которой затем в цикле подсуммируем все элементы массива Data. Результат запишем в память по адресу переменной Sum. Для вычисления среднего значения полученный результат необходимо разделить на Size. Учитывая тот факт, что значение Size равно двойке в целой степени (8 равно два в третьей степени), то операцию деления можно заменить операцией сдвига вправо на три разряда.
Size |
EQU |
8 |
|
ORG |
8000h |
||
Data: |
DW |
111h, 222h, 333h, 444h, 555h, 666h, 777h, 888h |
|
Sum: |
DS |
2 |
|
Aver: |
DS |
2 |
|
Start: |
; Инициализация цикла суммирования
LXI |
B, Size |
; В вершину стека записываем величину Size |
|
PUSH |
B |
||
LXI |
B, 0 |
; Summa:= 0 |
|
LXI |
D, Data |
; (DE) указывает на первый элемент Data |
; Тело цикла суммирования
DoSum: |
POP |
H |
; (HL):= число оставшихся элементов массива |
DCX |
H |
; Декрементируем число оставшихся элемен- ; тов массива |
|
JAS |
Shifts |
; Есть еще не обработанные элементы массива? |
; Да есть, поэтому производим подсуммирование
PUSH |
H |
; Сохраняем число оставшихся элементов мас- ; сива в стеке |
|
LHLX |
; (HL):= [Datai] |
||
DAD |
B |
; (HL):= Summa + [Datai] |
|
MOV |
C, L |
; Summa:= Summa + [Datai] |
|
MOV |
B, H |
||
INX |
D |
; Переводим указатель на следующий элемент |
|
INX |
D |
||
JMP |
DoSum |
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.