Задача Контрольная (вариант 12), 4 задачи на Асемблер
Работа добавлена на сайт bukvasha.net: 2015-10-29Поможем написать учебную работу
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
|
Задача №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←(B-C)
MVI A, 38 ;A←38
SUB C ;38 – (B-C)
SUB E ;(38-(B-C)) – E
MOV E, A ;E←((38-(B-C))–E)
LDA 8061 ;A←M1
LXI H, 8062 ;HL←ADR(M2)
ADD M ;M1 + M2
ADD E ;(M1+M2) + ((38-(B-C))–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
YMIN=00 (при Аср=Amin=00), YMAX=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, 8001 ;задание адреса первого элемента
MVI D, 40 ;задание кол-ва элементов
MOV A, M ;будем считать первый элемент минимальным
MET3: CMP M ;сравниваем минимальный элемент с текущим (A-М)
JM MET4 ;при S=1 (A-M<0 → A<M) переход на MET4
MOV A, M ;если же S=0 (A-M≥0 → A≥M), сделать текущий элемент наименьшим
MET4: INX H ;присвоить HL адрес следующей ячейки
DCR D ;уменьшение счётчика кол-ва элементов на 1
JNZ MET3 ;если элемент не последний - продолжить
MOV B, A ;Amin → B
MVI D, 02 ;задание сдвигов (2 сдвига = делению на 4)
CALL DEL ;вызов подпрограммы деления
MOV A, B ;A←Amin/4
ADD E ;Amin/4 + 5Acp/16 (не более одного байта)
MOV B, A
MVI D, 02 ;задание сдвигов (2 сдвига = делению на 4)
CALL DEL ;вызов подпрограммы деления
STA 8150 ;Y → 8000H
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 DEL ;если сдвиг не последний – продолжить
RET
Задача №4
Y=(Acp/4 – Amax/8)*2Amin ADR(Y)=8101H, 8102Н, 8103Н, ADR(1)=8001H
(Acp/4 – Amax/8) – 1 байт, 2Amin – 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, 08 ;задание сдвигов (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Р MET4 ;при S=0 (A-M≥0 → A≥M) переход на MET4
MOV A, M ;если же S=1 (A-M<0 → A<M), сделать текущий элемент максимальным
MET4: INX H ;присвоить HL адрес следующей ячейки
DCR D ;уменьшение счётчика кол-ва элементов на 1
JNZ MET3 ;если элемент не последний - продолжить
MOV B, A ;Amax → 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 ;будем считать первый элемент минимальным
MET5: CMP M ;сравниваем минимальный элемент с текущим (A-М)
JM MET6 ;при S=1 (A-M<0 → A<M) переход на MET6
MOV A, M ;если же S=0 (A-M≥0 → A≥M), сделать текущий элемент наименьшим
MET6: INX H ;присвоить HL адрес следующей ячейки
DCR D ;уменьшение счётчика кол-ва элементов на 1
JNZ MET5 ;если элемент не последний - продолжить
ADD A ;A=2Amin
JNC MET7 ;перейти на MET7 если нет переполнения
INR C ;произошло переполнение → прибавить 1 к старшему байту результата суммирования
MET7: 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 MET8 ;перейти на MET8 если нет переполнения
INR C ;произошло переполнение → прибавить 1 к старшему байту результата
MET8: 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 DEL ;если сдвиг не последний – продолжить
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
|
|
|
|
|
| Лист |
|
|
|
|
|
| |
Изм. | Лист | № докум. | Подпись | Дата |