Асемблер Контрольна - вар1

[ виправити ] текст може містити помилки, будь ласка перевіряйте перш ніж використовувати.

скачати



Завдання # 1

Знайти значення функції M 3 = (B + E -73 H) + M 2 - (M 1 +7 AH) - D

LDA 8150; M1 → A

ADI 7A; A: = A +7 AH

MOV C, A; A → C

LDA 8160; M2 → A

SUB C; A: = AC

SUB D; A: = AD

MOV C, A; A → C

MOV A, B; B → A

ADD E; A: = A + E

SUI 73; A: = A-73H

ADD C; A: = A + C

STA 8170; A → M3

Завдання # 2

Написати алгоритм затримки 255 мс ± 0,1%

Оскільки 1 такт займає 0,5 мкс, то за пропорцією:

1 такт - 0,5 · 10 -6 з

Х тактів - 255.10 -3 С

тактів.

Враховуючи похибка 0,1%, результат повинен скласти 510 000 ± 510 тактів.

Для такого кол-ва тактів будемо використовувати не один регістр, а реєстрову пару DE.

Код затримки буде таким:

LXI D, Y

CALL DEL

... ... ...

DEL: DCX D ; 5 тактів

MOV A, D ; 5 тактів

ORA D ; 4 такти

JNZ DEL , 10 тактів, якщо умова виконується, і 7 тактів, якщо не виконується

RET , 10 тактів

Щоб знайти Y скористаємося формулою: 510000 = Y (5 (DCX) +5 (MOV) +4 (ORA) +10 (JNZ)) + 10 (RET).

510000 = 24 · Y + 10 → Y = (510000-10) / 24 → Y = 21249,58 ≈ 21 250 циклів. 21250 10 = 5302 16.

У програмі використана команда ORA D, яка не впливає на вміст акумулятора, але впливає на прапор нульового результату Z, по якому ми судимо про закінчення.

Остаточний код затримки буде виглядати наступним чином:

LXI D, 5302, 10 тактів

CALL DEL , 1 7 тактів

... ... ...

DEL: DCX D ; 5 тактів

MOV A, D ; 5 тактів

ORA D ; 4 такти

JNZ DEL , 10 тактів, якщо умова виконується, і 7 тактів, якщо не виконується

RET , 10 тактів

В результаті загальна кількість тактів буде: 24 (один цикл) · 21250 + 10 (RET) - 3 (JNZ) + 10 (LXI) + 17 (CALL) = 510 034 тактів.

Похибка складе: .

Завдання # 3

Обчислити , Де А СР і А MIN - Середнє арифметичне і мінімальне значення масиву однобайтних чисел обсягом в 64 елемента.

Значення А СР і А MIN можуть бути в діапазоні: . Отже, Y може бути в діапазоні: . Як видно, результат уміщається в один регістр (байт).

Загальний алгоритм програми виглядає так:

Алгоритм підпрограми ADT (підсумовування і знаходження мінімального елемента):

Алгоритм підпрограми DIV (ділення через циклічний зсув вправо з переносом):

Алгоритм підпрограми REZ (знаходження значення Y):

<! - Так як середнє значення СР) не перевищує один байт, то воно знаходиться не в парі DE, а в регістрі D; це значення буде переправлено в регістр Н (пара HL вже не використовується), щоб звільнити пару DE - ->

Лістинг програми розташований нижче:

CALL ADT ; Виклик підпрограми ADT (підсумовування і знаходження мінімального

елементу)

MVI B, 06; завдання кол-ва зрушень (B: = 06H - 6 зрушень рівносильно

поділу на 64)

CALL DIV; виклик підпрограми DIV (знаходження середнього значення)

CALL REZ; виклик підпрограми REZ (обчислення результату Y)

STA 80 FF; пересилаємо значення Y (остаточний результат) в клітинку 80 FFH

RST 1; вихід з програми

