Обробки масивів
Елемент масиву найпростіше вибрати, помістивши його адресу в регістри Н і L. У цьому випадку можна:
* Працювати з елементом, звертаючись до нього як до регістру М;
* Вибирати наступний елемент масиву (за наступним більшого адресою);
* Використовуючи команду INX для збільшення значення пари регістрів Н і L, або попереднього елемента (за попереднім меншому адресою), використовуючи DCX для зменшення Н і L.
* Вибирати будь-який довільний елемент, завантаживши в іншу пару регістрів зсуву елемента щодо адреси, що міститься в НL, і використовуючи команду DAD (16-ковий складання).
ПОШУК В ТАБЛИЦІ
Оскільки в процесорах 8080 і 8085 відсутня індексація, то адреса, необхідний для пошуку в таблиці, повинен обчислюватися явно з використанням команди DAD. Як і під час роботи з масивами, пошук в таблиці є простим, якщо таблиця містить 8-розрядні елементи даних; складніше, коли таблиця містить більш довгі елементи або ж адреси. У цьому випадку можуть бути корисні команди XCHG, PCHL і SPHL, але вони вимагають, щоб програміст поміщав результати у визначені пари регістрів.
РОБОТА з символами
Найпростіший спосіб роботи з символами в процесорах 8080 і 8085 полягає у поводженні з ними як з 8-розрядними числами без знака. Букви та цифри становлять упорядковану послідовність набору символів в кодах ASCII (наприклад, представлення літери А в коді ASCII на одиницю менше, ніж подання букви В). Додаток В) в кінці книги містить повний набір символів ASCII.
Перетворення КОДІВ
Дані можуть бути перетворені з одного коду в інший за допомогою арифметичних або логічних операцій (якщо співвідношення кодів просте) або за допомогою пошуку в таблицях (якщо це співвідношення складне).
Арифметичні операції ПІДВИЩЕНОЇ ТОЧНОСТІ
Арифметичні операції підвищеної точності вимагають ряду 8-розрядних операцій. Необхідно виконувати наступне:
* Спочатку очистити прапор переносу, тому що ніколи не відбувається переносу в молодші байти або позики з них;
* Використовувати команди складання з перенесенням (ADC) або віднімання з позику (SBB) для виконання 8-розрядних операцій, які включають перенесення або позику з попередньої операції.
Множення і ділення
Існує багато способів виконання множення. Один з підходів полягає в заміні множення невеликих цілих чисел на певну коротку послідовність додавань і зрушень вліво. Поділ на число, що є ступенем 2, можна виконати за допомогою низки логічних зрушень вправо. Як розмножаться або діляться числа зі знаком, то необхідно звертати увагу на відділення знака від абсолютної величини. Логіка зрушення повинні бути замінені на арифметичні, що зберігають знаковий розряд.
Обробки списків
Якщо елементи списків зберігаються в пам'яті в послідовних адреси, то такі списки можна обробляти так само, як масиви. Якщо два масиви утворюють черги або ланцюжка, то стає очевидною обмеженість даного набору команд, що виражається в наступному:
* Не передбачена індексація;
* Непряма адресація можлива тільки через пари регістрів;
* Адреса в парах регістрів можуть бути використані тільки для одержання або записи 8-розрядних даних.
ПОШИРЕНА СТРУКТУРИ ДАНИХ
Більш поширені структури даних можна обробляти за допомогою процедур, призначених для роботи з масивами, таблицями та списками. До поширених структурам даних відносяться черзі або зв'язані списки, а також стеки.
СПОСОБИ ПЕРЕДАЧІ ПАРАМЕТРІВ
Найбільш загальними способами передачі параметрів у мікропроцесорах 8080 і 8085 є наступні:
* У регістрах. Доступними є сім 8-розрядних регістрів загального призначення (A, B, C, D, E, H та L), при цьому три пари регістрів (B, D і H) можуть служити для передачі адрес.
* У заданій області пам'яті. Для реалізації цього підходу найпростіше помістити базовий адреса заданої області в регістри H і L. Зухвала програма до передачі управління підпрограмі повинна зберігання інформації в пам'яті і завантажити базовий адреса в регістри H і L.
* У пам'яті програми безпосередньо за викликом підпрограми.
* У стеку.
ПРОСТИЙ введення - виведення
Простий введення - висновок можна виконати, використовуючи або 8-розрядні адреси пристроїв, або 16-розрядні адреси пам'яті. Переваги адрес пристроїв полягають у тому, що вони коротше і використовують окремий адресний простір. Недолік полягає в тому, що команди IN і OUT містять адреси пристроїв і допускають лише пряму адресацію, тобто команди IN і OUT вимагають, щоб були визначені адреси; в цьому випадку відсутній прямий спосіб передачі адрес пристроїв введення - виведення у вигляді параметрів, так щоб одна програма введення - виведення підтримувала багато пристроїв. З іншого боку, якщо порти введення - виведення займають адреси пам'яті, то за допомогою будь-яких команд, які звертаються до пам'яті, може виконуватися також введення - виведення. Проблеми, пов'язані з цим підходом, полягають у його нестандартність, що створює труднощі в тих випадках, коли треба відрізнити передачі введення - виведення від передач в пам'яті, а також коли потрібно, щоб деяка область пам'яті була зарезервована для пристроїв введення - виведення.
СТАН ТА УПРАВЛІННЯ
Сигнали стану і управління можуть оброблятися так само, як будь-які інші дані. Єдина особливість полягає в тому, що процесор не може читати з порту висновку; якщо необхідно знати поточний стан порту висновку, необхідно зберігати копію даних в оперативній пам'яті.
Периферійні Інтегральні мікросхеми
У системах 8080 і 8085 найбільш загальними периферійними інтегральними мікросхемами є послідовний інтерфейс 8251, програмований таймер 8253 і паралельні інтерфейс 8255. Всі ці пристрої можуть виконувати безліч функцій, більшість з яких подібно до функцій самого мікропроцесор. Звичайно, периферійні інтегральні мікросхеми виконують менше різних функцій, ніж процесор, і діапазон цих функцій суттєво вже. У цій частині книги описується пристрій 8255.
НАПИСАННЯ ПРОГРАМ, ЩО ПРАЦЮЮТЬ по перериванню
У більшості систем переривання 8080 і 8085 використовуються команди RST і вхідні сигнали, які передають управління за певними адресами пам'яті. Всі команди RST і вхідні сигнали зберігають старе значення програмного лічильника у вершині стека, але не зберігають автоматично інші регістри. Слово стану процесора (PSW) містить акумулятор (старший байт) і прапори (молодший байт). Переривання повинні бути дозволені явно за допомогою команди EI безпосередньо перед командою RET, що закінчує обслуговує програму. Команда EI затримує дійсний дозвіл переривань на один такт команди під уникнення зайвої запису адреси повернення в стек.
Збільшення швидкодії ПРОГРАМ
Прискорити виконання можна тільки визначивши, де втрачається час. Для цього необхідно визначити, які цикли процесор виконує найбільш часто. Основний вплив на зниження витрат часу часто виконуваного циклу надає лічильник числа циклів. Таким чином, важливо визначити, як часто виконуються команди, і працювати далі з циклами в порядку частоти їх виконання.
Після того, як уточнено, які цикли виконуються найбільш часто, час їх виконання можна зменшити, використовуючи наступні правила:
* Виключення надлишкових операцій;
* Реорганізація циклу так, щоб зменшувалася кількість команд переходу;
* Використання лінійної здібності команд замість підпрограм;
* Використання для тимчасового зберігання стек замість певних адрес пам'яті;
* Призначення регістрів таким чином, щоб отримати максимальний виграш від спеціалізованих команд, як LHLD, SHLD, XCHG, XTHL і PCHL;
* Скрізь, де можливо, для роботи з 16-розрядними даними використання 16-разряднвх команд;
* Використання команд MVI M, INR M і DCR M для роботи з даними пам'яті;
* Використання команд MOV, MVI, INR, DCR, INX, DCX, SHLD, LHLD, XCHG, XTHL, PUSH, POP, PCHL і SPHL для роботи з даними в регістрах;
* Використання RST, PCHL або RET як коротких команд переходу;
* Організація низки умовних переходів таким чином, щоб була мінімізація середнього часу виконання;
* Перевірка на умови, за яких послідовність команд не виконується, і обхід цієї послідовності для випадку виконання умов.
Звичайний шлях до зниження часу виконання полягає в заміні довгих послідовностей команд таблицями. Якщо не передбачені спеціальні виходи або не введені елементи логіки програми, то за допомогою окремого перегляду таблиці можуть виконуватися ті ж операції, що і за допомогою послідовності команд. Ціною цього є необхідність у витратах на додаткову пам'ять, але при її наявності це може бути виправдане. Якщо ємність пам'яті достатня, то пошук в таблиці може бути раціональним підходом, навіть якщо багато записів її однакові. Крім того, що прискорюється робота, пошук в таблиці зазвичай легше програмувати і простіше змінювати.
Зменшення довжини ПРОГРАМИ
Довжину програми можна значно зменшити, виділивши загальні послідовності команд і замінивши їх підпрограмами. У результаті виходить одна копія цих команд замість декількох копій.
Пошук по таблиці зазвичай вимагає більшого об'єму пам'яті, але знижує час виконання.
Розділ 2. РЕАЛІЗАЦІЯ ДОДАТКОВИХ КОМАНД І СПОСОБОВ АДРСАЦІІ
У цьому розділі показано, як реалізувати команди і способи адресації, які не входять в набір команд 8080 або 8085. Звичайно, немає вибору команд, що включав би всі можливі комбінації. Розробник повинен вибирати набір команд, виходячи з того, скільки кодів операцій можливе, наскільки легко можуть бути виконані додаткові комбінації і як часто вони можуть використовуватися. Опис додаткових команд і способів адресації не означає, що основний набір команд є неповним або ж погано розробленим.
РОЗШИРЕННЯ НАБОРУ КОМАНД
Команди поділяються на такі групи: арифметичні, логічні, передачі даних, переходу, перепустки, виклику підпрограми, повернення з підпрограми і змішані. Типи операндів для кожного типу команд обговорюються у відповідному порядку: байт, слово, десятковий операнд, розряд, число, складовою операнд. Під час обговорення способів адресації використовується наступний порядок: пряма, непряма, безпосередня, індексний, регістрова, автоіндексірованіе з попереднім збільшенням адреси, автоіндексірованіе з попередніми зменшенням адреси, автоіндексірованіе з наступним зменшенням адреси, непряма з попередніми індексуванням, і непряма з подальшому індексуванням.
Арифметичні КОМАНДИ
До цієї групи включені наступні команди: додавання, додавання з прапором перенесення, віднімання, віднімання при перестановці операндів, віднімання з прапором переносу (позика), збільшення на 1, зменшення на 1, множення, ділення, порівняння, отримання доповнення до двох (негативного числа ) і розширення. Для зручності ті команди, приналежність яких до конкретної категорії неясна, повторюються у всіх категоріях, до яких вони могли б бути віднесені.
ЛОГІЧНИХ КОМАНДИ
Ця група включає наступні команди: логічне І, логічне АБО, логічне виключає Або, логічне НЕ (доповнення), зсув, циклічний зсув та перевірку. Вона включає також ті арифметичні команди (такі, як складання з акумулятора з самим собою), які виконують логічні функції.
КОМАНДИ ПЕРЕДАЧІ ДАНИХ
Ця група включає команди завантаження, запам'ятовування, пересилання, обміну, введення, виведення, очищення та установки. Крім того, вона включає арифметичні команди (такі як віднімання акумулятора з самого себе), які заносять певне значення або вміст будь-якого регістра в акумулятора або інший регістр призначення, не змінюючи при цьому даних.
КОМАНДИ ПЕРЕХОДУ
Ця група включає наступні види переходів:
1. Команди безумовного переходу
* Перейти побічно;
* Іти до індексу, припускаючи, що базовий адреса таблиці адрес знаходиться в регістрах Н і L, а індекс в акумуляторі;
* Перейти і зв'язати, тобто передати управління за адресою DEST, зберігши поточний стан лічильника команд в регістрах Н і L.
2. Команди умовного переходу
* Перейти при рівності нулю;
* Перейти при нерівність нуля;
* Перейти, якщо значення рівні;
* Перейти, якщо значення не рівні;
* Перейти, якщо значення позитивне;
* Перейти, якщо значення негативне;
* Переходи з урахуванням знака;
* Перейти, якщо більше (без урахування знака), тобто якщо операнди не рівні і при порівнянні не потрібно позики;
* Перейти, якщо значення не більше (без урахування знака), тобто якщо порівнювані операнди рівні або при їх порівнянні потрібно позику;
* Перейти, якщо значення менше (без урахування знака), тобто якщо порівняння без знака вимагає позики;
* Перейти, якщо значення не менше (без урахування знака), тобто якщо порівняння без знака не вимагає позики.
КОМАНДИ ПРОПУСКУ
У мікропроцесорах 8080 або 8085 команда пропуску може бути виконана за допомогою команди переходу з відповідному адресою призначення. Ця адреса призначення повинен спрямовувати на команду, наступну після тієї, яка стоїть безпосередньо за командою переходу. Дійсне число пропускаються байтів буде змінюватися, так як команди мікропроцесорів 8080 і 8085 можуть мати довжину 1-3 байти.
КОМАНДИ виклик підпрограми І ПОВЕРНЕННЯ З підпрограм
1. Команда безумовного дзвінка.
У мікропроцесорах 8080 або 8085 непрямий виклик може бути виконаний за допомогою звернення до проміжної підпрограмі, яка переходить на побічно спричинюється підпрограму.
2. Команда умовного дзвінка.
У мікропроцесорі 8080 або 8085 умовний виклик підпрограми може бути виконаний за допомогою послідовностей команд для умовного переходу. Єдина відмінність полягає в тому, що команди переходу до дійсним адресами призначення повинні бути замінені на команди виклику підпрограм.
Команди повернення з підпрограм поділяються на:
1. Команди безумовного повернення
2. Команди умовного повернення
3. Команди повернення з пропуском
4. Команди повернення після переривання
ЗМІШАНІ КОМАНДИ
До цієї категорії входять наступні команди: ні операції, запис у стек, отримання з стека, зупинка, очікування, захоплення (програмне переривання) та інші, що не потрапили в опис раніше категорії команд.
ДОДАТКОВІ спосіб адресації
1. Непряма адресація. У процесорах 8080 і 8085 непряму адресацію можна виконати за допомогою завантаження непрямих адрес в регістри Н і L, використовуючи команду LHLD. Після цього звернення до регістру М є еквівалентом непрямої операції. Таким чином, цей процес завжди включає два кроки. Крім того, можна використовувати також пари регістрів В і D в командах LDAX і STAX.
2. Індексний адресація. Індексний адресацію можна виконати, додаючи індекс за допомогою команди DAD до бази. Зрозуміло, що програмне складання вимагає додаткового часу виконання.
3. Предувеліченіе. При предувеліченіі адресний регістр перед використанням автоматично збільшується. У процесорі 8080 або 8085 предувеліченіе може бути реалізовано за допомогою збільшення пари регістрів перед її використанням як адреси.
4. Послеувеліченіе. При послеувеліченіі адресний регістр після використання в команді автоматично збільшується. У процесорі 8080 або 8085 послеувеліченіе може бути реалізовано за допомогою збільшення пари регістрів після її використання в якості адреси.
5. Предуменьшеніе. При предуменьшеніі адресний регістр перед використанням автоматично зменшується. У процесорі 8080 ілі8085 предуменьшеніе може бути виконано за допомогою зменшення пари регістрів перед її використанням як адреси.
6. Послеуменьшеніе. При послеуменьшеніі адресний регістр після використання автоматично зменшується. У процесорі 8080 або 8085 Послеуменьшеніе може бути виконано за допомогою зменшення пари регістрів після використання її як адресу.
7. Непряма адресація з попередніми індексуванням (прединдексірованіе). При прединдексірованіі процесор повинен спочатку обчислити індексний адресу, а потім використовувати цю адресу побічно. Так як таблиця, для якої проводиться індексування, повинна містити двухбайтние непрямі адреси, індексування має супроводжуватися множенням на 2.
8. Непряма адресація з подальшою індексацією (послеіндексірованіе). При послеіндексірованіі процесор повинен спочатку отримати непрямий адресу, а потім використовувати його як базу для індексують?? анія.
Розділ 3. Поширена помилка
ПРОГРАМУВАННЯ У цій главі описуються поширені помилки в програмах на мові асемблера 8080 і 8085. Заключний розділ цього розділу присвячений опису часто зустрічаються помилок в драйверах вводу-виводу і програмах обслуговування переривань. Ця глава переслідує наступні цілі:
* Попередити програміста про можливих неприємних місцях і джерела помилок,
* Описати ймовірні джерела помилок програмування,
* Підкреслити ті методи і застереження, які обговорювалися в розділах 1 і 2,
* Інформувати програмістів, що займаються підтримкою математичного забезпечення, про можливі місця помилок і неправильних тлумачень,
* Дати починаючому програмісту відправну точку у складному процесі виявлення та виправлення помилок.