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

Лабораторна робота 9

.pdf
Скачиваний:
8
Добавлен:
15.02.2015
Размер:
521.57 Кб
Скачать

 

 

 

1

 

Лабораторна робота 9.

 

Тема:

Основні методи програмування регістрів, стеку та ОЗП

 

мікропроцесора КР580ВМ80.

 

Мета:

Ознайомитись з основними методами програмування

 

регістрів, стеку та ОЗП мікропроцесора КР580ВМ80.

 

Навчитись вносити дані в регістри, стек та ОЗП.

Зміст роботи:

Ознайомитись з основними методами програмування

 

регістрів, стеку та ОЗП мікропроцесора КР580ВМ80.

Організаційні та

Виконується в два етапи:

 

методичні вказівки:

1-й етап – необхідно ознайомитись з

умовами та

 

запропонованим

алгоритмом

розв’язання

 

запропонованої задачі.

 

 

 

2-й етап – написання програми для втілення завдання на

 

програмній моделі УМПК 80.

 

Технічне

ПК під ОС Windows, програмна модель УМПК80.

забезпечення:

 

 

 

Час:

2 академічні години

 

 

2

Теоретичні відомості.

Арифметичні та логічні операції дозволені тільки між акумулятором та байтом безпосередніх даних або між акумулятором і регістром загального призначення. Проте один регістр загального призначення в дійсності вказує на адресу в пам'яті; це регістр М, який насправді звертається до адреси в пам'яті, що міститься в регістрах Н і L. Таким чином, команда ADD М, наприклад, означає: додати до акумулятора вміст байта пам'яті, що адресується через регістри Н і L. Арифметичні та логічні операції не допускають прямої адресації.

Акумулятор і регістри Н і L є спеціальними регістрами. Вони є єдиними регістрами, які можуть бути прямо завантажені або-записані в пам'ять. Акумулятор є єдиним регістром, який може бути інвертований, побічно завантажений з використанням адреси в парі регістрів В або D, побічно записаний в пам'ять за адресою, що міститься в парі регістрів В або D, або використаний в командах IN і OUT. Регістри Н і L складають єдину пару, яка може бути використана побічно в арифметичних командах, при записі в пам'ять даних, заданих безпосередньо в команді, або при завантаженні і запису в пам'ять інших регістрів, відмінних від акумулятора. Регістри Н і L є також єдиною парою, яка може бути передана в лічильник команд або покажчик стека. Більш того, ці регістри використовуються як акумулятор подвійної довжини при додаванні 16розрядних чисел (команда DAD). Регістри D і Е є в певному сенсі також спеціальними, оскільки однією командою (XCHG) можна поміняти їх вміст з вмістом регістрів Н і L. Таким чином, регістри в 8080 і 8085 вельми асиметричні, і програміст повинен акуратно вибирати, для яких даних і адрес якими регістрами користуватися.

Часто для одних і тих же фізичних регістрів використовується кілька імен. Для багатьох команд А, В, С, D, Е, Н і L є 8-розрядними регістрами. Для інших команд регістри В і С (В - старший за значенням), D і Е (D - старший за значенням) або Н і L (Н - старший за значенням) є 16розрядної парою регістрів. Терміни пара регістрів В, регістри В і С, пара регістрів ВС мають одне і те ж значення; подібні ж варіанти існують для регістрів D і Е та Н і L. Зауважимо, що пара регістрів і два одиночних регістру фізично одне і те ж, і вони не можуть служити одночасно для різних цілей.

Регістри Н і L фактично майже завжди застосовують для непрямої адреси з-за наявності команд, що мають доступ до регістру М, і таких спеціальних команд, як SPHL, PCHL, XTHL і XCHG. Завдяки тому, що існує команда XCHG, для другого адреси беруть регістри D і Е, а не В і С. Регістри В і С використовують-зазвичай як окремі 8-розрядні регістри для тимчасового зберігання даних.