ADT: LXI H, 8100; завдання адреси першого елемента (HL: = 8100H)

MVI B, 40; завдання кол-ва елементів (B: = 64 D = 40H)

XRA A; обнулення акумулятора

LX I D, 0000; обнулення регістрів E і D (пари DE) - старшого і молодшого

байтів результату підсумовування відповідно

MOV C, M; будемо вважати перший елемент мінімальним (С: = M (HL))

X1: MOV A, M; переслати в акумулятор поточний елемент (A: = M (HL))

CMP C; порівнюємо вміст акумулятора з поточним найменшим

значенням (A - C)

JP X 2; при TS = 0 (A - C ≥ 0 → A ≥ C) перехід на Х2

MOV C, A, якщо ж TS = 1 (A - C <0 → A <C), зробити поточний елемент найменшим

X 2: ADD D; підсумовування (A: = D + A)

MOV D, A; пересилання A → D

JNC X3; перейти на Х3 якщо немає переповнювання

INR E ; Сталося переповнення → додати 1 до старшого байту

результату підсумовування

X3: INX H; привласнити HL адреса наступної комірки (HL: = HL +1)

DCR B ; Зменшення лічильника кол-ва елементів на 1 (B: = B -1)

JNZ X1; якщо елемент не останній - продовжити підсумовування

RET; вихід з підпрограми ADT

DIV: MOV A, E; пересилаємо старший байт в акумулятор (E → A)

RAR; циклічний зсув вправо через ТС

MOV E, A; повернення в Е старшого байта

MOV A, D; пересилаємо молодший байт в акумулятор (D → A)

RAR; циклічний зсув вправо через ТС

MOV D, A; повернення в D молодшого байта

ORA A; обнулення прапора переповнення (ТС: = 0)

DCR B ; Зменшення лічильника кол-ва зрушень на 1 (B: = B -1)

JNZ DIV ; Якщо зрушення не останній - продовжити

RET; вихід з підпрограми DIV

REZ: MOV Н, D; пересилаємо середнє значення в регістр Н

LX I D, 0000; обнулення регістрів E і D (пари DE) - старшого і молодшого

байтів результату Y відповідно

MOV A, C; пересилаємо мінімальне значення в акумулятор (C → A)

ADD A; підсумовування (A: = A MIN + A MIN = 2A MIN)

JNC X 4; перейти на Х4 якщо немає переповнювання

INR E; сталося переповнення → додати 1 до старшого байту

результату Y

X 4: ADD C; підсумовування (A: = 2 A MIN + A MIN = 3 A MIN)

JNC X 5; перейти на Х5 якщо немає переповнювання

INR E; сталося переповнення → додати 1 до старшого байту

результату Y

X 5: MOV D, A; пересилаємо молодший байт з акумулятора в регістр D

MVI B, 01; завдання кол-ва зрушень (B: = 01H - 1 зрушення рівносильний

поділу на 2)

CALL DIV; виклик підпрограми DIV (ділення на 2)

MOV A, Н; пересилаємо середнє значення в акумулятор (Н → A)

ADD D; підсумовування А СР + молодший байт (3А MIN / 2)

JNC X 6; перейти на Х6 якщо немає переповнювання

INR E; сталося переповнення → додати 1 до старшого байту

результату Y

X 6: MOV D, A; пересилаємо молодший байт з акумулятора в регістр D

MVI B, 02; завдання кол-ва зрушень (B: = 02H - 2 зсуву рівносильно

поділу на 4)

CALL DIV; виклик підпрограми DIV (ділення на 4)

MOV A, D; пересилаємо значення Y в регістр акумулятор (D → A)

RET; вихід з підпрограми REZ

Завдання # 4

Обчислити , Де А СР, A MAX і А MIN - Середнє арифметичне, максимальне та мінімальне значення масиву однобайтних чисел обсягом в 64 елемента.

