Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

МК

.pdf
Скачиваний:
31
Добавлен:
16.02.2016
Размер:
3.47 Mб
Скачать

затримки.

Завдання 4. Досліджувати програму 14.

Порядок виконання завдання

1.Ввести програму 14 у мікро-ЕОМ.

2.Встановити на вхідному пристрої перемикачі відповідно до числа FF.

Здійснити пуск програми. Переконатися, що мікро-ЕОМ знаходитиметься в

режимі очікування появи 0 у будь-якому розряді вхідного пристрою.

3.Встановити 0 за допомогою перемикачів у кожнім з розрядів вхідного пристрою. Перевірити вміст регістрів МП після завершення виконання програми 14.

4.Здійснити повторний запуск програми за наявності нулів у двох розрядах вхідного пристрою. Яке число буде записане в регістрі В МП після завершення виконання програми ?

Зміст звіту

1.Тимчасові діаграми виконання команд CALL <А2> <А1> , RET.

2.Відповіді на питання п.6 завдання для домашньої підготовки.

3.Повний перелік команд виклику і повернення з підпрограм для МП КР580ИК780.

4.Розроблені в процесі домашньої підготовки програми 5- й 10-секундної затримки.

5.Перелік команд роботи зі стеком для МП КР580ИК80.

6.Відповіді на питання, поставлені в п.7 завдання для домашньої підготовки.

Завдання для самоконтролю

1. Вкажіть кількість машинних тактів виконання команди САLL <А2>

1>.

2. У якій послідовності записується і зчитується зі стека вміст

91

акумулятора і регістра ознак МП під час виконання команд PUS H PSW і POP

PSW?

3.За допомогою яких команд можна задати чи перепозначити область пам'яті, відведену під стек ?

4.Вкажіть порядок виконання мікро-ЕОМ команди RET.

5.Порівняйте процес виконання мікро-ЕОМ команд CALL и RST.

6.Як треба змінити підпрограму 13, щоб тимчасова затримка, одержана в результаті її виконання, визначалась числами, записаними за адресами 0В00 і

ОВ01?

7.В якій послідовності зберігається і виймається вміст регістрів МП у підпрограмах?

8.Яка мінімальна адреса буде записана в покажчик стека SP МП для виконання підпрограми 15?

9.Як виконуватиметься підпрограма 15, якщо замість команди POP В в ній буде записана команда NOP?

10.Який максимальний час затримки може забезпечувати підпрограма 10,

якщо тривалість машинного такту Т = 1мкс ?

11.Який максимальний і мінімальний час затримки може забезпечувати підпрограма 13, якщо тривалість машинного такту Т = 1 мкс ?

12.Як збільшити час затримки з використанням підпрограми 13 ?

Бібліографічний список

1.Балашов Е.П., Пузанков Д.В. Микропроцессоры и микропроцессорные системы.-М.: Радио и связь, 1981.

2.Соучек Б. Микропроцессоры и микро-ЭОМ: Пер. с англ.– М.:

Советское радио, 1979.

92

ЛАБОРАТОРНА РОБОТА 8

ВИКОНАННЯ АРИФМЕТИЧНИХ ОПЕРАЦІЙ

Мета роботи: вивчення способів організації і дослідження програм виконання арифметичних операцій.

Обладнання, прилади та інструменти: мікро-ЕОМ на МП КР580ІК80.

Загальні відомості

Із двох способів визначення чисел з фіксованою крапкою і крапкою, що плаває, перший набув найбільшого поширення в програмуванні мікро-ЕОМ на МП КР580ИК80. Це пов'язано з відсутністю спеціальних команд, що дозволяють працювати МП з числами з крапкою, що плаває. У свою чергу двійкове восьмирозрядне число з фіксованою крапкою можна подати як двійкове число зі знаком, що має значення від -12810 до + 12710. При цьому від’ємні числа подаються в додатковому коді, а старший, сьомий, розряд числа використовується як знаковий. Таке подання чисел не дозволяє виконувати арифметичні операції з використанням переносу у додаванні і заміни у відніманні.

Число з фіксованою крапкою можна подати також двійковими числами без знака, що мають значення від 0 до 25510.

Для МП КР580ИК80 можна подавати такі числа у вигляді двійково-

