Завдання № 1
M3 = 38H - (B - C) + (M1 + M2) - E M1 = 8061H, M2 = 8062H, M3 = 8063H
MOV A, B; A ← B
SUB C; B - C
MOV C, A; C ← (BC)
MVI A, 38; A ← 38
SUB C; 38 - (BC)
SUB E; (38 - (BC)) - E
MOV E, A; E ← ((38 - (BC))-E)
LDA 8061; A ← M1
LXI H, 8062; HL ← ADR (M2)
ADD M; M1 + M2
ADD E; (M1 + M2) + ((38 - (BC))-E)
STA 8063; M3 ← A
RST 1
Завдання № 2
Затримка 7 мс ± 0,2%
7 мс - це тактів.
Кількість повторень циклу внутрішньої затримки: 17 +10 + (5 +5 +4 +10) * Х +10 = 14000,
LXI H, 0246, 10 тактів
CALL ZZZ, 17 тактів
ZZZ: DCX H; 5 тактів
MOV A, H; 5 тактів
ORA H; 4 такти
JNZ ZZZ, 10 тактів
RET, 10 тактів
Похибка
Завдання № 3
ADR (Y) = 8000H, ADR (1) = 8001H
Y MIN = 00 (при Аср = Amin = 00), Y MAX = 1E (при Аср = Amin = FF).
LXI H, 8001; завдання адреси першого елемента
MVI D, 40; завдання кол-ва елементів
XRA A; обнулення акумулятора
MVI C, 00; обнулення регістра C (лічильник переповнень)
MET1: ADD M; A = A + M
JNC MET2; перейти на MET2 якщо немає переповнювання
INR C; сталося переповнення → додати 1 до старшого байту результату підсумовування
MET2: INX H; привласнити HL адреса наступної комірки
DCR D; зменшення лічильника кол-ва елементів на 1
JNZ MET1; якщо елемент не останній - продовжити підсумовування
MOV B, A; пересилання молодшого байта результату підсумовування в регістр В
MVI D, 06; завдання зрушень (6 зрушень = поділу на 64)
CALL DEL; виклик підпрограми ділення
MOV A, B; Acp → А
MVI D, 04; завдання кількості циклів підсумовування
MET: ADD B; підсумовування
JNC MX; перейти на MX якщо немає переповнювання
INR C; сталося переповнення → додати 1 до старшого байту результату підсумовування
MX: DCR D; зменшити на 1 кількість підсумовування
JNZ MET; організація циклу
MVI D, 04; завдання зрушень (4 зсуву = поділу на 16)
CALL DEL; виклик підпрограми ділення
MOV E, A; E ← 5Acp/16
LXI H, 8 0 0 1; завдання адреси першого елемента
MVI D, 40 ; Завдання кол-ва елементів
MOV A, M ; Будемо вважати перший елемент мінімальним
MET3: CMP M ; Порівнюємо мінімальний елемент з поточним (A-М)
JM MET4 ; При S = 1 (AM <0 → A <M) перехід на MET4
MOV A, M , Якщо ж S = 0 (AM ≥ 0 → A ≥ M), зробити поточний елемент найменшим
MET4: INX H ; Привласнити HL адреса наступної комірки
DCR D ; Зменшення лічильника кол-ва елементів на 1
JNZ MET3 ; Якщо елемент не останній - продовжити
MOV B, A ; A min → B
MVI D, 02; завдання зрушень (2 зсуву = поділу на 4)
CALL DEL; виклик підпрограми ділення
MOV A, B; A ← Amin / 4
ADD E; Amin / 4 + 5 Acp / 16 (не більше одного байта)
MOV B, A
MVI D, 02; завдання зрушень (2 зсуву = поділу на 4)
CALL DEL; виклик підпрограми ділення
STA 8150 ; Y → 8 00 0H
RST 1 ; Вихід з програми
DEL: MOV A, C ; Старший байт в акумулятор (C → A)
RAR ; Циклічний зсув вправо
MOV C, A ; Повернення в C старшого байта
MOV A, B ; Молодший байт в акумулятор (B → A)
RAR ; Циклічний зсув вправо
MOV B, A ; Повернення в B молодшого байта
ORA A ; Обнулення прапора переповнення
DCR D ; Зменшення лічильника зрушень на 1
JNZ D EL ; Якщо зрушення не останній - продовжити
RET
Завдання № 4
Y = (Acp / 4 - Amax / 8) * 2Amin ADR (Y) = 8101H, 8102 Н, 8103 Н, ADR (1) = 8001H
(Acp / 4 - Amax / 8) - 1 байт, 2 Amin - 2 байти, Y - 3 байти (FF * (2 * FF) = FF * 1FE = 1FC02).
LXI H, 8001; завдання адреси першого елемента
MVI D, 40; завдання кол-ва елементів
XRA A; обнулення акумулятора
MVI C, 00; обнулення регістра C (лічильник переповнень)
MET1: ADD M; A = A + M
JNC MET2; перейти на MET2 якщо немає переповнювання
INR C; сталося переповнення → додати 1 до старшого байту результату підсумовування
MET2: INX H; привласнити HL адреса наступної комірки
DCR D; зменшення лічильника кол-ва елементів на 1
JNZ MET1; якщо елемент не останній - продовжити підсумовування
MOV B, A; пересилання молодшого байта результату підсумовування в регістр В
MVI D, 0 8; завдання зрушень (8 зрушень = розподілу на 256 (Acp / 4))
CALL DEL; виклик підпрограми ділення
MOV E, A; E ← Acp / 4
LXI H, 8001; завдання адреси першого елемента
MVI D, 40; завдання кол-ва елементів
MOV A, M; вважаємо перший елемент максимальний
MET3: CMP M; порівнюємо максимальний елемент з поточним (A-М)
J Р MET 4; при S = 0 (A - M ≥ 0 → A ≥ M) перехід на MET 4
MOV A, M, якщо ж S = 1 (AM <0 → A <M), зробити поточний елемент максимальним
MET4: INX H; привласнити HL адреса наступної комірки
DCR D; зменшення лічильника кол-ва елементів на 1
JNZ MET3; якщо елемент не останній - продовжити
MOV B, A; A max → B
MVI D, 03; завдання зрушень (3 зсуву = поділу на 8)
CALL DEL; виклик підпрограми ділення
MOV A, E; A ← Acp / 4
SUB B; Acp / 4 - Amax / 8
MOV E, A ; E ← (Acp / 4 - Amax / 8)
LXI H, 8001; завдання адреси першого елемента
MVI D, 40; завдання кол-ва елементів
MOV A, M; будемо вважати перший елемент мінімальним
MET 5: CMP M; порівнюємо мінімальний елемент з поточним (A-М)
JM MET6 ; При S = 1 (AM <0 → A <M) перехід на MET6
MOV A, M, якщо ж S = 0 (AM ≥ 0 → A ≥ M), зробити поточний елемент найменшим
MET6: INX H; привласнити HL адреса наступної комірки
DCR D; зменшення лічильника кол-ва елементів на 1
JNZ MET 5; якщо елемент не останній - продовжити
ADD A; A = 2 Amin
JNC MET 7; перейти на MET7 якщо немає переповнювання
INR C; сталося переповнення → додати 1 до старшого байту результату підсумовування
MET 7: MOV D, A; молодший байт 2Amin - в регістр D
MOV H, C; старший байт 2Amin - в регістр Н
CALL MPL; множення молодшого байта 2Amin на (Acp / 4 - Amax / 8)
MOV A, B; молодший байт результату в акумулятор
STA 8101; перший байт результату в клітинку 8101Н
MOV A, C; старший байт результату в акумулятор
MOV D, H; старший байт 2Amin - в регістр D
MOV H, A; старший байт попереднього результату в Н
CALL MPL; множення старшого байта 2Amin на (Acp / 4 - Amax / 8)
MOV A, B; молодший байт результату в акумулятор
ADD H; додати до молодшого байту результати другого множення
переповнення від першого множення
JNC MET 8; перейти на MET8 якщо немає переповнювання
INR C; сталося переповнення → додати 1 до старшого байту результату
ME T 8: STA 8102, другий байт результату в клітинку 8102Н
MOV A, С; старший байт результату в акумулятор
STA 8103; третій байт результату в клітинку 8103Н
RST 1
DEL: MOV A, C; старший байт в акумулятор (C → A)
RAR; циклічний зсув вправо
MOV C, A; повернення в C старшого байта
MOV A, B; молодший байт в акумулятор (B → A)
RAR; циклічний зсув вправо
MOV B, A; повернення в B молодшого байта
ORA A; обнулення прапора переповнення
DCR D; зменшення лічильника зрушень на 1
JNZ D EL; якщо зрушення не останній - продовжити
RET
MPL: LXI B, 0000; обнулення пари НД
MVI L, 08; завантаження лічильника біт
ORA A; скидання прапора переповнення
NXBIT: MOV A, E; завантаження множника в акумулятор
RAR; зсув вправо
MOV E, A; повернення зрушеного множника в регістр Е
JNC NADD; якщо випав біт = 0 → перейти на NADD
MOV A, B; пересилання старшого байта часткової суми в акумулятор
ADD D; підсумовування множимо з частковою сумою
JMP SDV; перейти на SDV
NADD: MOV A, B; пересилання старшого байта часткової суми в акумулятор
SDV: RAR; зрушення вправо часткової суми
MOV B, A; відправити старший байт часткової суми в В
MOV A, C; пересилання молодшого байта часткової суми в С
RAR; зрушення вправо часткової суми
MOV C, A; повернути молодший байт часткової суми в С
DCR L; зменшити кількість біт
JNZ NXBIT; організація циклу
RET
Лист | ||||||
Змін. | Лист | № докум. | Підпис | Дата |