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 ; Пересилання значення A MAX / 2 в регістр E
Значення A MAX / 2 знаходиться в регістрі Е
REZ 1: MOV A, B; відправляємо молодший байт значення 2А СР в акумулятор
SUB E; віднімаємо A MAX / 2 від молодшого байта значення 2А СР
JP X6; якщо результат неотріцателен - перейти на Х6
DCR C ; Якщо результат негативний - відняти 1 від старшого байта
значення 2А СР
X 6: MOV B, A; пересилаємо молодший байт значення (2А СР - A MAX / 2) в регістр В
Значення (2А СР - A MAX / 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 ; Пересилання значення A MIN / 2 в регістр E
Значення A MIN / 2 знаходиться в регістрі Е
! Значення Y теоретично не перевищує два байти! Y MAX = BE 01 H
MULT: MOV D, E; завантажити множник (A MIN / 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 в клітинку 8150 H
MOV A, C; переслати старший байт результату Y в акумулятор
STA 8151; відправити старший байт результату Y в клітинку 8151 H
RST 1