Задача Асемблер Контрольна - варіант 1
Работа добавлена на сайт bukvasha.net: 2015-10-29Поможем написать учебную работу
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Задача № 1 . Розробіть алгоритм і напишіть програму на мові Асемблера для обчислення функції:
М3 = (С - М1) + (Е – (50)16) + (D + М2)
, де A, B, C, D, E, H, L – регістри загального призначення мікропроцесора КР580ВМ80А; М1, М2 – операнди, розташовані в пам’яті; М3 – результат обчислень, розташований у пам’яті.
Регістр В – тимчасове збереження поточного результату.
Розподіл комірок пам’яті:
8000Н-8014Н – машинні коди програми;
8020Н, 8021Н – адреси операндів М1 та М2;
8022Н – адреса результату М3.
MOV A, C ; Запис вмісту регістра С в акумулятор
LXI H, 8020Н ; Запис в пару регістрів HL адреси операнда М1
SUB M ; Віднімання від акумулятора значення операнда М1
MOV B, A ; Перенесення результату з акумулятора в регістр В
MOV A, E ; Запис вмісту регістра Е в акумулятор
SUI 50Н ; Віднімання від акумулятора значення 50 в 16-му коді
ADD B ; Додавання до вмісту акумулятора значення регістра В
MOV B, A ; Перенесення результату з акумулятора в регістр В
MOV A, D ; Запис вмісту регістра D в акумулятор
LXI H, 8021Н ; Запис в пару регістрів HL адреси операнда М2
ADD M ; Додавання до вмісту акумулятора значення М2
ADD B ; Додавання до вмісту акумулятора значення регістра В
STA 8022Н ; Запис результату обчислень функції в М3
RST 1 ; Припинити виконання програми
Блок-схема до даної програми зображена на рис.1 в додатку 1.
Задача № 2 . Розробіть алгоритм і напишіть програму на мові Асемблера для формування часової затримки за допомогою мікропроцесора КР580ВМ80А. Наведіть розрахунок часу затримки і величини похибки.
Час затримки 100мс, максимальна похибка 0,7%, А – кількість циклів.
Для розрахунку часової затримки наведем програму з тактами затримки кожної команди.
Пара регістрів DЕ – лічильник кількості циклів.
8000Н-800СН – машинні коди програми;
MS: DCX D ; 5
MOV A, E ; 5
ORA D ; 7
JNZ MS ; 10
RЕТ ; 10
LXI D, **** ; 10
CALL MS ; 17
Розрахуємо кількість циклів при часі затримки 100 мс=100000 мкс:
100000 = 0,5 * ( А * ( 5 + 5 + 7 + 10 ) + 10 + 10 + 17 )
А = 740610 = 1СЕЕ16
Мінімальний час затримки (А=1):
Тmin = 32 мкс
Максимальний час затримки (А=0):
Тmax = 884741 мкс
Даний за умовою час затримки входить в межі часової затримки наведеної вище програми. Перевіримо час затримки для вирахуваної кількості циклів:
Т = 0,5 * ( 7406 * 27 + 37 ) = 99999,5 мкс
Знайдемо похибку обчислень:
b=(100000–99999,5)*100%/100000=0,05%
Отримана похибка меньша, ніж максимально допустима. Після проведення обчислень виконаємо програму:
MS: DCX D ; Зменшення пари регістрів DЕ на 1
MOV A, E ; Пересилання в акумулятор вмісту регістра Е
ORA D ; Логічне додавання регістру D до акумулятора
JNZ MS ; Організація циклу
RЕТ ; Вихід
LXI D, 1СЕЕН ; Запис в пару регістрів DЕ числа 1СЕЕН
CALL MS ; Виклик підпрограми
Блок-схема до даної програми зображена на рис.2 в додатку 1.
Задача № 3 . Розробіть алгоритм і напишіть програму на мові Асемблера для обчислення виразу:
Y = ( Amax / 2 + 5 * Amin / 16 ) / 4
за допомогою мікропроцесора КР580ВМ80А, де Amax, Amin – максимальне і мінімальне значення для масиву однобайтних чисел без знаку об’ємом N=64 байт, який зберігається в пам’яті з початковою адресою Addr0.
Результат обчислень потрібно записати в пам’ять за адресою Addr(Rez). Визначіть найбільше і найменше значення виразу Y.
Розподіл регістрів загального призначення:
Пара регістрів HL – адреса Addr елемента масиву;
Регістр В – лічильник елементів масиву і, кількість циклів при діленні.
Розподіл комірок пам’яті:
8000Н-804FН – машинні коди програми;
8050Н-808FН– масив чисел;
8090Н – адреса Addr (Amax)16;
8091Н – адреса Addr (Amin)16;
8092Н – адреса результату Addr(Rez)16.
Визначимо найбільше і найменше значення виразу Y:
Ymax = ( FF / 2 + 5 * FF / 16 ) / 4 = 2E
Ymin = ( 0 / 2 + 5 * 0 / 16 ) / 4 = 0
Обрахувавши Ymax та Ymin бачимо, що результат не виходить за межі одного байту, тому його можна записати в одну комірку.
Розробимо програму для розрахунку цієї функції:
Amax: LXI H, Addr016 ; Запис в пару регістрів HL адреси першого елементу
; масиву Addr016
MVI B, 64 ; Завантаження в регістр В кількості елементів масиву
LDA Addr016 ; Запис в акумулятор першого елементу масиву
MS: INX H ; Визначення адреси наступного елементу масиву
CMP M ; Порівняння вмісту акумулятора з і-м елементом
; масиву
DCR B ; Зменшення кількості елементів на 1
JZ MS1 ; Вихід з циклу при проходженні всіх елементів
; масиву
JNC MS ; Повернення на початок циклу, якщо Аi < Amax
MOV A, M ; Запис в акумулятор поточного максимального
; значення масиву
JC MS ; Повернення на початок циклу, якщо Аi >Amax
MS1: ORA A ; Логічне додавання вмісту акумулятора для
; обнулення TC
RAR ; Ділення вмісту акумулятора на 2
STA Addr(Amax)16; Запис в комірку Addr(Amax)16 значення Amax/2
Amin: LXI H, Addr016 ; Запис в пару регістрів HL адреси першого елементу
; масиву Addr016
MVI B, 64 ; Завантаження в регістр В кількості елементів масиву
LDA Addr016 ; Запис в акумулятор першого елементу масиву
MS2: INX H ; Визначення адреси наступного елементу масиву
CMP M ; Порівняння вмісту акумулятора з і-м елементом
; масиву
DCR B ; Зменшення кількості елементів на 1
JZ MS3 ; Вихід з циклу при проходженні всіх елементів
; масиву
JC MS2 ; Повернення на початок циклу, якщо Аi > Amin
MOV A, M ; Запис в акумулятор поточного мінімального
; значення масиву
JNC MS2 ; Повернення на початок циклу, якщо Аi < Amin
MS3: STA Addr(Amin)16; Запис в комірку Addr(Amin)16 значення Amin
ADD A ; Збільшення вмісту акумулятора в два рази
; А = Amin + Amin = 2Amin
ADD A ; Збільшення вмісту акумулятора в два рази
; А = 2Amin + 2Amin = 4Amin
LXI H, Addr(Amin)16; Запис в пару регістрів HL адреси Addr(Amin)16
ADD M ; Додавання до вмісту акумулятора Amin
;А = 4Amin + Amin = 5Amin
MVI B, 04 ; Ділення вмісту акумулятора на 16
MS4: ORA A ;
RAR ;
DCR B ;
JNZ MS4 ;
LXI H, Addr(Amax)16; Запис в пару регістрів HL адреси Addr(Amax)16
ADD M ; Додавання до вмісту акумулятора Amax/2
MVI B, 02 ; Ділення вмісту акумулятора на 4
MS5: ORA A ;
RAR ;
DCR B ;
JNZ MS5 ;
STA Addr(Rez)16 ; Запис в комірку Addr(Rez)16 значення Y
RST 1 ; Припинити виконання програми
Блок-схема до даної програми зображена на рис.3 в додатку 2.
Задача № 4 . Розробіть алгоритм і напишіть програму на мові Асемблера для обчислення виразу:
Y = ( 3 * Aсер - Amin / 2 ) * ( Amax / 4 )
за допомогою мікропроцесора КР580ВМ80А, де Amax, Amin, Aсер – максимальне, мінімальне і середне значення для масиву однобайтних чисел без знаку об’ємом N=64 байт, який зберігається в пам’яті з початковою адресою Addr0.
Результат обчислень потрібно записати в пам’ять за адресою Addr(Rez). Визначіть найбільше і найменше значення виразу Y.
Розподіл регістрів загального призначення:
Пара регістрів HL – адреса Addr елемента масиву;
Регістр В – лічильник елементів масиву і, кількість циклів при діленні;
Регістр Е – тимчасове збереження результату та множника;
Регістр D – тимчасове збереження результату та множеного;
Регістр С – збереження суми часткових добутків;
Регістр L – лічильник біт.
Розподіл комірок пам’яті:
8000Н-807EН – машинні коди програми;
8080Н-811FН– масив чисел;
8120Н – адреса молодшого байту результату Addr(Rez1)16;
8121Н – адреса старшого байту результату Addr(Rez2)16.
Визначимо найбільше і найменше значення виразу Y:
Ymax = ( 3 * FF – FF / 2 ) * ( FF / 4 ) = 9D02
Ymin = ( 3 * 0 – 0 / 2 ) * ( 0 / 4 ) = 0
Отримали, що результат входить в межі двох байт, тому результат потрібно записувати в двох комірках Addr(Rez1)16-молодший байт та Addr(Rez2)16-старший байт.
Розробимо програму для розрахунку цієї функції:
Aсер: LXI H, Addr016 ; Запис в пару регістрів HL адреси першого елементу
; масиву Addr016
MVI B, 64 ; Завантаження в регістр В кількості елементів масиву
XRA A ; Обнулення акумулятора
MOV D, A ; Очищення лічильника числа переповнення
MS: ADD M ; Додавання до вмісту акумулятора Аі
JNC MS1 ; Якщо немає переносу, то перехід на MS1
INR D ; Збільшення лічильника переносу на 1
MS1: INX H ; Визначення адреси наступного елементу масиву
DCR B ; Зменшення кількості елементів на 1
JNZ MS ; Організація циклу
MOV E, A ; Молодший байт суми
MS2: MVI C, 06 ; Ділення суми на 64
ORA A ; Логічне додавання вмісту акумулятора для
; обнулення TC
MOV A, D ; Пересилання старшого байту суми в А
RAR ;
MOV D, A ; Пересилання старшого байту суми в D
MOV A, Е ; Пересилання молодшого байту суми в А
RAR ;
MOV E, A ; Пересилання молодшого байту суми в E
DCR С ;
JNZ MS2 ;
ADD A ; Збільшення вмісту акумулятора А=Aсер+Aсер=2Aсер
ADD E ; Додавання до акумулятора вмісту Е А=3Aсер
MOV E, A ; Пересилання результату в Е
Amin: LXI H, Addr016 ; Запис в пару регістрів HL адреси першого елементу
; масиву Addr016
MVI B, 64 ; Завантаження в регістр В кількості елементів масиву
LDA Addr016 ; Запис в акумулятор першого елементу масиву
MS3: INX H ; Визначення адреси наступного елементу масиву
CMP M ; Порівняння вмісту акумулятора з і-м елементом
; масиву
DCR B ; Зменшення кількості елементів на 1
JZ MS4 ; Вихід з циклу при проходженні всіх елементів
; масиву
JC MS3 ; Повернення на початок циклу, якщо Аi > Amin
MOV A, M ; Запис в акумулятор поточного мінімального
; значення масиву
JNC MS3 ; Повернення на початок циклу, якщо Аi < Amin
MS4: ORA A ; Логічне додавання вмісту акумулятора для
; обнулення TC
RAR ; Ділення вмісту акумулятора на 2
MOV B, A ; Пересилання в В Amin/2
MOV A, E ; Запис в акумулятор 3Aсер
SUB B ; Віднімання вмісту В від А: А=3Aсер-Amin/2
MOV D, A ; Пересилання результату в D
Amax: LXI H, Addr016 ; Запис в пару регістрів HL адреси першого елементу
; масиву Addr016
MVI B, 64 ; Завантаження в регістр В кількості елементів масиву
LDA Addr016 ; Запис в акумулятор першого елементу масиву
MS5: INX H ; Визначення адреси наступного елементу масиву
CMP M ; Порівняння вмісту акумулятора з і-м елементом
; масиву
DCR B ; Зменшення кількості елементів на 1
JZ MS6 ; Вихід з циклу при проходженні всіх елементів
; масиву
JNC MS5 ; Повернення на початок циклу, якщо Аi < Amax
MOV A, M ; Запис в акумулятор поточного максимального
; значення масиву
JC MS5 ; Повернення на початок циклу, якщо Аi >Amax
MS6: MVI B, 02 ; Ділення вмісту акумулятора на 4
ORA A ;
MS7: RAR ;
DCR B ;
JNZ MS7 ;
MOV E, A ; Запис результату в Е Amax/4
LXI B, 0000 ; Очищення В і С
MVI L, 08 ; Завантаження лічильника біт (регістр L)
ORA A ; Логічне додавання вмісту акумулятора для
; обнулення TC
MS8: MOV A, E ; Завантаження множника в акумулятор з Е
RAR ; Зсув аналізуємого біта множника
MOV E, A ; Повернення зсунутого множника в Е
JNC MS9 ; Перехід на мітку MS9, якщо біт множника = 0
MOV A,B ; пересилання старшого байта суми часткових добутків
; в акумулятор
ADD D ; Додавання множеного до суми часткових добутків
JMP MS10 ; Перехід до зсуву суми часткових добутків
MS9: MOV A, B ; Пересилання старшого байта суми часткових добутків
; в акумулятор
MS10:RAR ; Зсув суми часткових добутків
MOV B, A ; Пересилання старшого байта суми часткових добутків
; в регістр В
MOV A, C ; Пересилання молодшого байта суми часткових
; добутків в акумулятор
RAR ; Зсув суми часткових добутків
MOV C, A ; Пересилання молодшого байта суми часткових
; добутків в регістр С
DCR L ; Зменшення лічильника на 1
JNZ MS8 ; Організація циклу
MOV A, С ; Пересилання молодшого байта результату в
;акумулятор
STA Addr(Rez1)16; Пересилання молодшого байта результату
; в комірку Addr(Rez1) 16
MOV A, В ; Пересилання старшого байта результату
; в акумулятор
STA Addr(Rez2) 16; Пересилання старшого байта результату
; в комірку Addr(Rez2) 16
RST 1 ; Припинити виконання програми
Блок-схема до даної програми зображена на рис.4 в додатку 2.
Задача № 5. Розробіть драйвер для виведення інформації на зовнішній пристрій у мікропроцесорній системі на базі мікропроцесорної серії К580.
Наведіть структурну схему організації виведення інформації, алгоритм виведення, програму драйвера на мові Асемблера.
Виконати завдання за допомогою паралельного інтерфейсу К580ВВ55, який програмується, з розрядністю даних рівній 11.
Алгоритм програми:
Видати сигнал пуску;
Чекання сигналу готовності;
Зчитування інформації з портів А та В.
8000Н-8024Н – машинні коди програми.
PUSH B ; Збереження стану пар регістрів
PUSH D ;
PUSH H ;
PUSH PSW ;
MVI A, 81H ; Настройка периферійного пристрою
OUT RU ;
LXI H, 8100H ; Запис в пару HL адреси регістра А
MOV A, M ; Пересилання даних в акумулятор
OUT PORT A ; Пересилання даних на регістр порта А
INX H ; Визначення адреси регістра В
MOV A, M ; Пересилання даних в акумулятор
OUT PORT B ; Пересилання даних на регістр порта В
MVI A, 00000001 ; Запуск стробуючого сигналу
OUT PORT C ;
MVI A, 00000000 ;
OUT PORT C ;
M1: IN PORT C ; Перевірка готовності
RAL ;
JNC M1 ;
POP PSW ; Відновлення стану пар регістрів
POP H ;
POP D ;
POP B ;
RST 1 ; Припинення виконання програми
Блок-схема до даної програми зображена на рис.5 в додатку 3.
Структура програми зображена на рис.6 в додатку 3.