Вплив різних команд на прапори дуже непослідовний. До деяких особливо незвичайним дій відносяться наступні:

а) логічні команди очищають прапор переносу,

3

б) команди зсуву не діють на інші прапори, крім прапора перенесення, в) команди завантаження, пересилання, збільшення на 1 пари регістрів

та зменшення на 1 пари регістрів взагалі не мають впливу на прапори, г) 16-розрядне додавання діє тільки на прапор переносу.

Відсутні непряма адресація через пам'ять та індексація. Відсутність непрямої адресації через пам'ять компенсується завантаженням непрямого адреси в регістри Н і L. Дійсна непряма адресація, таким чином, є двокрокова процесом. При бажанні завантажити чи записати в пам'ять акумулятор можна також завантажити непряму адресу в регістри В і С або D і Е.

Відсутність індексної адресації компенсується додаванням пари регістрів за допомогою команди DAD. Ця команда додає пару регістрів до Н і L. Таким чином, індексація потребує декількох кроків:

а) завантажити індекс в пару регістрів, б) завантажити базовий адреса в іншу пару (однієї з пар регістрів

повинні бути Н і L),

в) використовуючи команду DAD, скласти дві пари і

г) використовувати суму як непрямий адресу (за допомогою звернення до регістру М). Індексація в 8080 і 8085 - довгий і незручний процес.

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

Багато звичайних команди відсутні, але можуть бути легко змодельовані за допомогою реєстрових команд. Прикладами є очищення акумулятора (з використанням SUB А чи XRA А), логічний зрушення акумулятора вліво (за допомогою ADD А), очищення прапора перенесення (ANA А чи ORA А) і перевірка акумулятора (ANA А чи ORA А). Команди ANA А і ОRA А очищають прапор переносу і встановлюють інші прапори відповідно до вмісту акумулятора. Нагадаємо, що завантаження регістра не діє на прапори.

Ні відносних переходів. Фактично, єдиною командою переходу, яка не вимагає абсолютної адреси, є PCHL, за якою завантажується лічильник команд з регістрів Н і L і, таким чином, виробляється непрямий перехід.

Є два окремих набори команд збільшення та зменшення на 1, Команди DCR і INR застосовуються до 8-розрядним регістрів і діють на всі прапори, за винятком прапора перенесення. Команди DCX і INX застосовуються до 16-розрядним парам регістрів і взагалі не діють на прапори. Ви можете використовувати 16-розрядні пари регістрів як звичайні лічильники, але єдиним способом перевірки пари на 0 є використання команди логічне АБО до двох регістрів разом з акумулятором.

Ні арифметичних або логічних зрушень. Єдиними командами зсуву є команди циклічного зсуву з прапором переносу або без нього. Інші зрушення можуть бути змодельовані за допомогою команд циклічного зсуву (RRC, RLC, RAR і RAL) і команд складання (ADD A, ADC А і DAD Н). Прапор

4

переносу може бути встановлений за допомогою STC, а очищений за допомогою ANA А (або ORA А).

Акумулятор є єдиним регістром, який може бути зрушене, інвертований або використаний для введення або виведення. Єдиними командами, які оперують безпосередньо з регістрами загального призначення, є команди MOV (пересилання вмісту в інший регістр або з іншого регістру), MVI (завантаження безпосереднього операнда), DCR (зменшення на 1) і INR (збільшення на 1). Ці команди можуть оперувати також з регістром М, тобто байтом з пам'яті, що адресується через регістри Н і L.

Устек або з стека можуть бути передані тільки пари регістрів. Однією з таких пар є слово стану процесора (PSW), яке містить акумулятор (старший байт) і прапори (молодший байт). Команди CALL і RETURN передають адреси в стек або з нього.

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

Умікропроцесорах 8080 і 8085 прийняті наступні загальні угоди.

