|
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).
Ссылка на скачивание - внизу страницы.