Значення А СР, A MAX і А MIN можуть бути в діапазоні: . Мінімальне значення (Y = 00) може бути при А СР = A MAX = А MIN = 00. Максимальне значення буде тоді, коли масив буде складатися з 63х елементів, рівних FF, і одного елемента, рівного 00; при цьому: A MAX = FF, А MIN = 00, А СР = FC. В такому випадку значення Y складе 1 F 410 16, що виходить за межі пари регістрів і вміщується в три байта. Значення Y буде розташовуватися в комірках пам'яті 80 FFH, 80 FEH, 80 FDH, причому молодший байт - в комірці 80 FDH, найстарший - в комірці 80 FFH.

Загальний алгоритм програми виглядає так:

У програмі використовуються підпрограми ADT і DIV, алгоритм яких можна побачити в задачі # 3. Підпрограма поділу (DIV) ідеально підходить і для задачі # 4, а підпрограму підсумовування і знаходження мінімального елемента масиву (ADT) можна було б доповнити перебуванням і максимального елемента масиву, якби у на був хоча б ще один невикористовуваний регістр. Вийти з цієї ситуації можна було б використовуючи осередки ОЗУ для зберігання проміжних значень A MAX і А MIN. Але, так як A MAX потрібно для розрахунку лише множника, в програмі була використана додаткова підпрограма знаходження максимального елемента і обчислення множника (MAX).

Алгоритм підпрограми REZ 1 (обчислення множимо):

Алгоритм підпрограми MAX (знаходження максимального елемента та обчислення множника):

Алгоритм підпрограми MULT (множення і записи результату (Y) в ОЗУ):

<! - Операція множення реалізована за допомогою багаторазового підсумовування (кількість циклів підсумовування = множник-1). Оскільки множене складається з двох байт (знаходиться в парі DE), то підсумовування проводиться спочатку для молодших байтів (лічильник переповнення - в ​​регістрі H), а потім для старших байтів (лічильник переповнення - в ​​регістрі L). Таким чином, перший (молодший) байт Y знаходиться в регістрі D, другий байт - складається з суми старшого байта множимо (E) і лічильника переповнення молодшого байта множимо (H), третій (старший) байт - в регістрі L ->

Лістинг програми наведено нижче:

CALL ADT ; Виклик підпрограми ADT (підсумовування і знаходження

мінімального елемента)

MVI B, 06; завдання кол-ва зрушень (B: = 06H - 6 зрушень рівносильно

поділу на 64)

CALL DIV; виклик підпрограми DIV (знаходження середнього значення)

CALL REZ 1; виклик підпрограми REZ 1 (обчислення (4 A CP - A MIN / 4))

CALL MAX; виклик підпрограми MAX (обчислення A MAX / 2)

CALL MULT; виклик підпрограми MULT (множення)

RST 1; вихід з програми

ADT: LXI H, 8100; завдання адреси першого елемента (HL: = 8100H)

MVI B, 40; завдання кол-ва елементів (B: = 64 D = 40H)

XRA A; обнулення акумулятора

LX I D, 0000; обнулення регістрів E і D (пари DE) - старшого і молодшого

байтів результату підсумовування відповідно

MOV C, M; будемо вважати перший елемент мінімальним (С: = M (HL))

X1: MOV A, M; переслати в акумулятор поточний елемент (A: = M (HL))

CMP C; порівнюємо вміст акумулятора з поточним найменшим

значенням (A - C)

JP X 2; при TS = 0 (A - C ≥ 0 → A ≥ C) перехід на Х2

MOV C, A, якщо ж TS = 1 (A - C <0 → A <C), зробити поточний елемент

найменшим

X 2: ADD D; підсумовування (A: = D + A)

MOV D, A; пересилання A → D

JNC X3; перейти на Х3 якщо немає переповнювання

INR E ; Сталося переповнення → додати 1 до старшого байту

результату підсумовування

X3: INX H; привласнити HL адреса наступної комірки (HL: = HL +1)