При записі всіх 16-розрядних адрес молодший байт записується першим (тобто за меншим адресою). Порядок байтів в адресах той же, що і в мікропроцесорах Z80 і 6502, але є зворотним порядком байтів, прийнятому в мікропроцесорах 6800 і 6809.

Покажчик стека містить молодший адресу, справді зайнятий у стеці. Ця угода також прийнято в мікропроцесорах Z80 і 6809, але явно протилежно прийнятому в 6502 і 6800 (наступний доступний адресу). Згідно всім командам 8080 і 8085 дані в стек записуються з попередніми зменшенням на 1 (відніманням перед записом байта 1 з покажчика стека) і завантажуються з стека з подальшим збільшенням на 1 (додаванням після завантаження байта 1 до вказівником стека).

Прапор дозволу переривань (тільки в 8085), рівний 1, дозволяє переривання, а 0 - забороняє їх.

1.2. Набір регістрів Програмування на мові асемблера 8080/8085 ускладнюється

асиметричністю системи команд цих процесорів. Багато команд застосовуються лише до певних регістрів, парам регістрів або розділами регістрів. Майже кожний регістр володіє індивідуальними особливостями, і майже кожна команда має свою специфіку. У табл. 1.1 перераховані регістри довжиною в байт і команди, які оперують з ними. У табл. 1.2 перераховані пари регістрів (або регістри довжиною в слово) і оперують з ними команди (всі команди, звичайно, неявно змінюють програмний лічильник). У табл. 1.3 перераховані містяться в парах регістрів непрямі адреси і команди, в яких

5

використовуються ці адреси. У табл. 1.4 перераховані команди, застосовні тільки до акумулятора, а в табл. 1.5 - команди, які застосовуються лише до певних парам регістрів. У табл. 1.6 перераховані команди, пов'язані зі стеком.

Таблиця 1.1.-розрядні регістри і вживані команди

Регістр

Команди

 

 

А

ACI, ADC, ADD, ADI, ANA, AN1, СМА, CMP, CPI, DAA, DCR, IN,

 

INR, LDA, LDAX, MOV, MVI, ORA, ORI, OUT, RAL, RAR, RIM

 

(тільки в 8085) , RLC, RRC, SBB, SBI, SIM (тільки в 8085), STA,

 

STAX, SUB, SUI, XRA, XRI

 

 

В, С, D, Е, Н, L

ADC, ADD, ANA, CMP, DCR, INR, MOV, MVI, ORA, SBB SUB,

 

XRA

 

 

F (прапори)

CMC, STC (див. також пару регістрів PSW)

 

 

I (маска

RIM, SIM (тільки в 8085)

переривань,

 

тільки в 8085)

 

 

 

 

Таблиця 1.2. Пари регістрів і вживані команди

 

 

Пара

Команди

регістрів

 

 

 

У (В і С)

DAD, DCX, INX, LXI, POP, PUSH,

 

 

D (D і Е)

DAD, DCX, INX, LXI, POP, PUSH, XCHG

 

 

Н (Н і L)

DAD, DCX, INX, LHLD, LXI, PCHL, POP, PUSH, SHLD,

 

SPHL, XCHG, XTHL

 

 

PSW (А і

POP, PUSH

прапори)

 

 

 

Лічильник

Команди виклику підпрограми, команди переходу, команди повернення

команд

з підпрограми, RST

 

 

Покажчик

Команди виклику підпрограми, DAD, DCX, INX, LXI, POP, PUSH,

стека

команди повернення з підпрограми, RST, SPHL

 

 

6

Таблиця 1.3. Непрямі адреси і вживані команди

Розташування адреси

Пара регістрів В (В і С)

Пара регістрів D (D і Е)

Пара регістрів Н (Н і L)

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

Команди

LDAX, STAX

LDAX, STAX

ADC, ADD, ANA, CMP, DCR, INR, MOV, MVI, ORA,

SBB, SUB, XRA

