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
MVI D, 06; завдання кол-ва зрушень (6 зрушень рівносильно поділу на 64)
CALL DIV; виклик підпрограми ділення
Після DIV: Середнє значення знаходиться в регістрі В
LXI H, 8100; завдання адреси першого елемента (HL: = 8100H)
MVI D, 40; завдання кол-ва елементів
MOV A, M; будемо вважати перший елемент мінімальним (A: = M (HL))
X3: CMP M; порівнюємо мінімальний елемент з поточним (A-М (HL))
JM X 4; при S = 1 (A - M (HL) <0 → A <M (HL)) перехід на Х4
MOV A, M, якщо ж S = 0 (A - M (HL) ≥ 0 → A ≥ M (HL)), зробити поточний елемент
найменшим
X 4: INX H; привласнити HL адреса наступної комірки (HL: = HL +1)
DCR D ; Зменшення лічильника кол-ва елементів на 1 (D: = D -1)
JNZ X3, якщо елемент не останній - продовжити
MOV C, A ; Пересилання значення A MIN в регістр C
Мінімальне значення знаходиться в регістрі З
MOV A, C; пересилаємо мінімальне значення в акумулятор (C → A)
RAR; циклічний зсув вправо через перенос (поділ на 2)
ORA A; обнулення прапора переповнення (ТС: = 0)
MVI C, 00; обнулення регістра C (лічильник переповнень)
ADD B; підсумовування: А СР + А MIN / 2
JNC X 5; перейти на Х5 якщо немає переповнювання
INR C; сталося переповнення → додати 1 до старшого байту
результату Y
X 5: MOV B, A; пересилаємо молодший байт з акумулятора в регістр B
Значення (Аср + Amin / 2) знаходиться в парі НД
MVI D, 02; завдання кол-ва зрушень (2 зсуву рівносильно поділу на 4)
CALL DIV; виклик підпрограми DIV (ділення на 4)
Після DIV: Y знаходиться в регістрі В
MOV A, B; пересилаємо значення Y в регістр акумулятор (B → A)
STA 8150; пересилаємо значення Y (остаточний результат) в клітинку 8150 H
RST 1; вихід з програми
DIV: 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 DIV ; Якщо зрушення не останній - продовжити
RET; вихід з підпрограми DIV