DCR B ; Зменшення лічильника кол-ва елементів на 1 (B: = B -1)

JNZ X1; якщо елемент не останній - продовжити підсумовування

RET; вихід з підпрограми ADT

DIV: MOV A, E; пересилаємо старший байт в акумулятор (E → A)

RAR; циклічний зсув вправо через ТС

MOV E, A; повернення в Е старшого байта

MOV A, D; пересилаємо молодший байт в акумулятор (D → A)

RAR; циклічний зсув вправо через ТС

MOV D, A; повернення в D молодшого байта

ORA A; обнулення прапора переповнення (ТС: = 0)

DCR B ; Зменшення лічильника кол-ва зрушень на 1 (B: = B -1)

JNZ DIV ; Якщо зрушення не останній - продовжити

RET; вихід з підпрограми DIV

REZ 1: MOV Н, D; пересилаємо A CP в регістр Н

MVI E, 00; обнулення регістра Е

MOV D, C; пересилання А MIN в регістр D

MVI B, 02; завдання кол-ва зрушень (B: = 02H - 2 зрушення a рівносильно

поділу на 4)

CALL DIV; виклик підпрограми DIV (ділення на 4)

MOV C, D ; Зворотній пересилання в регістр З значення А MIN / 4

MOV A, H; відправляємо A CP в акумулятор

MVI E, 00; обнулення регістра E

MVI B, 03; записуємо в регістр В кількість циклів підсумовування

(03 = 4 - 1)

X 4: ADD H; до акумулятора додаємо по одному значенню A CP

JNC X 5; якщо немає переповнювання - перейти на Х5

INR E; якщо сталося переповнення - збільшити старший байт на 1

X 5: DCR B; зменшити кількість циклів підсумовування на 1

JNZ X 4; якщо цикл не останній - повторити підсумовування

SUB C; віднімання: 4А СР - A MIN / 4

JP X 6; якщо результат віднімання позитивний - перейти на Х6

DCR E; якщо результат віднімання від'ємний - відняти 1 з

старшого байта

X 6: MOV D, A; переслати молодший байт результату (4А СР - A MIN / 4) у регістр

D (весь результат знаходиться в парі DE)

RET; вихід з підпрограми REZ 1

MAX: LXI H, 8100; завдання адреси першого елемента (HL: = 8100H)

MVI B, 40; завдання кол-ва елементів (B: = 64 D = 40H)

MOV A, M; будемо вважати перший елемент максимальним (A: = M (HL))

X7: CMP M; порівнюємо максимальний елемент з поточним (A - M (HL))

JP X 8; при TS = 0 (A - M (HL) ≥ 0 → A ≥ M (HL)) перехід на Х8

MOV A, M, якщо ж TS = 1 (A - M (HL) <0 → A <M (HL)), зробити поточний

елемент максимальним

X8: INX H; привласнити HL адреса наступної комірки (HL: = HL +1)

DCR B ; Зменшення лічильника кол-ва елементів на 1 (B: = B -1)

JNZ X7; якщо елемент не останній - продовжити підсумовування

RAR; розподіл A MAX на 2

ORA A; обнулення прапора переповнення (ТС: = 0)

MOV C, A ; Пересилання значення A MAX / 2 в регістр C

RET; вихід з підпрограми MAX

MULT: LXI H, 0000; обнулення регістрів H і L

MOV B, C; завантажити множник (A MAX / 2) в регістр В

DCR B ; Зменшення на 1 множника

MOV A, D; пересилання молодшого байта множимо в акумулятор

X 9: ADD D ; Підсумовуємо по одному значенню

JNC X 10; якщо немає переповнювання - перейти на Х10

INR H ; Якщо було переповнення - збільшити лічильник переповнення

молодшого байта на 1

X 10: DCR B ; Зменшити кількість циклів підсумовування на 1

JNZ X 9; якщо цикл не останній - повторити підсумовування