Команди виклику підпрограми, РОР, PUSH, команди

повернення з підпрограми, RST, XTHL

Таблиця 1.4. Команди, які застосовуються тільки до акумулятора

Команда

Функція

Команда

Функція

 

 

 

 

ACI

Безпосереднє складання

RAR

Циклічний зсув вправо

 

з перенесенням

 

через перенесення

ADI

Безпосереднє складання

RIM

Читання маски переривань

 

 

 

 

AN1

Безпосереднє

 

 

 

 

 

(Тільки в 8085)

 

 

 

 

 

логічне І

RLC

Циклічний зсув вліво

 

 

 

 

СМА

Доповнення (логічне)

RRC

Циклічний зсув вправо

 

 

 

 

CPI

Безпосереднє порівняння

SBI

Безпосереднє віднімання з позикою

DAA

Десяткова корекція

 

 

 

 

 

 

IN

Введення

SIM

Установка маски переривань (тільки в

 

 

 

8085)

LDA

Пряме завантаження

 

 

 

 

 

LDAX

Непряма завантаження

STA

Пряме запам'ятовування

ORI

Безпосереднє логічне

STAX

Непряме запам'ятовування

 

АБО

 

 

 

SUI

Безпосереднє віднімання

 

 

 

 

OUT

Висновок

 

 

 

 

 

 

RAL

Циклічний зсув вліво

XRI

Безпосереднє логічне ВИКЛЮЧАЄ АБО

 

через перенесення

 

 

7

Таблиця 1.5. Команди, які застосовуються тільки до однієї або двох парах регістрів

Команда

Пари регістрів

Функція

 

 

 

LDAX

В або D

Непряма завантаження акумулятора

 

 

 

LHLD

Н

Пряме завантаження Н і L

 

 

 

PCHL

Н, РС

Пересилання Н і L в PC

 

 

 

SHLD

Н

Прямий запис в пам'ять Н і L

 

 

 

STAX

В або D

Непряма запис у пам'ять акумулятора

 

 

 

XCHG

D, Н

Обмін HL з DE

 

 

 

XTHL

Н

Обмін HL з вершиною стека

 

 

 

Таблиця 1.6. Команди, в яких використовується стек

Команда

Функція

Команди виклику

Перехід та збереження лічильника команд в стеку

підпрограми

 

ЮР

Завантаження пари регістрів з стека

PUSH

Запис пари регістрів в стеку

 

 

Команди повернення з

Завантаження лічильника команд з стека

підпрограми

 

 

 

RST

Перехід за адресою вектора з збереженням лічильника

 

команд в стеку

 

 

XTHL

Обмін Н і L з вершиною стека

 

 

Регістри зазвичай використовуються таким чином.

Акумулятор є центром обробки даних; для більшості арифметичних і логічних команд він служить джерелом одного з операндів і місцем призначення для результату.

Регістри Н і L (пара регістрів Н) представляють собою основний регістр адреси пам'яті. Команди, які посилаються на регістр М, насправді посилаються на адресу пам'яті в цій парі регістрів.

Регістри D і Е (пара регістрів D) представляють собою додатковий регістр адреси пам'яті, оскільки програміст може поміняти їх вміст з вмістом Н і L, використовуючи команду XCHG.

