SUMM
: LXI H, 8100
;задание адреса первого элемента (HL:=8100H)
MVI
D
, 40
;задание кол-ва элементов
XRA A
;обнуление аккумулятора
MVI
C
, 00
;обнуление регистра C (счетчик переполнений)
X
1:
ADD
M
;суммирование (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
;если элемент не последний - продолжить суммирование
MOV
B
,
A
;пересылка младшего байта результата суммирования в регистр В
Сумма 64х элементов находится в паре BC
ACP
:
MVI
D
, 06
;задаём кол-во сдвигов (6 сдвигов – деление на 64)
MOV
A
,
C
;пересылаем старший байт в аккумулятор (C→A)
RAR
;циклический сдвиг вправо через ТС
MOV
C
,
A
;возврат в C старшего байта
MOV
A
,
B
;пересылаем младший байт в аккумулятор (B→A)
RAR
;циклический сдвиг вправо через ТС
MOV
B
,
A
;возврат в B младшего байта
ORA
A
;обнуление флага переполнения (ТС:=0)
DCR
D
;уменьшение счётчика кол-ва сдвигов на 1 (D:=D-1)
JNZ
ACP
;если сдвиг не последний – продолжить
Среднее значение находится в регистре В
MOV
A
,
B
;пересылаем среднее значение в аккумулятор
ADD
B
;получаем в аккумуляторе значение 2АСР
JNC X3
;перейти на Х3 если нет переполнения
INR
C
;произошло переполнение → прибавить 1 к старшему байту
значения 2АСР
X
3:
MOV
B
,
A
;пересылка 2АСР
в регистр В
Значение 2АСР
находится в паре ВС
AMAX
:
LXI H, 8100
;задание адреса первого элемента (HL:=8100H)
MVI
D
, 40
;задание кол-ва элементов
MOV
A
,
M
;
будем считать первый элемент максимальным (A:=M(HL))
X4:
CMP
M
;сравниваем максимальный элемент с текущим (A-М(HL))
JP
X
5
;при S=0 (A-M(HL)≥0 → A≥M(HL)) переход на Х5
MOV
A
,
M
;если же S=1 (A-M(HL)<0 → A<M(HL)), сделать текущий элемент
максимальным
X
5: INX H
;присвоить HL адрес следующей ячейки (HL:=HL+1)
DCR
D
;уменьшение счётчика кол-ва элементов на 1 (D:=D-1)
JNZ X4
;если элемент не последний - продолжить
Максимальное значение находится в аккумуляторе
RAR
;циклический сдвиг вправо через перенос (деление на 2)
ORA
A
;обнуление флага переполнения (ТС:=0)
MOV
E
,
A
;пересылка значения AMAX
/2 в регистр E
Значение AMAX
/2 находится в регистре Е
REZ
1:
MOV
A
,
B
;
отправляем младший байт значения 2АСР
в аккумулятор
SUB
E
;отнимаем AMAX
/2 от младшего байта значения 2АСР
JP X6
;если результат неотрицателен - перейти на Х6
DCR
C
;если результат отрицателен - вычесть 1 от старшего байта
значения 2АСР
X
6:
MOV
B
,
A
;пересылаем младший байт значения (2АСР
- AMAX
/2) в регистр В
Значение (2АСР
- AMAX
/2) находится в паре ВС
AMIN
:
LXI H, 8100
;задание адреса первого элемента (HL:=8100H)
MVI
D
, 40
;задание кол-ва элементов
MOV
A
,
M
;
будем считать первый элемент минимальным (A:=M(HL))
X7:
CMP
M
;сравниваем минимальный элемент с текущим (A-М(HL))
JM
X
8
;при S=1 (A-M(HL)<0 → A<M(HL)) переход на Х8
MOV
A
,
M
;если же S=0 (A-M(HL)≥0 → A≥M(HL)), сделать текущий элемент
наименьшим
X
8: INX H
;присвоить HL адрес следующей ячейки (HL:=HL+1)
DCR
D
;уменьшение счётчика кол-ва элементов на 1 (D:=D-1)
JNZ X7
;если элемент не последний - продолжить
Минимальное значение находится в аккумуляторе
RAR
;циклический сдвиг вправо через перенос (деление на 2)
ORA
A
;обнуление флага переполнения (ТС:=0)
MOV
E
,
A
;пересылка значения AMIN
/2 в регистр E
Значение AMIN
/2 находится в регистре Е
!!!Значение Y теоретически не превышает два байта!!! YMAX
= BE01H
MULT
:
MOV
D
,
E
;загрузить множитель (AMIN
/2) в регистр D
DCR
D
;уменьшение на 1 множителя
MOV
A
,
C
;пересылка старшего байта множимого в аккумулятор
X
9:
ADD
C
;суммируем по одному значению
DCR
D
;уменьшить кол-во циклов суммирования на 1
JNZ
X
9
;если цикл не последний – повторить суммирование
MOV
C
,
A
;переслать старший байт Yв регистр С
MOV
D
,
E
;загрузить множитель в регистр D
DCR
B
;уменьшение на 1 множителя
MOV
A
,
B
;пересылка младшего байта множимого в аккумулятор
X
11:
ADD
B
;суммируем по одному значению
JNC
X
12
;если нет переполнения – перейти на Х12
INR
C
;если было переполнение – увеличить старший байт на 1
X
12:
DCR
D
;уменьшить кол-во циклов суммирования на 1
JNZ
X
11
;если цикл не последний – повторить суммирование
STA
8150
;отправить младший байт результата Y в ячейку 8150H
MOV
A
,
C
;переслать старший байт результата Y в аккумулятор
STA
8151
;отправить старший байт результата Y в ячейку 8151H
RST
1