STA 80 FD ; Відправити перший (наймолодший) байт результату (Y) в

клітинку ОЗУ 80 FDH

MOV B, C; завантажити множник (A MAX / 2) в регістр В

DCR B ; Зменшення на 1 множника

MOV A, E ; Пересилання старшого байта множимо в акумулятор

X 11: ADD E ; Підсумовуємо по одному значенню

JNC X 12; якщо немає переповнювання - перейти на Х12

INR L ; Якщо було переповнення - збільшити лічильник переповнення

старшого байта на 1

X 12: DCR B ; Зменшити кількість циклів підсумовування на 1

JNZ X 11; якщо цикл не останній - повторити підсумовування

ADD H; підсумовування старшого байта множимо з лічильником

переповнення молодшого байта множимо

JNC X 13; якщо немає переповнювання - перейти на Х13

INR L; якщо було переповнення - збільшити лічильник переповнення

старшого байта на 1

X 13: STA 80 FE ; Відправити другий байт результату (Y) в клітинку ОЗУ 80 FDH

MOV A, L; переслати третій байт результату (Y) в акумулятор

STA 80 FF ; Відправити третій байт (найстарший) результату (Y) в

клітинку ОЗУ 80 FFH

RET; вихід з підпрограми MULT

Завдання № 5

Розробити драйвер виводу інформації (розрядністю 12 біт) на зовнішній пристрій за допомогою паралельного інтерфейсу ППІ (К580ВВ55).

Оскільки розрядність даних складає 12 біт, для їх виводу знадобиться порт А і порт В. Відправляти сигнал «Запис» і приймати сигнал «Готовий» будемо портом С. Отже, що управляє слово буде таким: 10001000 2 = 88 16.

1

00

0

1

0

0

0


Режим роботи групи А - 0

Напрямок порту А - висновок

Напрямок порту С (7-4) - введення

Група В

Напрямок порту В - висновок

Напрямок порту С (3-0) - висновок

Схема обміну даними ППІ з периферійним пристроєм:

Алгоритм роботи драйвера:

DRV: PUSH B ; Зберігання з стеку пари НД

PUSH D ; Зберігання з стеку пари DE

PUSH H ; Зберігання з стеку пари HL

PUSH PSW ; Зберігання з стеку акумулятора і прапорів

MVI A , 10001000

OUT <П ер. У стор>; висновок керуючого слова на периферійний пристрій

LXI H, 8070; завантаження в пару HL адреси молодшого байта

(1-8й біт) даних

MOV A, M

OUT PORTA ; Висновок молодшого байта в порт А

INX H ; Перейти на адресу старшого байта (9-12й біт) даних

MOV A, M

OUT PORTB ; Висновок старшого байта в порт В

MVI A, 00000001

OUT PORTC ; Виведення сигналу «Запис» на порт С (0)

MVI A, 00000000

OUT PORTC ; Обнулення значення порту С

X 1: IN PORTC ; Прийом сигналу портом З

RAL ; Переміщення старшого біта прийшов сигналу

з порту С (7) в ТС

JNC X 1; якщо ТЗ = 0 (сигнал не прийшов) - продовжити очікування

POP PSW ; Відновлення акумулятора і прапорів

POP H ; Відновлення пари HL

POP D ; Відновлення пари DE

POP B ; Відновлення пари BC

RET ; Вихід з драйвера







Лист







Змін.

Лист

докум.

Підпис

Дата


Додати в блог або на сайт

Цей текст може містити помилки.

Астрономія | Завдання
91.8кб. | скачати


Схожі роботи:
Асемблер Контрольна - варіант 1
Контрольна (варіант 12), 4 завдання на Асемблер
Асемблер
Асемблер 2
Програмування на мові Асемблер
Асемблер Завдання 4 - вар2
Асемблер Завдання 3 - вар2
Асемблер Завдання 2 - вар 2
Асемблер для платформи Java
© Усі права захищені
написати до нас