W Регістри В і С (пара регістрів В) є регістрами загального призначення без будь-яких відмітних особливостей, хоча команди LDAX (завантажити акумулятор побічно) і STAX (запам'ятати акумулятор побічно) можуть використовувати їх як адресних регістрів. Зазвичай програмісти використовують регістри В і С для лічильників і тимчасового зберігання даних.

Індивідуальні особливості окремих регістрів можна описати таким чином:

8

Акумулятор. Єдиний реєстр довжиною в байт, який може бути прямо завантажений або записаний у пам'ять. Єдиний реєстр, який можна зрушувати, інвертувати або коригувати в двійково-десятковий вигляд за допомогою однієї команди. Єдиний реєстр, який може бути записаний в порт виводу (за допомогою команди OUT) або завантажений з порту виводу (за допомогою команди IN). Вихідний регістр і регістр призначення для всіх арифметичних і логічних команд, за винятком DAD, DCR, DCX, INR і INX. Єдиний реєстр, який може бути завантажений з регістра маски переривань (командою RIM) або записаний в регістр маски переривань (SIM). (Регістром маски переривань забезпечений тільки процесор 8085.)

Регістри Н і L. Єдина пара регістрів, яка може бути використана побічно (за допомогою посилання на регістр М) у командах ADC, ADD, ANA, CMP, DCR, INR, MOV, MVI, ORA, SBB, SUB і XRA. Єдина пара регістрів, яка може бути прямо завантажена або записана в пам'ять. Вихідні регістри та регістри призначення для команди DAD. Єдина пара регістрів, яку можна обміняти з регістрами D і Е і з вершиною стека. Єдина пара регістрів, яку можна переслати в покажчик стека (використовуючи команду SPHL) або в лічильник команд (командою PCHL). Єдина пара регістрів, яка може бути зрушена однією командою (DAD Н).

Регістри D і Е. Єдина пара регістрів, для якої можливий обмін даними з регістрами Н і L (за допомогою команди XCHG).

Покажчик стека. Єдиний адресний регістр, який забезпечує автоприрощення (прирощення адреси після виконання команди) і автозменшення (зменшення адреси до виконання команди). Може бути завантажений тільки командою LXI або SPHL. Його значення можна визначити тільки за допомогою завантаження 0 в пару регістрів Н і L з подальшим використанням команди DAD SP. Єдина пара регістрів, яка може бути використана для передачі інших пар регістрів на згадку чи з пам'яті (команди PUSH і POP) або для запису в пам'ять або читання з неї лічильника команд (команди CALL і RETURN).

Слово стану процесора (PSW). Містить у собі акумулятор (старший байт) і прапори (молодший байт). Може бути тільки передано в стек або з стека за допомогою команд PUSH і POP.

Зазначимо таке:

Тільки акумулятор і регістри Н і L можуть бути прямо завантажені з пам'яті або записані в пам'ять. Для інших регістрів або пар регістрів немає команд, еквівалентних командам LDA, STA, LHLD або

SHLD.

Тільки адресу в Н і L (регістр М) можна використовувати для всіх команд, окрім завантаження або запису акумулятора в пам'ять. Тільки адресу

вН u L може бути використаний для передачі даних в інші регістри або з них

варифметичних або логічних командах.

Тільки команди DCR, DCX, DAD, INR і INX дозволяють виконувати арифметичні операції без використання акумулятора (команди

9

DCR і INR можна застосовувати і для акумулятора). З цих команд тільки DCR, DAD і INR змінюють значення прапорів; DCR і INR змінюють всі прапори / крім перенесення, в той час як DAD змінює тільки прапор переносу.

ПЕРЕДАЧА З РЕГІСТРУ У РЕГІСТР

Команда MOV може передавати будь 8-розрядний регістр загального призначення (А, В, С, D, Е, Н або L) у будь-який інший 8-розрядний регістр загального призначення. Регістр прапорів (F) може бути тільки переданий в стек чи отриманий із стека разом з акумулятором (за допомогою PUSH PSW і POP PSW). Регістр маски переривань (тільки в 8085) може бути переданий в | акумулятор або з нього за допомогою команд RIM або SIM. Команда ХСНО обмінює пари регістрів D і Н. "Зазвичай використовують наступні команди передачі:

MOV A, REG передає вміст регістра в акумулятор; MOV REG, А передає вміст акумулятора в регістр; MOV REG, М завантажує регістр вмістом пам'яті за адресою в регістрах Н і L;

MOV М, REG записує вміст регістра в пам'ять за адресою в регістрах Н

і L;

XCHG обмінює вміст пари регістрів D (регістри D і Е) з вмістом пари регістрів Н (регістри Н і L)

У команді MOV регістр призначення є першим операндом, таким чином, MOV REG1, REG2 передає вміст REG2 в REG1, що назад угодою, запропонованому в стандарті 694 IEEE для команд мови асемблера [1, 2]. Команда MOV змінює регістр призначення, але не впливає на регістрджерело. Команда XCHG змінює чотири регістри (D, Е, Н і L); таким чином, ця команда еквівалентна чотирьом командам МОV плюс деяким проміжним командам, що зберігає один байт даних під час передачі іншого. Ні MOV, ні XCHG не впливають на прапори.

ЗАВАНТАЖЕННЯ РЕГІСТРІВ З ПАМ'ЯТІ

У мікропроцесорах 8080 і 8085 передбачені чотири способи адресації, якими можна користуватися при завантаженні регістрів з пам'яті: пряма (з пам'яті з конкретною адресою), безпосередня (з конкретним значенням), непряма (з адреси, поміщеного в парі регістрів) і стекова (з вершини стека)

