Аналитический огляд книжки Л. А. Левенталь, У. Сэйвилл Програмування мовою ассемблера для мікропроцесорів 8080 і 8085
Простой введення — висновок можна виконати, використовуючи чи 8-разрядные адреси пристроїв, чи 16-разрядные адреси пам’яті. Переваги адрес пристроїв у тому, що вони коротше й використовують окреме адресне простір. Недолік у тому, що команди IN і OUT містять адреси пристроїв і допускають лише пряму адресацію, т. е. команди IN і OUT вимагають, щоб було визначено адреси; в цьому випадку відсутня… Читати ще >
Аналитический огляд книжки Л. А. Левенталь, У. Сэйвилл Програмування мовою ассемблера для мікропроцесорів 8080 і 8085 (реферат, курсова, диплом, контрольна)
Аналитический огляд книжки Ланс А. Левенталь, Уинтроп Сэйвилл «Програмування мовою ассемблера для мікропроцесорів 8080 і 8085 » .
ПРЕДМЕТ: Програмування Микро-ЭВМ
Студенты: Терехов Д. А. Терехова О.Н.
МОСКОВСКИЙ ДЕРЖАВНИЙ ІНСТИТУТ РАДІОТЕХНІКИ, ЕЛЕКТРОНІКИ І АВТОМАТИКИ (ТЕХНІЧНИЙ УНИВЕРСИТЕТ)
Москва 1997 г.
Глава 1. ОБРОБКА МАССИВОВ
Элемент масиву найпростіше вибрати, помістивши адресу в регістри М і 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, З, 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, множення, розподіл, порівняння, отримання доповнення до двох (негативного числа) і розширення. Для зручності ті команди, приналежність яких до конкретної категорії незрозуміла, повторюються переважають у всіх категоріях, до яких можуть бути отнесены.
ЛОГИЧЕСКИЕ КОМАНДЫ
Эта група входять такі команди: логічне І, логічне АБО, логічне ЯКИЙ ВИКЛЮЧАЄ АБО, логічне НЕ (доповнення), зрушення, циклічний зрушення і перевірку. Вона містить також арифметичні команди (такі, як складання з акумулятора із собою), які виконують логічні функции.
КОМАНДЫ ПЕРЕДАЧІ ДАННЫХ
Эта група включає команди завантаження, запам’ятовування, пересилки, обміну, введення, виведення, очищення установки. З іншого боку, воно охоплює арифметичні команди (такі як віднімання акумулятора про себе), які заносять певне значення чи вміст будь-якого регістру в акумулятора або інший регістр призначення, не змінюючи у своїй данных.
КОМАНДЫ ПЕРЕХОДА
Эта група входять такі види переходов:
Команди безумовного перехода Перейти косвенно;
Перейти сьогодні за індексом, припускаючи, що базовий адресу таблиці адрес перебуває у регістрах М і L, а індекс в аккумуляторе;
Перейти і зв’язати, тобто. передати управління з адресою DEST, зберігши поточний стан лічильника команд в регістрах М і L.
Команди умовного перехода Перейти при рівність нулю;
Перейти при нерівності нулю;
Перейти, якщо значення равны;
Перейти, якщо значення не равны;
Перейти, якщо значення положительное;
Перейти, якщо значення отрицательное;
Переходы з урахуванням знака;
Перейти, якщо більше (не враховуючи знака), тобто. якщо операнды нерівні і за порівнянні не потрібно заема;
Перейти, якщо значення максимум (не враховуючи знака), тобто. якщо порівнянні операнды рівні чи за її порівнянні потрібно заем;
Перейти, якщо значення менше (не враховуючи знака), тобто. якщо порівняння без знака вимагає заема;
Перейти, якщо значення незгірш від (не враховуючи знака), тобто. якщо порівняння без знака не вимагає заема.
КОМАНДЫ ПРОПУСКА
В мікропроцесорах 8080 чи 8085 команда пропуску можуть виконати з допомогою команди переходу з відповідному адресою призначення. Цей адресу призначення повинен вказувати на команду, таку після тієї, що стоїть безпосередньо за командою переходу. Справжнє число пропускаемых байтів змінюватиметься, оскільки команди мікропроцесорів 8080 і 8085 може мати довжину 1−3 байта.
КОМАНДЫ ВИКЛИКУ ПІДПРОГРАМ І ПОВЕРНЕННЯ ІЗ ПОДПРОГРАММ
Команда безумовного вызова.
В мікропроцесорах 8080 чи 8085 непрямий виклик можуть виконати з допомогою звернення до проміжної подпрограмме, яка переходить побічно на викликувану подпрограмму.
Команда умовного вызова.
В микропроцессоре 8080 чи 8085 умовний виклик підпрограми можуть виконати з допомогою послідовностей команд для умовного переходу. Єдина відмінність полягає у цьому, що команди початку дійсним адресами призначення повинні прагнути бути замінені на команди виклику подпрограмм.
Команды повернення з підпрограм поділяються на:
Команды безумовного возврата Команды умовного возврата Команды повернення з пропуском Команды повернення після прерывания.
СМЕШАННЫЕ КОМАНДЫ
В цю категорію входять такі команди: немає операції, запис в стік, з стека, громовідвід, очікування, захоплення (програмне переривання) та інші, які потрапили до опис раніше категорії команд.
ДОПОЛНИТЕЛЬНЫЕ СПОСОБИ АДРЕСАЦИИ
Косвенная адресація. У процесорах 8080 і 8085 непряму адресацію можна виконати з допомогою завантаження непрямих адрес в регістри М і L, використовуючи команду LHLD. Після цього звернення до регістру М є еквівалентом непрямої операції. Отже, той процес завжди включає два кроку. З іншого боку, можна використовувати також пари регістрів У і D в командах LDAX і STAX.
Індексна адресація. Индексную адресацію можна виконати, додаючи індекс з допомогою команди DAD до бази. Зрозуміло, що програмне складання має потребу часу выполнения.
Предувеличение. При предувеличении адресний регістр перед використанням автоматично збільшується. У процесорі 8080 чи 8085 предувеличение може бути реалізований з допомогою збільшення пари регістрів перед її використанням як адреса.
Послеувеличение. При послеувеличении адресний регістр після використання їх у команді автоматично збільшується. У процесорі 8080 чи 8085 послеувеличение може бути реалізований з допомогою збільшення пари регістрів після його використання газу як адреси.
Предуменьшение. При предуменьшении адресний регістр перед використанням автоматично зменшується. У процесорі 8080 или8085 предуменьшение може бути здійснене з допомогою зменшення пари регістрів перед її використанням як адреси.
Послеуменьшение. При послеуменьшении адресний регістр після використання автоматично зменшується. У процесорі 8080 чи 8085 Послеуменьшение може бути здійснене з допомогою зменшення пари регістрів після використання у ролі адреса.
Непряма адресація з попереднім индексированием (предындексирование). При предындексировании процесор повинен спочатку обчислити індексний адресу, та був використовувати ця адреса побічно. Оскільки таблиця, на яку виробляється індексування, повинна містити двухбайтные непрямі адреси, індексування має супроводжуватись множенням на 2.
Непряма адресація з наступним индексированием (послеиндексирование). При послеиндексировании процесор повинен спочатку отримати непрямий адресу, та був використовувати як базу для индексирования.
ГЛАВА 3. ПОШИРЕНІ ПОМИЛКИ ПРОГРАММИРОВАНИЯ
В цієї главі описуються поширені помилки у програмах мовою ассемблера 8080 і 8085. Заключний розділ даної глави присвячений опису часто можна зустріти помилок в драйверах вводу-виводу і програмах обслуговування переривань. Ця глава переслідує такі цели:
Попередити програміста про можливі неприємних місцях та джерела ошибок,.
Описати ймовірні джерела помилок программирования,.
Наголосити ті методи лікування й застереження, що обговорювалися розділах 1 і 2,.
Інформувати програмістів, котрі займаються підтримкою математичного забезпечення, про можливі місцях помилок, і неправильних толкований,.
Дати початкуючому програмісту відправну точку важкого процесі виявлення й виправлення ошибок.
Конечно, ніякої список помилок може бути повним, тим щонайменше, дану у цієї главі опис допоможе читачеві налагоджувати більшість программ.
КЛАССИФИКАЦИЯ ПОМИЛОК ПРОГРАММИРОВАНИЯ
Рассмотренные помилки програмування для мікропроцесорів 8080 і 8085 можна розділити ми такі категории:
Перестановка операндов чи частин операндов. До типовим помилок цього були ставляться перестановка операндов, вказують на джерело та призначення в командах пересилки, переставлення формату, у якому запам’ятовуються 16-разрядные значення, зміна при вычитаниях і сравнениях.
Неправильне використання прапорів. Типові помилки следующие:
використання не проти того прапора, який у цьому даному випадку повинен перевірятися (як, наприклад, прапора знака замість прапора переноса),.
условный перехід після команд, які впливають даний флаг, инвертирование умов переходу (особливо в використанні прапора нуля),.
неправильный умовний перехід у випадках рівності випадковий зміна прапора перед умовним переходом.
Змішування регістрів і пар регістрів. Типова помилка полягає у працювати з регістром (У, D чи М) замість пари регістрів з аналогічним именем.
Змішування адрес і передачею даних. До типовим помилок ставляться використання безпосередньої адресації замість прямий адресації чи навпаки, змішування регістрів з осередками пам’яті, адресуемыми через пари регистров.
Використання невірних форматів. Типові помилки перебувають у використанні формату BCD (десяткового) замість двоичного чи навпаки, і використання двоичного і шестнадцатеричного коду замість ASCII.
Неправильна роботу з масивами. Звичайна помилка полягає у виході поза межі массивов.
Неврахування неявних ефектів. До типовим помилок ставляться використання акумулятора, пари регістрів, покажчика стека, прапорів чи осередків пам’яті не враховуючи впливу що у роботі команд. Більшість помилок викликаються командами, що дають непередбачені, неявні чи непрямі результаты.
Помилки при завданні необхідних початкових умов окремих програм чи микро-ЭВМ загалом. Більшість програм вимагає ініціалізації лічильників, непрямих адрес, регістрів, прапорів і осередків для тимчасового зберігання. Микро-ЭВМ загалом вимагає ініціалізації всіх загальних осередків у ОЗУ (наголосимо непрямі адреси — й счетчики).
Неправильна організація програми. До типовим помилок ставляться на обхід або повторення секцій ініціалізації, помилкове зміна регістрів з адресами чи лічильниками і втрата проміжних чи остаточних результатов.
Обычным джерелом помилок, про котрих тут не розглядаються, є конфлікт між програмою користувача і системними програмами. Простим прикладом такого конфлікту є намагання зберігати дані програми користувача в осередках пам’яті системної програми. І тут щоразу, коли виконується системна програма, змінюються дані, які потрібні для програми пользователя.
Более складні джерела конфліктів пов’язані і системи переривань, портами виводу-введення-висновку, стеком і прапорами. Системні програми зрештою повинні експлуатувати ті ж ресурси, як і програми користувача. У цьому зазвичай, у системних програмах передбачається збереження та своєчасне відновлення програмної середовища, в якої працюють на користувальні програми, але ці часто призводить до трудноуловимым чи несподіваних наслідків. Зробити таку операційну систему, що б цілком прозорою для користувача — це завдання, порівнянна з виробленням правив і законів чи склепінь про податки, які мали б лазівок чи побічних эффектов.
РАСПОЗНОВАНИЕ ПОМИЛОК АССЕМБЛЕРОМ
Большинство ассемблеров негайно розпізнає найпоширеніші помилки, такі как:
Невизначений код операції (зазвичай неправильне написання або відсутність двокрапки чи метки);
Невизначений ім'я (часто це неправильне написання або відсутність певного имени);
Зрадливий символ (наприклад, 2 в двоичном числі чи У в десятковому числе);
Неправильне значення (зазвичай число, яке дуже велика для 8 чи 16 разрядов);
Відсутня операнд;
Подвійне визначення (одному й тому імені присвоюються два різних значения);
Неприпустима мітка (наприклад, мітка, запропонована псевдооперации, не допускає метки);
Відсутність мітки (наприклад, при псевдооперации EQU, на яку потрібно метка).
Эти помилки неприємні, але де вони легко поправні. Єдина труднощі виникає тоді, коли помилка (така, як відсутність точки з коми у рядки з коментарем) наводить асемблер в «замішання », результатом чого є низка безглуздих повідомлень про ошибках.
Существует, проте, багато простих помилок, які асемблер неспроможна розпізнати. Програмісту слід пам’ятати, що його програма може містити такі помилки, навіть якщо асемблер і повідомив про неї. Типові такі примеры.
Пропущені строки.
Пропущені определения.
Помилки в написанні, коли запис як така допустима.
Позначення команд як комментариев.
Якщо команді, яка працює із парою регістрів, задається одинарний регистр.
Якщо вводиться неправильна цифра, така як Х в десятковому чи шестнадцатеричном числі чи 7 в двоичном числе.
В ассемблері можуть розпізнаватися лише помилки, які передбачив його розробник. Програмісти часто здатні помилятися, які розробник було і уявити, такі помилки можливо знайти під час перевірки програм вручну рядок за строчкой.
РАСПРОСТРАНЕННЫЕ ПОМИЛКИ У ДРАЙВЕРАХ ВВЕДЕННЯ — ВЫВОДА
Так як більшість помилок в драйверах виводу-введення-висновку пов’язано і з аппаратурным, і з програмним забезпеченням, вони важко піддаються класифікації. Наведемо деякі можливі случаи.
Змішування портів введення і вывода.
Спроба виконати операції, які фізично невозможны.
Упущені з цього виду неявних ефектів аппаратуры.
Читання чи запис без перевірки состояния.
Ігнорування різницю між введенням і выводом.
Помилка за збереження копії виведених данных.
Читання даних доти, як вони стабілізуються, чи під час їхньої изменения.
Відсутність зміни полярності даних, що передаються до влаштуванню чи то з устрою, котрий з негативною логикой.
Змішування дійсних портів вводу-виводу з внутрішніми регістрами інтегральних схем ввода-вывода.
Неправильне використання двунаправленных портов.
Відсутність очищення стану після виконання команди ввода-вывода.
РАСПРОСТРАНЕННЫЕ ПОМИЛКИ У ПРОГРАМАХ ПРЕРЫВАНИЯ
Многие помилки, пов’язані з перериваннями, залежать як від апаратного, і програмного забезпечення. Найпоширенішими помилками є следующие.
Отсутствие дозволу прерываний.
Відсутність збереження регистров.
Збереження чи відновлення регістрів в неправильному порядке.
Дозвіл переривань до ініціалізації пріоритетів та інших параметрів системи прерываний.
Неврахування те, що реакція на переривання включає збереження лічильника команд в вершині стека.
Відсутність заборони переривань під час многобайтных передач чи виконання послідовності команд, яка повинна прерываться.
Відсутність дозволу переривань після послідовності команд, які мають виконуватися без прерываний.
Відсутність очищення сигналу, що викликає прерывание.
Помилка спілкування з основний программой.
Відсутність збереження й відновлення приоритетов.
Відсутність дозволу переривань від додаткових апаратурних входів, яке виконується з допомогою очищення розрядів масок в регістрі I.
Неправильне використання розрядів дозволу переривань в командах SIM.
ВВЕДЕНИЕ
У ПРОГРАМНИЙ РАЗДЕЛ
Программный розділ містить набори підпрограм мовою ассемблера для мікропроцесорів 8080 і 8085. Кожній подпрограмме подані запровадження і коментар; за кожної підпрограмою слід за крайнього заходу один приклад її використання. Запровадження містить таку інформацію: призначення підпрограми, процедуру її виконання, використовувані регістри, час виконання, розмір пам’яті, необхідний для програми її даних, і навіть спеціальні випадки, вхідні і вихідні условия.
Каждая підпрограма зроблено настільки загальної, наскільки це возможно.
Во всіх підпрограмах використали наступний метод передачі параметров:
Перший 8-разрядный параметр передається в акумуляторі, другий 8-разрядный параметррегістрі У, а третійв регістрі С.
Перший 16-разрядный параметр передається в регістрах М і L, у своїй старший байтв регістрі М. Другий 16-разрядный параметр передається в регістрах D і Є зі старшим байтом в D.
Більша число параметрів передається в стеці, безпосередньо чи опосередковано. Вважається, що у підпрограму здійснюється з допомогою команди CALL, яка поміщає адресу повернення вершину стека і, отже, вище параметров.
Для більшості коротких підпрограм було встановлено час выполнения.
Приведенная тут документація завжди містить по крайнього заходу один типовий приклад, що складає приблизне чи максимальне час выполнения.
Приводятся такі подпрограммы:
Перетворення кодов.
Перетворення двійкових даних в код BCD;
Перетворення даних в коді BCD в двоичные;
Перетворення двійкових даних в шестнадцатеричные в коді ASCII;
Перетворення шестнадцатеричных даних в коді ASCII в двоичные;
Перетворення двоичного вересня десяткове до коді ASCII;
Перетворення десяткового вересня коді ASCII в двоичное;
Трансляція малих літер літер на прописные;
Перетворення коду символу із системи ASCII до системи EBCDIC;
Перетворення коду символу із системи EBCDIC до системи ASCII.
Фундаментальна обізнаність із масивами і индексирование.
Заповнення памяти;
Пересилання блоков;
Індексування двовимірного масиву байтов;
Індексування двовимірного масиву слов;
Індексування Nмірного массива;
Арифметические операции.
16- розрядне вычитание;
16- розрядне умножение;
16- розрядне деление;
16- розрядне сравнение;
Двоичное складання із підвищеною точностью;
Двоичное віднімання із підвищеною точностью;
Двоичное множення із підвищеною точностью;
Двоичное розподіл із підвищеною точностью;
Двоичное порівнювати з підвищеної точностью;
Десяткове складання із підвищеною точностью;
Десяткове віднімання із підвищеною точностью;
Десяткове множення із підвищеною точностью;
Десяткове розподіл із підвищеною точностью;
Десяткове порівнювати з підвищеної точностью;
Фундаментальна обізнаність із розрядами і сдвиги.
Установка разряда;
Очищення разряда;
Перевірка разряда;
Виділення поля разрядов;
Запис поля разрядов;
Арифметичний зрушення вправо із підвищеною точностью;
Логічний зрушення вліво із підвищеною точностью;
Логічний зрушення вправо із підвищеною точностью;
Циклічний зрушення вправо із підвищеною точностью;
Циклічний зрушення вліво із підвищеною точностью;
Робота зі строками.
Порівняння строк;
Об'єднання строк;
Пошук позиції подстроки;
Копіювання подстроки з строки;
Видалення подстроки з строки;
Вставка подстроки в строку;
Операції з массивами.
Підсумовування 8-разрядного массива;
Підсумовування 16-разрядного массива;
Пошук мінімального елемента довжиною 1 байт;
Пошук максимального елемента довжиною 1 байт;
Двоїчний поиск;
Швидка сортировка;
Тест ОЗУ;
Таблиця переходов;
Введення — вывод.
Читання рядки з терминала;
Запис рядки на пристрій вывода;
Перевірка і генерація 16-разрядного коду контролю у избыточности;
Диспетчер таблиці пристроїв введення — вывода;
Ініціалізація портів введення — вывода;
Затримка в миллисекундах;
Прерывания.
Небуферизованный введення — висновок про прерываниям з використанням программируемого інтерфейсу зв’язку 8251;
Небуферизованный введення — висновок про прерываниям з використанням программируемого паралельного інтерфейсу 8255;
Буферизованный введення — висновок про прерываниям з використанням программируемого інтерфейсу зв’язку 8251;
Годинник реального часу й календарь.
АРИФМЕТИЧЕСКИЕ ОПЕРАЦИИ
Шестнадцатиразрядное вычитание Вычитаются два 16-разрядных числа. У цьому прапор перенесення діє і як заем.
Процедура. Просто з зменшуваного віднімається від'ємник за одним байту воднораз, починаючи з молодших байтів. При вирахуванні старших байтів враховується позику. При вирахуванні старших байтів встановлюються флаги.
Шестнадцатиразрядное умножение Умножаются два 16-разрядных операнда і повертається до молодше за значенням слово (16-разрядное) произведения.
Процедура. Використовується звичайний механізм складання і зрушень, у якому множимое додається до часткового твору щоразу, як у множителе перебуває одиничний розряд. Для правильного відносного розташування операндов і твори на програмі 15 раз здійснюється зрушення вліво множника і проміжного твори (тобто. на число розрядів в множителе мінус один). У цьому старший (16-ї) розряд твори теряется.
Шестнадцатиразрядное деление Делятся два 16-разрядных операнда і повертається до приватне і залишок. Є дві вхідні точки: SDIV16 ділить два 16-разрядных операнда зі знаками, тоді як USDIV16 ділить два 16-разрядных операнда без знаків. При розподілі на 0 прапор перенесення встановлюється один, а приватне і залишок рівні 0; інакше прапор перенесення очищается.
Процедура. Якщо операнды мають знаки, то визначається знак приватного й беруться абсолютні значення негативних операндов. З іншого боку, повинен зберігатися знак діленого, оскільки він визначає знак залишку. Потім із допомогою алгоритму зрушень і вирахування виконується беззнаковое розподіл. Приватне і подільне зсуваються вліво, у своїй щоразу, коли пробне віднімання був успішним, одиничний розряд міститься у приватне. Якщо операнды мали знаки, то програма повинна перетворити в негативне число (тобто. вилучити з 0) приватне чи залишок, якщо вони повинні прагнути бути негативними. При розподілі безпомилково прапор перенесення очищається, а під час ділення на 0 — встановлюється. З іншого боку, якщо дільник дорівнює 0, то приватне і залишок також рівні 0.
Шестнадцатиразрядное сравнение Сравниваются два 16-разрядных операнда і відповідно встановлюються прапори. Прапор нуля завжди вказує, були операнды рівні. Якщо операнды були беззнаковые, то прапор перенесення вказує, який із них (прапор перенесення = 1, якщо від'ємник більше, і 0 — інакше). Якщо операнды мають знаки, то прапор знака вказує, який із них (прапор знака дорівнює 1, якщо від'ємник більше, і 0 — інакше); у своїй враховується переповнювання по доповнення до двох, і коли вона відбувається, то прапор знака инвертируется.
Процедура. Спочатку перевіряється, чи може статися переповнювання по доповнення і двох. Це можна тільки у разі, якщо знаки операндов різняться. Якщо переповнювання по доповнення до двох можливо, то віднімається молодший байт вычитаемого з зменшуваного. Якщо молодші байти рівні, то встановлюються то встановлюються прапори за результатом вирахування старших байтів. Якщо молодші байти нерівні, до виходу повинен очиститься прапор нуля (з допомогою логічного операції АБО із першого, але за незмінних інших прапорах). Якщо переповнювання по доповнення до двох може відбутися, то встановлюється прапор знака за сигналом зменшуваного. Це виконується з допомогою завантаження в акумулятор старшого байта зменшуваного перед установкою прапора знака.
Двоичное складання чисел із підвищеною точностью Складываются два многобайтовых двійкових числа. Числа зберігаються у пам’яті в такий спосіб, що й наймолодші за значенням байти займають наймолодші адреси. Сума заміняє перше слагаемое.
Процедура. Спочатку очищається прапор перенесення, та був складаються операнды, по байту за один раз, починаючи від самих молодших за значенням байтів. Наприкінці прапор перенесення відбиває результат складання найстарших байтів. Довжина 0 викликає негайний вихід без сложения.
Двоичное віднімання чисел із підвищеною точностью Вычитаются два многобайтовых беззнаковых двійкових числа. Обидва числа зберігаються у пам’яті таким чином що й наймолодші за значенням байти займають наймолодші адреси. Різниця заміщає зменшуване. Довжина чисел дорівнює 255 байт чи меньше.
Процедура. Спочатку очищається прапор перенесення, та був обчислюються операнды, по байту за раз, починаючи від самих молодших за значенням байтів. Наприкінці прапор перенесення відбиває результат вирахування найстарших байтів. Довжина 0 викликає негайний вихід без вирахування.
Двоичное множення чисел із підвищеною точностью Умножаются два многобайтовых беззнаковых двійкових числа. Обидва числа зберігаються у пам’яті таким чином що й наймолодші за значенням байти займають наймолодші адреси. Твір заміщає множимое. Довжина чисел дорівнює 255 байт менше. Щоб зберігалася сумісність коїться з іншими двоичными операціями підвищеної точності, повертаються лише молодші за значенням байти произведения.
Процедура. Використовується звичайний механізм складання і зрушень, у якому множимое додається до часткового твору щоразу, як у множителе перебуває одиничний розряд. Проміжне твір і множимое зсуваються на число розрядів в множимом плюс один; цей додатковий цикл зрушує остаточний прапор перенесення у творі. Повне беззнаковое проміжне твір подвійний довжини зберігається в осередках пам’яті й у множимом. Довжина 0 викликає негайний вихід без умножения.
Двоичное розподіл чисел підвищеної точности Делятся два многобайтовых беззнаковых двійкових числа. Обидва числа зберігаються у пам’яті таким чином що й наймолодші за значенням байти займають наймолодші адреси. Приватне заміщає подільне; адресу молодшого за значенням байта залишку перебуває у регістрах H і L. Довжина чисел дорівнює 255 байт менше. Якщо ні помилок, прапор перенесення очищається; під час спроби розподілу на нуль прапор перенесення встановлюється один, подільне залишається без зміни, а залишок дорівнює 0.
Процедура. З допомогою звичайного алгоритму зрушень і вирахування здійснюється розподіл, у своїй зсувається приватне і подільне і одну міститься у подільне щоразу, коли віднімання успішно. Результат пробного вирахування зберігається в додатковому буфері; якщо пробне віднімання успішно, то покажчики цього буфера і буфера діленого просто переключаються (тобто. буферы змінюються місцями). Якщо визначається, що дільник нульовий, негайно здійснюється вихід із програми розвитку й встановлюється прапор перенесення. Інакше прапор перенесення очищается.
Двоичное порівняння чисел із підвищеною точностью Сравниваются два многобайтовых беззнаковых двійкових числа і відповідно встановлюються прапори. Прапор нуля завжди вказує, були операнды рівні. Якщо операнды були беззнаковые, то прапор перенесення вказує, який із них (прапор перенесення = 1, якщо від'ємник більше, і 0 — інакше). Прапор перенесення встановлюється один, якщо від'ємник більше зменшуваного; у протилежному разі прапор перенесення очищається. Отже, прапори встановлюються як і, коли б від'ємник віднімалося з уменьшаемого.
Процедура. Порівнюються операнды побайтно, починаючи від самих старших байтів і хоча продовжують до того часу, коли будуть знайдено нерівні відповідні байти. Якщо всі байти рівні, здійснюється вихід із прапором нуля, встановленому один. Зауважимо, що пі порівнянні робота приміром із операндами, починаючи від самих старших байтів, тоді як із вирахуванні - починаючи від самих младших.
ЗАКЛЮЧЕНИЕ
Проанализировав подану до розгляду книжку Ланс А. Левенталь, Уинтроп Сэйвилл «Програмування мовою ассемблера для мікропроцесора 8080 і 8085 «виділимо гідності даної публикации:
матеріал викладений у добре структурованої форме;
автори багаторазово повторюють вік деяких частин матеріалу для кращого усвоения;
книга оснащена докладним покажчиком, словником термінів та приложениями.
К недоліків цієї книжки можна віднести следующее:
під час написання Програмної розділу застосовувалися стандартні і загальновідомі алгоритми вычислений;
вік деяких частин описів дано занадто стисло й призначені для програмістів мають досвіду у написанні програм мовою ассемблера;
відсутня додаток з узагальнюючим описом мнемоніки команд і коротким поясненням виконуваних дій — необхідне програмістів початкового уровня.
По нашої оцінці книга варта досвідчених програмістів, бажаючих одержати відомості для використання мікропроцесорів 8080 чи 8085 в прикладних целях.
Список литературы
Для підготовки даної праці були використані матеріали із сайту internet.