Реферат: Асемблер Контрольна - варіант 1
Задача № 1 . Розробіть алгоритм і напишіть програму на мові Асемблера для обчислення функції:
М3 = (С — М1) + (Е – (50)16) + (D + М2)
, де A, B, C, D, E, H, L– регістри загального призначення мікропроцесора КР580ВМ80А; М1, М2 – операнди, розташовані в пам’яті; М3 – результат обчислень, розташований у пам’яті.
Регістр В – тимчасове збереження поточного результату.
Розподіл комірок пам’яті:
1. 8000Н-8014Н – машинні коди програми;
2. 8020Н, 8021Н – адреси операндів М1 та М2;
3. 8022Н – адреса результату М3.
MOVA, C; Запис вмісту регістра С в акумулятор
LXIH, 8020Н; Запис в пару регістрів HL адреси операнда М1
SUBM; Віднімання від акумулятора значення операнда М1
MOVB, A; Перенесення результату з акумулятора в регістр В
MOVA, E; Запис вмісту регістра Е в акумулятор
SUI 50Н; Віднімання від акумулятора значення 50 в 16-му коді
ADDB; Додавання до вмісту акумулятора значення регістра В
MOVB, A; Перенесення результату з акумулятора в регістр В
MOVA, D; Запис вмісту регістра D в акумулятор
LXIH, 8021Н; Запис в пару регістрів HL адреси операнда М2
ADDM; Додавання до вмісту акумулятора значення М2
ADDB; Додавання до вмісту акумулятора значення регістра В
STA8022Н; Запис результату обчислень функції в М3
RST1; Припинити виконання програми
Блок-схема до даної програми зображена на рис.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: DCXD; Зменшення пари регістрів DЕ на 1
MOVA, E; Пересилання в акумулятор вмісту регістра Е
ORAD; Логічне додавання регістру D до акумулятора
JNZMS; Організація циклу
RЕТ; Вихід
LXID, 1СЕЕН; Запис в пару регістрів DЕ числа 1СЕЕН
CALLMS; Виклик підпрограми
Блок-схема до даної програми зображена на рис.2 в додатку 1.
Задача № 3 . Розробіть алгоритм і напишіть програму на мові Асемблера для обчислення виразу:
Y=( Amax/ 2 + 5 * Amin / 16 ) / 4
за допомогою мікропроцесора КР580ВМ80А, де Amax, Amin – максимальнеі мінімальне значення для масиву однобайтних чисел без знаку об’ємом N=64 байт, який зберігається в пам’яті з початковою адресою Addr0.
Результат обчислень потрібно записати в пам’ять за адресою Addr(Rez). Визначіть найбільше і найменше значення виразу Y.
Розподіл регістрів загального призначення:
1. Пара регістрів HL – адреса Addr елемента масиву;
2. Регістр В – лічильник елементів масиву і, кількість циклів при діленні.
Розподіл комірок пам’яті:
1. 8000Н-804FН – машинні коди програми;
2. 8050Н-808FН– масив чисел;
3. 8090Н – адреса Addr(Amax)16;
4. 8091Н – адреса Addr(Amin)16;
5. 8092Н – адреса результату Addr(Rez)16.
Визначимо найбільше і найменше значення виразу Y:
Ymax = ( FF / 2 + 5 * FF / 16 ) / 4 = 2E
Ymin = ( 0 / 2 + 5 * 0 / 16 ) / 4 = 0
Обрахувавши Ymax та Ymin бачимо, що результат не виходить за межі одного байту, тому його можна записати в одну комірку.
Розробимо програму для розрахунку цієї функції:
A max : LXIH, Addr016; Запис в пару регістрів HLадреси першого елементу
; масиву Addr016
MVIB, 64; Завантаження в регістр В кількості елементів масиву
LDAAddr016; Запис в акумулятор першого елементу масиву
MS: INXH; Визначення адреси наступного елементу масиву
CMPM; Порівняння вмісту акумулятора з і-м елементом
; масиву
DCRB; Зменшення кількості елементів на 1
JZMS1; Вихід з циклу при проходженні всіх елементів
; масиву
JNCMS; Повернення на початок циклу, якщо Аi< Amax
MOVA, M; Запис в акумулятор поточного максимального
; значення масиву
JCMS; Повернення на початок циклу, якщо Аi> Amax
MS1: ORAA; Логічне додавання вмісту акумулятора для
; обнулення TC
RAR; Ділення вмісту акумулятора на 2
STAAddr(Amax)16; Запис в комірку Addr(Amax)16 значення Amax/2
A min : LXIH, Addr016; Запис в пару регістрів HLадреси першого елементу
; масиву Addr016
MVIB, 64; Завантаження в регістр В кількості елементів масиву
LDAAddr016; Запис в акумулятор першого елементу масиву
MS2: INXH; Визначення адреси наступного елементу масиву
CMPM; Порівняння вмісту акумулятора з і-м елементом
; масиву
DCRB; Зменшення кількості елементів на 1
JZMS3; Вихід з циклу при проходженні всіх елементів
; масиву
JCMS2; Повернення на початок циклу, якщо Аi> Amin
MOVA, M; Запис в акумулятор поточного мінімального
; значення масиву
JNCMS2; Повернення на початок циклу, якщо Аi< Amin
MS3: STAAddr(Amin)16; Запис в комірку Addr(Amin)16 значення Amin
ADDA; Збільшення вмісту акумулятора в два рази
; А =Amin +Amin = 2Amin
ADDA; Збільшення вмісту акумулятора в два рази
; А = 2Amin + 2Amin = 4Amin
LXIH, Addr(Amin)16; Запис в пару регістрів HLадреси Addr(Amin)16
ADDM; Додавання до вмісту акумулятора Amin
; А = 4Amin + Amin = 5Amin
MVIB, 04; Ділення вмісту акумулятора на 16
MS4: ORAA ;
RAR;
DCRB;
JNZMS4;
LXIH, Addr(Amax)16; Запис в пару регістрів HLадреси Addr(Amax)16
ADDM; Додавання до вмісту акумулятора Amax/2
MVIB, 02; Ділення вмісту акумулятора на 4
MS5:ORAA;
RAR ;
DCRB;
JNZMS5 ;
STAAddr(Rez)16; Запис в комірку Addr(Rez)16 значення Y
RST1; Припинити виконання програми
Блок-схема до даної програми зображена на рис.3 в додатку 2.
Задача № 4 . Розробіть алгоритм і напишіть програму на мові Асемблера для обчислення виразу:
Y= ( 3 * Aсер-Amin / 2 ) * ( Amax/ 4 )
за допомогою мікропроцесора КР580ВМ80А, де Amax, Amin, Aсер – максимальне, мінімальне і середне значення для масиву однобайтних чисел без знаку об’ємом N=64 байт, який зберігається в пам’яті з початковою адресою Addr0.
Результат обчислень потрібно записати в пам’ять за адресою Addr(Rez). Визначіть найбільше і найменше значення виразу Y.
Розподіл регістрів загального призначення:
1. Пара регістрів HL – адреса Addr елемента масиву;
2. Регістр В – лічильник елементів масиву і, кількість циклів при діленні;
3. Регістр Е – тимчасове збереження результату та множника;
4. Регістр D – тимчасове збереження результату та множеного;
5. Регістр С – збереження суми часткових добутків;
6. Регістр L – лічильник біт.
Розподіл комірок пам’яті:
1. 8000Н-807EН – машинні коди програми;
2. 8080Н-811FН– масив чисел;
3. 8120Н – адреса молодшого байту результату Addr(Rez1)16;
4. 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 сер : LXIH, Addr016; Запис в пару регістрів HLадреси першого елементу
; масиву Addr016
MVIB, 64; Завантаження в регістр В кількості елементів масиву
XRAA; Обнулення акумулятора
MOVD, A; Очищення лічильника числа переповнення
MS: ADDM; Додавання до вмісту акумулятора Аі
JNCMS1; Якщо немає переносу, то перехід на MS1
INRD; Збільшення лічильника переносу на 1
MS1: INXH; Визначення адреси наступного елементу масиву
DCRB; Зменшення кількості елементів на 1
JNZMS; Організація циклу
MOVE, A; Молодший байт суми
MS2: MVIC, 06; Ділення суми на 64
ORAA; Логічне додавання вмісту акумулятора для
; обнулення TC
MOVA, D; Пересилання старшого байту суми в А
RAR ;
MOVD, A; Пересилання старшого байту суми в D
MOVA, Е; Пересилання молодшого байту суми в А
RAR ;
MOVE, A; Пересилання молодшого байту суми в E
DCRС;
JNZMS2;
ADDA; Збільшення вмісту акумулятора А=Aсер+Aсер=2Aсер
ADDE; Додавання до акумулятора вмісту Е А=3Aсер
MOVE, A; Пересилання результату в Е
A min : LXIH, Addr016; Запис в пару регістрів HLадреси першого елементу
; масиву Addr016
MVIB, 64; Завантаження в регістр В кількості елементів масиву
LDAAddr016; Запис в акумулятор першого елементу масиву
MS3: INXH; Визначення адреси наступного елементу масиву
CMPM; Порівняння вмісту акумулятора з і-м елементом
; масиву
DCRB; Зменшення кількості елементів на 1
JZMS4; Вихід з циклу при проходженні всіх елементів
; масиву
JCMS3; Повернення на початок циклу, якщо Аi> Amin
MOVA, M; Запис в акумулятор поточного мінімального
; значення масиву
JNCMS3; Повернення на початок циклу, якщо Аi< Amin
MS4: ORAA; Логічне додавання вмісту акумулятора для
; обнулення TC
RAR; Ділення вмісту акумулятора на 2
MOVB, A; Пересилання в В Amin/2
MOVA, E; Запис в акумулятор 3Aсер
SUBB; Віднімання вмісту В від А: А=3Aсер-Amin/2
MOVD, A; Пересилання результату в D
A max : LXIH, Addr016; Запис в пару регістрів HLадреси першого елементу
; масиву Addr016
MVIB, 64; Завантаження в регістр В кількості елементів масиву
LDAAddr016; Запис в акумулятор першого елементу масиву
MS5: INXH; Визначення адреси наступного елементу масиву
CMPM; Порівняння вмісту акумулятора з і-м елементом
; масиву
DCRB; Зменшення кількості елементів на 1
JZMS6; Вихід з циклу при проходженні всіх елементів
; масиву
JNCMS5; Повернення на початок циклу, якщо Аi< Amax
MOVA, M; Запис в акумулятор поточного максимального
; значення масиву
JCMS5; Повернення на початок циклу, якщо Аi> Amax
MS6: MVIB, 02; Ділення вмісту акумулятора на 4
ORAA ;
MS7: RAR ;
DCRB ;
JNZMS7;
MOVE, A; Запис результату в Е Amax/4
LXIB, 0000; Очищення В і С
MVIL, 08; Завантаження лічильника біт (регістр L)
ORAA; Логічне додавання вмісту акумулятора для
; обнулення TC
MS8: MOVA, E; Завантаження множника в акумулятор з Е
RAR; Зсув аналізуємого біта множника
MOVE, A; Повернення зсунутого множника в Е
JNCMS9; Перехід на мітку MS9, якщо біт множника = 0
MOVA,B; пересилання старшого байта суми часткових добутків
; в акумулятор
ADDD; Додавання множеного до суми часткових добутків
JMPMS10; Перехід до зсуву суми часткових добутків
MS9: MOVA, B; Пересилання старшого байта суми часткових добутків
; в акумулятор
MS10:RAR; Зсув суми часткових добутків
MOVB, A; Пересилання старшого байта суми часткових добутків
; в регістр В
MOVA, C; Пересилання молодшого байта суми часткових
; добутків в акумулятор
RAR; Зсув суми часткових добутків
MOVC, A; Пересилання молодшого байта суми часткових
; добутків в регістр С
DCRL; Зменшення лічильника на 1
JNZMS8; Організація циклу
MOVA, С; Пересилання молодшого байта результату в
; акумулятор
STAAddr(Rez1)16; Пересилання молодшого байта результату
; в комірку Addr(Rez1) 16
MOVA, В; Пересилання старшого байта результату
; в акумулятор
STAAddr(Rez2) 16; Пересилання старшого байта результату
; в комірку Addr(Rez2) 16
RST 1; Припинити виконання програми
Блок-схема до даної програми зображена на рис.4 в додатку 2.
Задача № 5 . Розробіть драйвер для виведення інформації на зовнішній пристрій у мікропроцесорній системі на базі мікропроцесорної серії К580.
Наведіть структурну схему організації виведення інформації, алгоритм виведення, програму драйвера на мові Асемблера.
Виконати завдання за допомогою паралельного інтерфейсу К580ВВ55, який програмується, з розрядністю даних рівній 11.
Алгоритм програми:
1. Видати сигнал пуску;
2. Чекання сигналу готовності;
3. Зчитування інформації з портів А та В.
8000Н-8024Н – машинні коди програми.
PUSHB; Збереження стану пар регістрів
PUSH D;
PUSH H ;
PUSH PSW ;
MVIA, 81H; Настройка периферійного пристрою
OUT RU ;
LXIH, 8100H; Запис в пару HL адреси регістра А
MOVA, M; Пересилання даних в акумулятор
OUTPORTA; Пересилання даних на регістр порта А
INXH; Визначення адреси регістра В
MOVA,M; Пересилання даних в акумулятор
OUTPORTB; Пересилання даних на регістр порта В
MVI A, 00000001; Запуск стробуючого сигналу
OUT PORT C ;
MVI A, 00000000 ;
OUT PORT C ;
M1: INPORTC; Перевірка готовності
RAL;
JNC M1 ;
POPPSW; Відновлення стану пар регістрів
POP H ;
POP D ;
POP B ;
RST 1; Припинення виконання програми
Блок-схема до даної програми зображена на рис.5 в додатку 3.
Структура програми зображена на рис.6 в додатку 3.