десяткового числа - BINARY - CODED -DECIMAL (BCD ), за якого кожен байт розглядається як два напівбайти – два зошити, кожен з який кодує десяткову цифру. Таке подання дозволяє закодувати в 1 байт числа від 0 до 9910.

Проведення арифметичних операцій додавання, віднімання, множення,

ділення, обчислення спеціальних функцій розглянемо на прикладах відповідних підпрограм.

Програма додавання масиву однобайтних чисел з одержанням двобайтного результату – підпрограма MAIN (підпрограма 16, табл. 23).

Доданки повинні розташовуватись у послідовних адресах пам'яті. Вхідними

93

 

 

 

 

 

 

Таблиця 23

 

 

Підпрограма 16

 

 

 

 

 

 

 

 

 

 

 

 

Адреса

Машинний

Мітка

Мнемокод

Коментар

 

код

 

 

 

 

 

 

 

 

 

 

 

 

записати

в

регістри

 

0800

21000В

MAIN

LXI Н ОВ00

Н, L адресу першого

 

доданка

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

завантажити в

 

0803

06 05

 

MVI В 0 5

регістр В

 

 

 

 

кількість доданків

 

 

 

 

 

 

 

 

 

 

викликати

 

 

0805

CD 0908

 

CALL ADDВ

підпрограму

 

 

 

додавання

 

 

 

 

 

 

 

 

0808

CF

 

RSTІ

перервати виконання

 

 

програми

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

0809

AF

ADDB

XRA А

очистити акумулятор

 

 

 

 

 

 

 

 

080А

4F

 

MOV C А

очистити

лічильник

 

 

переносів

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

додати

до

вмісту

 

080В

86

CN T

ADD M

акумулятора число з

 

масиву доданків

 

 

 

 

 

 

 

 

 

 

якщо переносу

 

080С

D 2 1008

 

JNС TRM

немає, то йти на

 

 

TRM

 

 

 

 

 

 

 

 

 

 

080F

ОС

 

INR С

збільшити зміст

 

 

регістра С на 1

 

 

 

 

 

 

 

 

 

 

 

 

0810

23

TRM

INX H

вказати на наступну

 

адресу доданка

 

 

 

 

 

 

 

 

 

 

 

 

0811

05

 

DCR B

зменшити вміст

 

 

лічильника доданків

 

 

 

 

 

 

 

 

 

 

 

 

0812

D2 OB08

 

JNC CNT

якщо не всі доданки,

 

 

то йти на CNT

 

 

 

 

 

 

 

 

 

 

 

 

 

 

0815

С9

 

RET

 

 

 

 

 

 

 

 

 

 

 

 

параметрами з підпрограми ADD В є адреса першого доданка, записана в регістрах Н, L , і число доданків, записане в регістрі В. Вихідним параметром програми MAIN є сума, старший байт якої записаний у регістрі 3, а молодший

– в акумуляторі А. Алгоритм програми додавання полягає в тому, що після

94

додатка кожного елемента масиву визначається переповнення акумулятора

(розряд С-1), і якщо це має місце, то вміст регістра С збільшується на 1. Таким чином, за рахунок підсумовування одиниць переносу виходить старший байт суми (рис. 15, а).

Мікро-ЕОМ може проводити арифметичні операції з числами з подвійною чи більшою довжиною машинного слова. Оскільки МП має 8-

розрядне АЛП, то операції з такими числами повинні проводитися за байтами,

починаючи з молодших байтів. Так, операція додавання чисел 17F 5 + 3411

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

 

Старший байт

Прапорець (мітка) 3 Молодший байт

Числа

00101111

11110101

17 F 5

+

+

+

00110100

00010001

3411

+1

1

 

_____________________________________________________________

01001100

00000110

4 С 06

Операція віднімання чисел 6F 5С - 1ЗС5 здійснюватиметься в такому

вигляді:

 

 

Старший байт

Прапорець(мітка) 3 Молодший байт

Числа

01101111

01011100

6 F 5 C

 

 

 

00010011

11000101

1З С 5

- 1

1

 

________________________________________________________

01011011

10010111

5 В 97

З наведених прикладів видно, що для підсумовування (віднімання)

молодших байтів чисел необхідно застосовувати команду ADD (SUB), а для додавання (віднімання) інших – команду ADC (SBB), що враховуватиме стан розряду регістра С ознак МП.

