Введение в микропроцессоры. Конспект лекций по курсу "Микропроцессорные устройства", страница 22

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