SUMM: LXI H, 8100 ;задание адреса первого элемента (HL:=8100H)
MVI D, 40 ;задание кол-ва элементов
XRA A ;обнуление аккумулятора
MVI C, 00 ;обнуление регистра C (счетчик переполнений)
X1: ADDM ;суммирование (A:=A+M(HL))
JNC X2 ;перейти на Х2 если нет переполнения
INR C ;произошло переполнение → прибавить 1 к старшему байту
результата суммирования
X2: INX H ;присвоить HL адрес следующей ячейки (HL:=HL+1)
DCR D ;уменьшение счётчика кол-ва элементов на 1 (D:=D-1)
JNZ X1 ;если элемент не последний - продолжить суммирование
MOVB, A ;пересылка младшего байта результата суммирования в регистр В
Сумма 64х элементов находится в паре BC
ACP: MVID, 06 ;задаём кол-во сдвигов (6 сдвигов – деление на 64)
MOVA, C ;пересылаем старший байт в аккумулятор (C→A)
RAR ;циклический сдвиг вправо через ТС
MOVC, A ;возврат в C старшего байта
MOVA, B ;пересылаем младший байт в аккумулятор (B→A)
RAR ;циклический сдвиг вправо через ТС
MOVB, A ;возврат в B младшего байта
ORAA ;обнуление флага переполнения (ТС:=0)
DCR D ;уменьшение счётчика кол-ва сдвигов на 1 (D:=D-1)
JNZ ACP ;если сдвиг не последний – продолжить
Среднее значение находится в регистре В
MOVA, B ;пересылаем среднее значение в аккумулятор
ADDB ;получаем в аккумуляторе значение 2АСР
JNC X3 ;перейти на Х3 если нет переполнения
INR C ;произошло переполнение → прибавить 1 к старшему байту
значения 2АСР
X3: MOVB, A ;пересылка 2АСР в регистр В
Значение 2АСР находится в паре ВС
AMAX:LXI H, 8100 ;задание адреса первого элемента (HL:=8100H)
MVI D, 40 ;задание кол-ва элементов
MOVA, M ;будем считать первый элемент максимальным (A:=M(HL))
X4: CMPM ;сравниваем максимальный элемент с текущим (A-М(HL))
JPX5 ;при S=0 (A-M(HL)≥0 → A≥M(HL)) переход на Х5
MOVA, M ;если же S=1 (A-M(HL)<0 → A<M(HL)), сделать текущий элемент
максимальным
X5: INX H ;присвоить HL адрес следующей ячейки (HL:=HL+1)
DCR D ;уменьшение счётчика кол-ва элементов на 1 (D:=D-1)
JNZ X4 ;если элемент не последний - продолжить
Максимальное значение находится в аккумуляторе
RAR ;циклический сдвиг вправо через перенос (деление на 2)
ORAA ;обнуление флага переполнения (ТС:=0)
MOVE, A;пересылка значения AMAX/2 в регистр E
Значение AMAX/2 находится в регистре Е
REZ1:MOVA, B ;отправляем младший байт значения 2АСР в аккумулятор
SUBE ;отнимаем AMAX/2 от младшего байта значения 2АСР
JP X6 ;если результат неотрицателен - перейти на Х6
DCR C ;если результат отрицателен - вычесть 1 от старшего байта
значения 2АСР
X6: MOVB, A ;пересылаем младший байт значения (2АСР - AMAX/2) в регистр В
Значение (2АСР - AMAX/2) находится в паре ВС
AMIN:LXI H, 8100 ;задание адреса первого элемента (HL:=8100H)
MVI D, 40 ;задание кол-ва элементов
MOVA, M ;будем считать первый элемент минимальным (A:=M(HL))
X7: CMPM ;сравниваем минимальный элемент с текущим (A-М(HL))
JMX8 ;при S=1 (A-M(HL)<0 → A<M(HL)) переход на Х8
MOVA, M ;если же S=0 (A-M(HL)≥0 → A≥M(HL)), сделать текущий элемент
наименьшим
X8: INX H ;присвоить HL адрес следующей ячейки (HL:=HL+1)
DCR D ;уменьшение счётчика кол-ва элементов на 1 (D:=D-1)
JNZ X7 ;если элемент не последний - продолжить
Минимальное значение находится в аккумуляторе
RAR ;циклический сдвиг вправо через перенос (деление на 2)
ORAA ;обнуление флага переполнения (ТС:=0)
MOVE, A;пересылка значения AMIN/2 в регистр E
Значение AMIN/2 находится в регистре Е
!!!Значение Y теоретически не превышает два байта!!! YMAX = BE01H
MULT: MOVD, E ;загрузить множитель (AMIN/2) в регистр D
DCRD ;уменьшение на 1 множителя
MOVA, C ;пересылка старшего байта множимого в аккумулятор
X9: ADDC ;суммируем по одному значению
DCRD ;уменьшить кол-во циклов суммирования на 1
JNZX9 ;если цикл не последний – повторить суммирование
MOVC, A ;переслать старший байт Yв регистр С
MOVD, E ;загрузить множитель в регистр D
DCRB ;уменьшение на 1 множителя
MOVA, B ;пересылка младшего байта множимого в аккумулятор
X11: ADDB ;суммируем по одному значению
JNCX12 ;если нет переполнения – перейти на Х12
INRC ;если было переполнение – увеличить старший байт на 1
X12: DCRD ;уменьшить кол-во циклов суммирования на 1
JNZX11 ;если цикл не последний – повторить суммирование
STA 8150 ;отправить младший байт результата Y в ячейку 8150H
MOVA, C ;переслать старший байт результата Y в аккумулятор
STA 8151 ;отправить старший байт результата Y в ячейку 8151H
RST 1