Програма знаходження різниці чисел, що мають однакову довжину показана в табл. 24.

95

а)

ADD B

Очистити регістр суми А і лічильник переповнення С

Додати до вмісту акумулятора число із пам’яті

Ні

С = 1

Так

Збільшити вміст регістра С на 1

Зменшити вміст лічильника кількості додатків на 1. Вказати на наступну адресу

ТакНі

Останній доданок? Так

RETURN

б)

Ні

MPL

Покажчик біта дорівнює 01, сума дорівнює 00

Вміст біта рівний 1?

Так

Сума = сума + множник

Посунути суму вправо

Вказати на наступний біт множника

Ні

Останній біт?

Так

RETURN

Рис. 15. Алгоритм підпрограми додавання (а) і множення (б).

96

Вхідні параметри: регістр С – довжина чисел (у байтах), регістри Н, L – адреса молодшого байта, що віднімається; регістри D, Е – адреса молодшого байта зменшуваного. Кожне з чисел записується в послідовних адресах пам'яті,

починаючи з молодших байтів. Результат заноситься в область пам'яті,

відведену під від'ємник. Якщо зменшуване менше від'ємника, подаватиметься звуковий сигнал.

Таблиця 24

Програма 17

Адреса

Машинний

Мітка

Мнемокод

 

Коментар

 

код

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

0900

 

SBN

XRA А

очистити акумулятор і мітку 3

AF

 

 

 

 

 

 

 

 

 

 

 

 

 

0901

ІА

CNT

LDАХ А

записати в акумулятор

 

зменшуване

 

 

 

 

 

 

 

 

 

 

0902

 

SBB M

відняти

з

вмісту

акумулятора

 

від'ємник

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

0903

77

 

MOV M А

записати

різницю

на

місце

 

від'ємника

 

 

 

 

 

 

 

 

 

 

 

0904

23

 

ІNX Н

вказати

на

наступний

байт

 

 

 

 

від'ємника

 

 

 

0905

13

 

INX D

вказати

на

наступний

байт

 

 

 

 

зменшуваного

 

 

 

 

 

 

 

 

 

 

0906

OD

 

DCR С

зменшити

 

вміст

лічильника

 

довжини числа

 

 

 

 

 

 

 

 

 

 

 

 

 

0907

С2 0109

 

JNZ СNT

якщо не останній (старший байт

 

числа), то йти на CNT

 

 

 

 

 

 

 

 

 

 

 

 

 

090А

DO

 

RNC

якщо байт старший і результат без

 

позики (С - 0), то повернення

 

 

 

 

 

 

 

 

 

 

 

 

090B

CD 1200

 

CALL

якщо була позика (С=1),

 

 

подати сигнал

 

 

 

 

 

BEEP

 

 

 

 

 

 

 

 

 

 

090Е

CF

 

RSТ І

перервати виконання програми

 

 

 

 

 

 

 

 

 

Виконання команд MOV М, A; INX D не впливає на розряд С. У програмі

SBN підпрограма звукового сигналу (BEEP) починається з адреси 0012. Перед початком виконання програми SBN необхідно здійснити початкову установку всіх вхідних параметрів.

97

Множення чисел. Існує кілька алгоритмів множення чисел. За першого алгоритму множення можна замінити багаторазовим додаванням, наприклад

14 3 = 14 + 14 + 14. Істотний недолік цього способу - значна тривалість процесу обчислення. За другого алгоритму множення здійснюється у стовпчик.

Цей алгоритм застосовуємо і для множення двійкових чисел, наприклад:

0110= 610 0011= 310 0110

0110

0000

0000_________

00010010=1810

Для обчислення результату за другим алгоритмом необхідно здійснити багаторазове підсумовування зі зсувом уліво множника за одночасної перевірки вмісту розрядів множника, починаючи з боку його молодшого розряду. При цьому, якщо в черговому розряді першого множника записана 1, то другий множник додається до суми і зсувається вліво на один розряд, а якщо в розряді записаний 0, то відбудеться тільки зсув першого множника. Зсування першого множника вліво можна замінити зсуванням суми вправо. За цим алгоритмом

(рис. 15, б) працює підпрограма множення двох однобайтних чисел з одержанням двобайтного результату (підпрограма 18, табл. 25). Початкова адреса підпрограми - 04ЕІ; вхідні параметри: регістр D – множник, регістр Е – множник. Результат перемножування записується в регістри В, С.