[3].

ПРЯМЕ ЗАВАНТАЖЕННЯ РЕГІСТРІВ

З використанням прямої адресації з пам'яті можуть бути завантажені тільки акумулятор і регістри Н і L (пара регістрів Н).

Приклади

1. LDA 2050H,

Ця команда завантажує акумулятор (регістр А) з комірки пам'яті 205016.

2. LHLD 0A00H

10

Ця команда завантажує регістр L з комірки пам'яті А00016, а регістр Н з комірки пам'яті A00116. Зауважимо, що за прийнятим для 8080,8085 формату зберігання 16-розрядних чисел першим є молодший за значенням байт, а за ним у клітинці з наступним адресою - старший за значенням байт.

БЕЗПОСЕРЕДНЄ ЗАВАНТАЖЕННЯ РЕГІСТРА

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

Приклади

MVI С, 6

Ця команда завантажує регістр З значенням 6. Тут 6 є 8-розрядним числом, а не 16-розрядним адресою, не слід змішувати число 6 з адресою

000616.

LXI D, 15E3H

Ця команда завантажує 1516 в регістр D і Е316 в регістр Е.

НЕПРЯМЕ ЗАВАНТАЖЕННЯ РЕГІСТРА

Команда MOV REG, M може завантажити будь-який регістр з комірки пам'яті, адреса якої міститься в регістрах Н і L. Команда LDAX може завантажити акумулятор з використанням адреси, що міститься в парі регістрів В або D. Зауважимо, що немає команди, завантажування побічно пару регістрів.

Приклади

MOV D, M

Ця команда завантажує регістр D з комірки пам'яті, адреса якої міститься в регістрах Н і L. Команда мови асемблера має форму: MOV регістр призначення, вихідний регістр; цей порядок регістрів є зворотним, запропонованого в стандарті 694 IEEE.

LDAX В

Ця команда завантажує акумулятор з комірки пам'яті, адреса якої міститься в регістрах В і С. Команда MOV А, М має те ж саме призначення, але в ній використовується, адресу, що міститься в регістрах Н і L. Зауважимо, проте, що не можна використовувати В і С або D і Е для непрямої завантаження любого регістра, крім акумулятора.

ЗАВАНТАЖЕННЯ РЕГІСТРА З СТЕКА

Команда POP RP завантажує пару регістрів з вершини стека і відповідно встановлює покажчик стека. Однією з пар регістрів для команда POP є слово стану процесора (PSW), в якому міститься акумулятор (старший байт) і прапори (молодший байт). Не існує, команд, що завантажують один регістр з стека або використовують покажчик стека побічно без його зміни (хоча команда XTHL в результаті і не впливає на покажчик стека, але вона передає дані як в стек, так і з стека).