Ділення чисел. Ділення двійкових чисел, як і чисел, представлених у будь-якій іншій системі числення, ґрунтується на послідовному вирахуванні дільника з діленого і залишків від ділення.

Однак двійкове ділення реалізується простіше, тому що використання тільки двох цифр (0 і 1) дозволяє уникнути в кожному циклі ділення необхідності визначення кількості дільників, що містяться в поточному значенні. чи діленого залишку (досить тільки порівняти їх).

98

 

 

 

 

 

 

 

 

 

Таблиця 25

 

 

 

Підпрограма 18

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Адреса

Машинний

Мітка

Мнемокод

 

 

Коментар

 

 

код

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

04Е4

ЗЕ01

 

MVI A 01

завантажити

 

в

акумулятор

 

 

покажчик розряду

 

 

 

 

 

 

 

 

 

 

04Е6

А7

 

АNА А

очистити прапорець С

 

 

 

 

 

 

 

 

04E7

F5

 

PUS

зберегти покажчик розряду в

 

MPL I

HPSW

стеці

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

04Е8

A3

 

ANA E

перевірити

вміст

чергового

 

 

розряду множника

 

 

 

 

 

 

 

 

 

 

04Е9

78

 

MOV А В

завантажити

 

в

акумулятор

 

 

старший байт суми

 

 

 

 

 

 

 

 

 

 

04ЕА

СА ЕС04

 

JZ MPL 2

якщо

в

черговому

розряді

 

 

записаний 0, йти на МР

2

 

 

 

 

 

 

04ED

82

 

ADD D

додати множене до суми

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

04ЕЕ

IF

 

RAR

зрушити суму вправо

 

 

MPL 2

(молодший біт → С)

 

 

 

 

 

 

 

 

 

04EF

47

 

MOV В А

зберегти вміст акумулятора в

 

 

регістрі В

 

 

 

 

 

 

04 F 0

79

 

MOV А С

завантажити

 

в

акумулятор

 

 

молодший байт суми

 

 

 

 

 

 

 

 

04 FI

IF

 

RAR

зсунути число

в акумуляторі

 

 

вправо (С → старший біт )

 

 

 

 

 

 

04 F 2

47

 

MOV C А

зберегти вміст акумулятора в

 

 

регістрі С

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

04 F З

FI

 

POP PSW

одержати

зі

стека покажчик

 

 

розряду

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

04 F 4

17

 

RAL

покажчик на наступний розряд

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

04 F 5

D2 Е704

 

JNС МРL І

якщо

розряд

не

останній,

 

 

продовжувати на MPL I

 

 

 

 

 

 

 

 

04 F 8

С9

 

RЕТ

якщо

 

розряд

останній,

 

 

повернення

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Схема алгоритму ділення двійкових чисел показана на рис. 16. Програма

DIVB побудована за цим алгоритмом (програма 19, табл. 26). Вхідними параметрами цієї програми є ділене (у регістрі Е) і дільник (у регістрі D ); вихідними параметрами – частка (у регістрі Н ) і останов (у регістрі С).

Обчислення спеціальних функцій.

99

 

 

 

DIV B

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Лічильник бітів дорівнює 08

 

 

 

 

 

 

 

 

Дільник дорівнює 00

 

 

 

 

 

 

 

 

Проміжний дільник дорівнює 00

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Зсунути старший біт діленого в розряд С

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Зсунути вміст розряду С в молодший біт

 

 

 

 

 

 

 

проміжного діленого

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Відняти з проміжного діленого дільник

 

 

 

 

 

 

 

 

 

 

 

 

Так

 

 

 

 

 

 

 

 

 

 

 

С=0

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Ні

 

 

 

 

 

 

 

 

 

Відновити проміжне ділене додаванням

 

 

 

 

 

 

 

дільника до залишку

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Інвертувати вміст розряду С

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Зсунути вміст розряду С в молодший

 

 

 

 

 

розряд дільника

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Зменшити лічильник бітів на 1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Так

 

 

 

Лічильник бітів 0

 

 

 

 

 

 

 

Ні

 

 

 

 

 

 

 

 

 

 

 

 

 

 

RETURN

Рис.

16.

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

чисел.

100