Мова програмування Assembler
Порівняльна характеристика структури мов програмування Assembler та C. Вивчення поняття "об'єктного файлу" та "виконуваного модуля". Розгляд функцій переривання, введення/виведення символу та стрічки, екранного режиму та малювання крапки і прямої.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | курс лекций |
Язык | украинский |
Дата добавления | 18.06.2010 |
Размер файла | 348,8 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
"Pass-dependent construction encountered"
(виявлена конструкція, що залежить від проходу)
Якщо зазначений параметр /m, то Турбо Асемблер буде правильно асемблювати такий модуль, але не буде оптимізовувати код програми, видаляючи операції NOP (незалежно від зазначеного числа проходів). У цьому випадку виводиться повідомлення:
"Module is pass dependent - compatibility pass was done"
(модуль залежить від проходу - виконаний прохід для сполучення)
Приклад:
TASM /M2 TEST1
Ця команда вказує TASM, що асемблюваня модуля TEST1 потрібно виконувати в два проходи.
Параметр /ML
Функція: Інтерпретує розходження в регістрах букв ідентифікаторів.
Синтаксис: /ML
Примітки: Параметр /ML вказує Турбо Асемблеру, що в всіх ідентифі- каторах потрібно розрізняти букви різного регістра (рядкові і прописні). Звичайно рядкові і прописні букви рассматриваются, як еквівалентні, тому імена ABCxyz, ABCXYZ і abcxyz позначають той самий ідентифікатор. Якщо ви задаєте параметр /ML, те ці три ідентифікатори будуть вважатися різними. Проте, навіть після завдання параметра /ML ключові слова Асемблера можна вводити як у верхньому, так і в нижньому регістрі. Ключові слова являють собою идентификаторы, убудовані в Асемблер, що мають спеціальне значення (мнемоніки інструкцій, директиви й оператори).
Приклад:
TASM /ML TEST1
де TEST1.ASM містить наступні оператори:
ABC DW 1; це не дублюючий ідентифікатор
abc DW 0; у ключових словах допускається використовувати різний
Mov Ax,[Bp] регістр
Параметр /MU
Функція: Перетворить ідентифікатори у верхній регістр.
Синтаксис: /MU
Примітки: Параметр /MU вказує Асемблеру, що потрібно игнорировать регістр у всіх ідентифікаторах. За замовчуванням у Турбо Асемблере задано, що в ідентифікаторах усі букви нижнього регистра повинні перетворю- ватися у верхній регістр (якщо це не скасовано за допомогою директиви /ML).
Приклад:
TASM /MU TEST1
При цьому всі ідентифікатори будуть перетворені у верхній регістр (що задано за замовчуванням):
EXTRN myfunc:NEAR
call myfunc;
не важливо, як була визначена функція: MYFUNC, Myfunk,...
Параметр /MV#
Функція: Задає максимальну довжину ідентифікаторів.
Синтаксис: /MV#
Примітки: Даний параметр задає максимальну довжину идентифи- каторов, що буде розрізняти TASM. Наприклад, при завданні параметра /mv3 TASM буде інтерпретувати ідентифікатори ABCC і ABCD, як той самий ідентифікатор.
Параметр /MX
Функція: Задає розрізнення на на рядкові і прописні букви (верхній і нижній регістр) у зовнішніх і загальнодоступних идентификаторах.
Синтаксис: /MX
Примітки: Параметр /MX повідомляє Турбо Асемблеру, що различать регістр букв потрібно тільки в зовнішніх (External) і общедоступных (Public) ідентифікаторах. Всі інші ідентифікатори в исходном файлі будуть інтерпретуватися, як набрані у верхньому регістрі.
Використовувати дану директиву випливає при виклику процедур з інших модулів, що асемблировались чи компілювалися так, що збереглося розходження в рядкових і прописних буквах (наприклад, модулів, що компілювалися в Турбо Сі).
Приклад:
TASM /MX TEST1
де TEST1 містить наступні вихідні рядки:
EXTRN Cfunc:NEAR
myproc PROC NEAR
call Cfunc
Параметр /N
Функція: Придушує у файлі лістинга таблицю ідентифікаторів.
Синтаксис: /N
Примітки: Параметр /N показує, що наприкінці файлу листинга ви не хочете використовувати звичайну таблицю ідентифікаторів. Звичайно напри- кінці файлу лістинга міститься повна таблиця ідентифікаторів, де показані всі ідентифікатори, їхні імена і значення.
Ви повинні задати файл лістинга або явно (у командной рядку), або за допомогою параметра /L. У противному випадку параметр /N не приводить до якихось дій.
Приклад:
TASM /L /N TEST1
Параметр /P
Функція: Перевіряє наявність "некоректного" коду в захищеному режимі.
Синтаксис: /P
Примітки: Параметр /P визначає, що ви хочете одержати попередження при будь-якій інструкції, що генерує в захищеному режимі "некоректний" (impure) код. Інструкції, що переміщають данийные в пам'ять шляхом перевизначення регістра CS: у захищеному режимі розглядаються, як некоректні, оскільки вони в захищеному режимі можуть працювати невірно, якщо не прийняти спеціальних мір.
Цей параметр потрібно використовувати тільки в тому випадку, якщо ви пишете програму, виконувану на процесорі 80286 чи 80286 у захищеному режимі.
Приклад:
TASM /P TEST1
де TEST1 містить наступні операторы:
.286P
CODE SEGMENT
temp DW ?
mov CS:temp,0 ; у захищеному режимі може выполняться некоректно
Параметр Q
Функція: Придушує запису .OBJ, що не вимагаються при компоновке.
Синтаксис: /Q
Примітка: Даний параметр видаляє з одержуваного в результаті файлу (файлів) .OBJ запису про авторські права і залежність файлів. Цей параметр не слід вказувати, якщо ви використовуєте утиліту MAKE чи аналогічні програми, що при роботі учитывают ці записи.
Параметр /R
Функція: Генерує реальні інструкції з крапкою, що плаває.
Синтаксис: /R
Примітки: Параметр /R вказує Турбо Асемблеру, що потрібно генерувати реальні інструкції з крапкою, що плаває, (замість генерації емуляційних інструкцій із крапкою, що плаває,). Використовуйте цей параметр, якщо ви хочете виконувати свою програму на машинах, оснащеній арифметичним співпроцесором 80х87.
Дія даного параметр змінює на зворотній параметр /E (при цьому генеруються емуляційні інструкції з крапкою, що плаває).
Якщо у вихідному файлі ви використовуєте директиву EMUL, то вона скасує дія інструкції /R, зазначеної в командному рядку.
Параметр командного рядка /R має той же ефект, що і використовування на початку вихідного файлу директиви NOEMUL і збігається з дією параметра командного рядка /JNOEMUL.
Приклад:
TASM /R SEGANT
TPC /$N+ /$E- TRIG.PAS
Перша команда асемблює модуль з реальними інструкціями з крапкою, що плаває. Другий командний рядок компілює вихідний модуль Паскаля з реальними інструкціями з крапкою, що плаває, який компонується з об'єктним файлом Асемблера.
Параметр /S
Функція: Задає послідовне впорядкування сегментів.
Синтаксис: /S
Примітки: Параметр /S вказує Турбо Асемблеру, що сегменти в об'єктному файлі потрібно розмістити в тому порядку, у якому Турбо Асемблер виявляє їх у вихідному коді. За замовчуванням Турбо Асемблер використовує саме таке упорядочивание сегментів, якщо ви не змінили його за допомогою параметра /A у командному рядку чи у файлі конфігурації.
Якщо за допомогою директиви .ALPHA у вихідному коді ви задали впорядкованість сегментів за абеткою, то ця директива скасує параметр /S, що задається в командному рядку.
Приклад:
TASM /S TEST1
По даній команді створюється об'єктний файл (TEST1.OBJ), сегменты якого упорядковані в тім порядку, як вони містяться в вихідному файлі.
Параметр /T
Функція: Придушує виведення повідомлень при умовному асемблювання.
Синтаксис: /T
Примітки: Параметр /T придушує усю виведену Турбо Ассемблеру на екран інформацію, крім попереджень і повідомлень про помилки, що виникають у результаті асемблювання.
Ви можете використовувати даний параметр при асемблювані декількох модулів, коли на екран бажано виводити тільки з спілкування про помилки.
Приклад:
TASM /T TEST1
Параметр /V
Синтаксис: /V
Примітки: Параметр /V використовується з метою сумісності. Він не приводить ні до яких дій і не робить впливу на ассемблирование.
Параметр /W
Функція: Керує генерацією попереджуючих повідомлень.
Синтаксис: /W
W-[клас попереджень]
W+[клас попереджень]
Примітки: Параметр /W керує висновком Турбо Асемблером поперед- жуючих повідомлень.
Якщо ви просто вкажете параметр /W, то будуть виводитися "слабкі" попередження. Такі попередження показують, що ви можете трохи поліп- шити ефективність вашої програми.
Якщо ви задасте параметр /W- без класу попереджень, то усі поперед- ження забороняються. Якщо за параметром вказується клас попереджень, то забороняються тільки ці попередження. Кожне попереджуюче повідом-лення має ідентифікатор із трьох букв:
ASS - мається на увазі використання 16-розрядного сегмента;
BRK - вимагаються квадратні дужки;
ICG - неефективна генерація коду;
LCO - переповнення лічильника адреси;
OPI - відкритий блок умови IF;
OPP - відкрита процедура;
OPS - відкритий сегмент;
OVF - арифметичне переповнення;
PDC - конструкція, що залежить від проходу;
PRO - запис у пам'ять у захищеному режимі вимагає перевизначення регістра CS;
RES - слово зарезервоване;
TPI - неприпустимо для Турбо Паскаля.
Якщо ви вказуєте параметр /W+ без класу попередження, то всі попере-дження будуть дозволені. Якщо ви задаєте параметр /W+ із класом попереджень з попереднього списку, то будуть раз вирішені тільки ці попередження.
За замовчуванням Турбо Асемблер спочатку починає асемблювання вихідного файлу з дозволом усіх попереджень, крім попереджень про неефективність коду (ICG).
Для керування висновком визначених повідомлень на заданому ділянці програми у файлі з вихідним кодом ви можете використовувати директиви WARN чи NOWARN. Більш докладно про ці директиви распозначається в Главі 3 "Довідкового посібника".
Приклад:
TASM /W TEST1
Наступний оператор у програмі TEST1.ASM виведе попереджуюче повідомлення про те, що не з'явиться на екрані, якщо не зазначений параметр /W:
mov bx,ABC; попередження про неефективність коду
ABC = 1
При завданні командного рядка:
TASM /W-OVF TEST2
якщо файл TEST2.ASM містить директиву:
DW 1000h = 20h
попередження генеруватися не будуть.
Параметр /X
Функція: Включає в лістинг блоки умовного асемблирования.
Синтаксис: /X
Примітки: Якщо при обчисленні блоків IF, IFNDEF, IFDEF і т.д. виходить значення FALSE, те параметр /X приводить до тому, що оператори, що містяться усередині умовного блоку, будуть включены в лістинг асемблирования. по даній директиві в лістинг будуть також включені самі директиви умовного асемблирования (звичайно вони в лістинг не включаються).
Ви повинні в командному чи рядку за допомогою параметра /L задати також необхідність генерації файлу лістинга, інакше параметр /X діяти не буде.
Приклад:
TASM /X TEST1
Параметр /Z
Функція: Виводить на екран поряд з повідомленнями про помилку з-ответствующие рядка вихідного тексту.
Синтаксис: /Z
Примітки: Параметр /Z вказує Асемблеру, що при генірації повідомлення про помилку на екран потрібно вивести відповідну рядок вихідного файлу (де ця помилка виник). Що викликала ошибку рядок виводиться перед повідомленням про помилку. При забороні даного параметра Турбо Асемблер просто виводить повідомлення, описывающее помилку.
Приклад:
TASM /Z TEST1
Параметр /ZD
Функція: Дозволяє включення в об'єктні файли інформації про номерах рядків.
Синтаксис: /ZD
Примітки: Параметр /ZD приводить до того, що Турбо Ассемблер буде поміщати в об'єктні файли інформацію про номери рядків. Це дозволяє автономному отладчику фірми Borland (Турбо отладчику) виводити на екран поточне місце у вихідному коді, але не позволяет йому здійснювати доступ до елементів даних. Якщо при спробі виконання налагодження програми за допомогою Турбо налагоджувача вам не вистачить пам'яті, ви можете використовувати париметр /ZD для одних модулів і параметр /ZI - для інших.
Приклад:
TASM /ZD TEST1
Параметр /ZI
Функція: Дозволяє включення в об'єктний файл інформації для налагодже- ння.
Синтаксис: /ZI
Примітки: Параметр /ZI вказує Турбо Асемблеру, що в об'єктний файл потрібно вивести повну інформацію для налагодження. Ця інформація містить у собі запису про номери рядків (для синхронизации висновку на екран вихідного тексту) і інформацію про типи данийных, що дозволяє модифікувати і перевірити дані програми. Параметр /ZI дозволяє вам використовувати всі засоби Турбо налагоджувача для проходження програми і перевірки і зміни ваших елементів даних. Ви можете використовувати параметр /ZI для всіх модулів чи програми тільки для тих з них, налагодження яких вас цікавить. Оскільки параметр /ZI додає інформацію в об'єктные і виконувані файли, може виявитися небажаним його ис-користування для всіх модулів програми при виконанні програми Турбо отладчиком (наприклад, може виникати ситуація недостачі памяти).
Приклад:
TASM /ZI TEST1
Непрямі командні файли
У будь-який момент, коли ви вводите командний рядок, Турбо Ассемблер дозволяє вам задавати непрямий командний файл, з по-міццю вказівки перед його ім'ям символу @. Наприклад:
TASM /DTESTMODE @MYPROJ.TA
Ця команда приводить до того, що вміст файлу MYPROJ.TA стає частиною командного рядка (як якби ви ввели її здержимое безпосередньо). Це корисне засобу дозволяє вам помістити найбільше часто використовувані командні рядки і списки файлів в окремий файл. При цьому немає необхідності поміщати весь командний рядок в один непрямий файл, оскільки в одному командному рядку допускається використовувати трохи вихідних файлів зі звичайними аргументами, наприклад:
TASM @MYFILES @IOLIBS /DBUF=1024
У такий спосіб ви можете використовувати довгий список стандартных файлів і параметрів, завдяки чому можна легко змінювати поведення Асемблера при кожнім асемблировании.
Ви можете або помістити усі імена і параметри файлів в одну рядок командного файлу, або розбити їх на кілька рядків, як це необхідно.
3 Відлагоджувальник td та прогін програми.
4 Основні команди пересилання даних.
Лекція 7
1. Прапорці операцій та команди порівняння
2. Створення розгалуження
3. Циклічні конструкції. Використання регістру CX для організації лічильного циклу
4. Реентерні та рекурсивні підпрограми. Математичні команди
1. Прапорці операцій та команди порівняння
ФЛАГОВИЙ РЕГІСТР
Наступний матеріал даної глави вимагає більш детального ознайомлення з флаговим регістром. Цей pегістр містить 16 біт прапорів, що керуються різними командами для індикації стану операції. В усіх випадках прапори зберігають своє значення доти, поки інша команда не змінить його. Флаговий регістр містить наступні дев'ять використовуваних біт (зірочками відзначені невикористовувані біти):
Номер біта: 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
Прапор: * * * * O D I T S Z * A * P * C
Розглянемо ці прапори в послідовності праворуч ліворуч.
CF (Carry Flag) - прапор переносу. Містить значення "переносів" (0 чи 1) зі старшого розряду при арифметичес ких операціях і деяких операціях зрушення і циклічного зрушення (див. гл.12).
PF (Parity Flag) - прапор парності. Перевіряє молодші вісім біт результат- тов операцій над даними. Непарне число біт приводить до установки цього прапора в 0, а парне - у 1. Не варто плутати прапор парності з бітом контро- лю на парність.
AF (Auxiliary Carry Flag) - додатковий прапор переносу. Встановлюється в 1, якщо арифметична операція приводить до переносу четвертого праворуч біта (біт номер 3) у регистро виття однобайтовой команді. Даний прапор має відношення до арифметичних операцій над символами коду ASCII і до десяткових упакованим полям.
ZF (Zero Flag) - прапор нуля. Встановлюється в якості результату aрифметичних команд і команд порівняння. Як це не дивно, ненульовий результат приводить до установки нульового значення цього прапора, а нульовий - до установки одиничного значення. Існуюча невідповідність є, однак, логічно правильною, тому що 0 позначає "ні" (т.е. результат не дорівнює нулю), а одиниця позначає "так" (т.е. результат дорівнює нулю). Команди умовного переходу JE і JZ перевіряють цей прапор. SF (SIgn Flag) - знаковий прапор. Встановлюється у відповідності зі знаком результату (старшого біта) після арифметичних опеpацій: позитивний результат установлює 0, а негативний - 1. Команди умовного переходу JG і JL перевіряють цей прапор.
TF (Trap Flag) - прапор покрокового виконання. Цей прапор вам уже прихо- дилося встановлювати, коли використовувалася до манда Т в отладчике DEBUG. Якщо цей прапор встановлений в единичное cостояние, те процесор переходить у режим покрокового виконання команд, тобто в кожен момент виконується одна команда під користувальницьким керуванням.
IF (Interrupt Flag) - прапор переривання. При нульовому складаючись нии цього прапора переривання заборонені, при одиничному - дозволені.
DF (DIrection Flag) - прапор напрямку. Використовується в строкових опера- ціях для визначення напрямку передачі даних. При нульовому стані команда збільшує вміст регістрів SI і DI, викликаючи передачу даних ліворуч праворуч, при нульовому - зменшує вміст цих регістрів, викликаючи передачу даних праворуч ліворуч (див. гл.11).
OF (Overflow Flag) - прапор переповнення. Фіксує арифметическое переповнення, тобто перенос в/из старшого (знакового) біта при знакових арифметичних операціях. Як приклад: команда CMP порівнює два операнда
і воздействуте на прапори AF, CF, OF, PF, SF, ZF. Однак, немає необхідності перевіряти всі ці прапори по окремості. У сле- прикладі, що дує, перевіряється чи містить регістр BX нульове значення:
CMP BX,00 ;Порівняння BX з нулем
JZ B50; Перехід на B50 якщо нуль. (дії при ненулі)
B50: ... ;Крапка переходу при BX=0
Якщо BX містить нульове значення, команда CMP установлює прапор нуля ZF в одиничний стан, і можливо змінює (чи немає) інші прапори. Команда JZ (перехлд якщо нуль) перевіряє тільки прапор ZF. При одиничному значенні ZF, що позначає нульова ознака, команда передає керування на адресу, зазначений у її операнде, тобто на мітку B50.
Команда порівняння
Команда порівняння CMP порівнює два числа, віднімаючи одне з іншого. Вона не записує результат, але прапори стану установлює відповідно до результату. Ця команда змінює тільки прапори. У програмі команда порівняння використовується так само, як і команда вирахування; однак команди порівняння з заемом не існує. Порівняння з підвищеною точністю вимагає ледве більше зусиль, чим порівняння чи байтів слів. Фактично в цих випадках багато простіше використовувати команду вирахування замість команди порівняння. На рис.П4.11 показане порівняння пари 32=бітових чисел у пам'яті з використанням регістра AX у якості області тимчасового збереження. Це порівняння визначає, яке з чисел більше. Програма в результаті свого виконання встановлює коди умови. Прапор переносу визначає, яке з чисел більше: якщо прапор дорівнює 1, число VALUE більше.
Програма перевіряє два 32=бітових числа на рівність. Програма зберігає молодший результат, а потім комбінує його зі старшим, і в такий спосіб з'ясовує еквівалентність результату нулю. Команда OR описана в наступному розділі, а тут істотно те, що вона комбінує два значення так, що остаточне значення дорівнює 0 тоді і тільки тоді, коли обоє вихідних значення рівні 0. Результат цієї підпрограми порівняння - значення прапора нуля; якщо він дорівнює 1, числа рівні.
2. Створення розгалуження
Розглядаючи призначення команд умовного переходу випливає пояснити характер їхнього використання. Типи даних, над якими виконуються арифметичні операції й операції порівняння визначають якими командами користатися: беззнаковими чи знаковими. Беззнакові дані використовують усі біти як біти даних; характерним прикладом є символьні рядки: імена, адреси і натуральні числа. У знакових даних самий лівий біт являє собою знак, причому якщо його значення дорівнює нулю, то число позитивне, і якщо одиниці, те негативне. Багато числових значень можуть бути як позитивними так і негативними. Як приклад припустимо, що регістр AX містить 11000110, а BX - 00010110. Команда CMP AX,BX порівнює вміст регістрів AX і BX. Якщо дані беззнакові, то значення в AX більше, а якщо знакові - те менше. Переходи для беззнакових даних.
Будь-яку перевірку можна кодувати одним із двох мнемонічних кодів. Наприклад, JB і JNAE генерує той самий об'єктний код, хоча позитивну перевірку JB легше зрозуміти, чим негативну JNAE.
Переходи для знакових даних
Команди переходу для умови дорівнює чи нуль (JE/JZ) і не дорівнює чи не нуль (JNE/JNZ) присутні в обох списках для беззнакових і знакових даних. Стан дорівнює/нуль відбувається поза залежністю від наявності знака.
Специальные арифметические проверки
Ще одна команда умовного переходу перевіряє чи дорівнює вміст регістра CX нулю. Ця команда необов'язково повинна pасполагаться безпосередньо за командою арифметики чи порівняння. Одним з місць для команди JCXZ може бути початок циклу, де вона перевіряє чи містить регістр CX ненульове значення. Не поспішаєте поки заучувати ці команди напам'ять. Запам'ятаєте тільки, що для беззнакових даних є переходи по складаючись ниям дорівнює, чи вище нижче, а для беззнакових - дорівнює, чи більше менше. Переходи по перевірках прапорів переносу, переповнення і паритету мають особливе призначення. Асемблер транслює мнемонічні коди в об'єктний код незалежно від того, яку з двох команд ви застосували. Однак, команди JAE і JGE будучи явно однаковими, перевіряють різні прапори.
3. Циклічні конструкції. Використання регістру CX для організації лічильного циклу
Але більш ймовірно підпрограма повинна виконувати визначене число циклів. Команда LOOP, що служить для цієї мети, використовує початкове значення в регістрі CX. У кожнім циклі команда LOOP автоматично зменшує вміст регістра CX на 1. Поки значення в CX не дорівнює нулю, керування передається за адресою, зазначеному в операнде, і якщо в CX буде 0, керування переходить на слудующую після LOOP команду. Програма на рис. 7.2, що ілюструє використання команди LOOP, виконує дії, аналогічні прикладу на рис. 7.1 за винятком того, що після десяти циклів програма завершується. Команда MOV инициализирует регістр CX значенням 10. Оскільки команда LOOP використовує регістр CX, то в програмі для подвоєння початкового значення 1 замість регістра CX використовується DX. Команда JMP A20 замінена командою LOOP і для ефективності команда ADD AX,01 замінена командою INC AX (збільшення AX на 1). Аналогічно команді JMP, операнд команди LOOP визначає відстань від кінця команди LOOP до адреси мітки A20, которої додається до вмісту командного покажчика. Для команди LOOP ця відстань повинна бути в межах від -128 до +127 байт. Якщо операнд перевищує ці границі, то ассемблер видасть повідомлення "Relative jump out of range" (перевищені границі переходу). Для перевірки команди LOOP рекомендується змінити відповідним чином програму, приведену на рис.7.1, виконати її асемблювання, компоновку і перетворення в COM-файл. Для трасування всіх десяти циклів використовуйте налагоджувач DEBUG. Коли в значення регістрі CX зменшиться до нуля, вміст регістpів AX, BX і DX буде відповідно тичина. 000B, 0042 і 0400. Для виходу з відлагоджувача введіть команду Q. Додатково існує два різновиди команди LOOP - це LOOPE (чи LOOPZ) і LOOPNE (чи LOOPNZ). Обидві команди також зменшують значення регістра CX на 1. Команда LOOPE передає керування за адресою операнда, якщо регістр CX має ненульове значення і прапор нуля встановлений (ZF=1). Команда LOOPNE передає керування за адресою операнда, якщо регістр CX має ненульове значення і прапор нуля скинутий (ZF=0).
4. Реентерні та рекурсивні підпрограми. Математичні команди
КОМАНДИ ЛОГІЧНИХ ОПЕРАЦІЙ: AND, OR, XOR, TEST, NOT
Логічні операції є важливим елементом у проектуванні мікросхем і мають багато загального в логіку програмування. Команди AND, OR, XOR і TEST - є командами логічних операцій. Ці команди використовуються для скидання й установки біт і для арифметичних операцій у коді ASCII (див.гл.13). Усі ці команди обробляють один байт або одне слово в регістрі або в пам'яті, і встановлюють прапори CF, OF, PF, SF, ZF.
AND: Якщо обоє з порівнюваних бітів рівні 1, то результат дорівнює 1; у всіх інших випадках результат - 0.
OR: Якщо хоча б один з порівнюваних бітів дорівнює 1, то результат дорівнює 1; якщо порівнювані біти рівні 0, то результат - 0.
XOR: Якщо один з порівнюваних бітів дорівнює 0, а іншої дорівнює 1, то результат дорівнює 1; якщо порівнювані біти однакові (обоє - 0 чи обоє - 1) то результат - 0.
TEST: діє як AND-встановлює прапори, але не змінює біти.
Перший операнд у логічних командах вказує на один байт або слово в регістрі або в пам'яті і є єдиним значенням, що може змінюватися після виконання команд.У наступних командах AND,OR і XOR використовуються однакові бітові значення:
AND OR XOR
0101 0101 0101
0011 0011 0011
Результат: 0001 0111 0110
Для наступних незв'язаних прикладів, припустимо, що AL містить 1100 0101, а BH містить 0101 1100:
1. AND AL,BH ;Встановлює в AL 0100 0100
2. OR BH,AL ;Встановлює в BH 1101 1101
3. XOR AL,AL ;Встановлює в AL 0000 0000
4. AND AL,00 ;Встановлює в AL 0000 0000
5. AND AL,0FH ;Встановлює в AL 0000 0101
6. OR CL,CL ;Установлює прапори SF і ZF
Приклади 3 і 4 демонструють спосіб очищення регістра. У прикладі 5 обнуляются ліві чотири біти регістра AL. Хоча команди порівняння CMP можуть бути зрозуміліше, можна застосувати команду OR для наступних цілей:
1. OR CX,CX ;Перевірка CX на нуль
JZ ;Перехід, якщо нуль
2. OR CX,CX ;Перевірка знака в CX
JS ... ;Перехід, якщо негативно
Команда TEST діє аналогічно команді AND, але встановлює тільки прапори, а операнд не змінюється. Нижче наведемо кілька прикладів:
1. TEST BL,11110000B ;Любою з лівих біт у BL
JNZ ... ; дорівнює одиниці?
2. TEST AL,00000001B ;Регістр AL містить
JNZ ... ; непарне значення?
3. TEST DX,OFFH ;Регістр DX містить
JZ ... ; нульове значення?
Ще одна логічна команда NOT встановлює обернене значення біт у чи байті в слові, у чи регістрі в пам'яті: нулі стають одиницями, а одиниці - нулями. Якщо, наприклад, pегістр AL містить 1100 0101, то команда NOT AL змінює це значення на 0011 1010. Прапори не міняються. Команда NOT не еквівалентна команді NEG, що змінює значення з позитивного на нега- тивне і навпаки, за допомогою заміни біт на протилежне значення і додатки одиниці (см."Негативні числа" у гл.1.).
КОМАНДИ ЗРУШЕННЯ І ЦИКЛІЧНОГО ЗРУШЕННЯ
Команди зрушення і циклічного зрушення, що представляють собою частина логічних можливостей комп'ютера, мають наступні властивості:
- обробляють чи байт слово;
- мають доступ до чи регістра до пам'яті;
- зрушують чи уліво вправо;
- зрушують на величину до 8 біт (для байта) і 16 біт (для слова);
- зрушують логічно (без знака) чи арифметично (з знаком).
Значення зрушення на 1 може бути закодоване як непосред cтвенный операнд, значення більше 1 повинне знаходитися в регістрі CL.
Команди зрушення
При виконанні команд зрушення прапор CF завжди містить значення останнього висунутого біта. Існують наступні команди cдвига:
SHR ;Логічний (беззнаковий) зрушення вправо
SHL ;Логічний (беззнаковий) зрушення вліво
SAR ;Арифметичне зрушення вправо
SAL ;Арифметичне зрушення вліво
Наступний фрагмент ілюструє виконання команди SHR:
MOV CL,03 ; AX:
MOV AX,10110111B ; 10110111
SHR AX,1 ; 01011011 ;Зрушення вправо на 1
SHR AX,CL ; 00001011 ;Зрушення вправо на 3
Перша команда SHR зрушує вміст регістра AX вправо на 1 біт. Висунутий у результаті один біт попадає в прапор CF, а самий лівий біт регістра AX заповнюється нулем. Друга команда зсуває вміст регістра AX ще на три біти. При цьому прапор CF послідовно приймає значення 1, 1, 0, а в три лівих біти в регістрі AX заносяться нулі. Розглянемо дію команд арифметичного вправо SAR:
MOV CL,03 ; AX:
MOV AX,10110111B ; 10110111
SAR AX,1 ; 11011011 ;Зрушення вправо на 1
SAR AX,CL ; 11111011 ;Зрушення вправо на 3
Команда SAR має важливу відмінність від команди SHR: для заповнення лівого біта використовується знаковий біт. Таким чином, позитивні і негативні величини зберігають свій знак. У приведеному прикладі знаковий біт містить одиницю. При зрушеннях уліво праві біти заповнюються нулями. Таким чином, результат команд зрушення SHL і SAL ідентичний. Зрушення вліво часто використовується для подвоєния чисел, а зрушення вправо - для розподілу на 2. Ці операції здійснюються значно швидше, ніж команди чи множення розподілу. Розподіл навпіл непарних чисел (наприклад, 5 чи 7) утворить менші значення (2 чи 3, відповідно) і встановлює прапор CF у 1. Крім того, якщо необхідно виконати зрушення на 2 біти, то використання двох команд зрушення більш эффективніше, ніж використання однієї команди з завантаженням регістра CL значенням 2. Для перевірки біта, занесеного в прапор CF використовується команда JC (перехід, якщо є перенос).
Команди циклічного зрушення
Циклічне зрушення являє собою операцію зрушення, при якому висунутий біт займає розряд, що звільнився. Існують наступні команди циклічного зрушення:
ROR ;Циклічне зрушення вправо
ROL ;Циклічне зрушення вліво
RCR ;Циклічне зрушення вправо з переносом
RCL ;Циклічне зрушення вліво з переносом
Наступна послідовність команд ілюструє операцію циклічного зрушення ROR: MOV CL,03 ; BX:
MOV BX,10110111B ; 10110111
ROR BX,1 ; 11011011 ;Зрушення вправо на 1
ROR BX,CL ; 01111011 ;Зрушення вправо на 3
Перша команда ROR при виконанні циклічного зрушення переносить правий одиничний біт регістра BX у ліву позицію, що звільнилася . Друга команда ROR переносить у такий спосіб три правих біти. У командах RCR і RCL у зрушенні бере участь прапор CF. Висуваємий з регістра біт заноситься в прапор CF, а значення CF при цьому надходить у позицію, що звільнилася. Розглянемо приклад, у якому використовуються команди циклічного і простого зрушення. Припустимо, що 32-бітове значення знахо- диться в регістрах DX:AX так, що ліві 16 біт лежать у регістрі DX, а праві - у AX. Для множення на 2 цього значення можливі cлідуючі дві команди:
SHL AX,1 ;Множення пари регістрів
RCL DX,1 ; DX:AX на 2
Тут команда SHL зсуває всі біти регістра AX вліво, причому самий лівий біт попадає в прапор CF. Потім команда RCL зсуває всі біти регістра DX вліво і у правий біт, що звільнився, заносить значення з прапора CF. Арифметичні команди будь-якого мікропроцесора залучають до себе найбільше уваги. Кожний зацікавлений у виконанні арифметичних обчислень, і саме ці команди проробляють таку роботу. Хоча їх небагато, вони виконують більшість перетворень, даних у мікропроцесорі. У реальних же умовах, арифметичні команди займають лише малу частину усіх команд, що виконуються. Команди пересилання використовують більшість принципів роботи команд мікропроцесора 8088, а при вивченні арифметичних команд необхідно розглянути деякі тонкості їх виконання.
Команда додавання
Команда ADD виконує додавання зазначених операндів, представлених у двійковому доповняльному коді. Мікропроцесор поміщає результат на місце першого операнда після того, як складе обох операндів. Другий операнд не змінюється. Команда коректує регістр прапорів у відповід- ності з результатом додавання. Наприклад, команда ADD AX, BX складає вміст регістра BX із вмістом регістра AX, і залишає результат у регістрі AX. Регістр прапорів повідомляє про те, чи був результат нульовим, негативним, чи мав парність, або перенос переповнення. Малюнок 4.8 коротко ілюструє варіанти команди ADD. Існують дві форми додавання, 8=бітове і 16=бітове. У різних формах додавання беруть участь різні регістри. Асемблер стежить за тим, щоб операнди відповідали один одному. Вміст байтового регістра (наприклад, CH) не може бути доданим до комірки пам'яті, яка не має тип BYTE. Якщо комірка пам'яті є одним з операндів, вона може бути або операндом - результатом, або незмінним операндом. Тим самим команда може додати вміст регістра до комірки пам'яті і повернути результат у пам'ять. Одним з операндів може також бути безпосереднє значення. На рис. П4.9 показаний лістинг асемблера з деякими арифметичними командами.
Команда додавання з переносом ADC - це та ж команда ADD, за винятком того, що в суму включається прапор переносу. Для будь-якої форми команди ADD існує порівнювана з нею команда ADC. Обидві команди додавання, як ADD, так і ADC, установлюють рівним 1 прапор переносу, якщо відбувся перенос зі старшого розряду результату. Команда ADD складає два операнда, не звертаючи уваги на прапор переносу, а команда ADC враховує і прапор переносу. Якщо прапор переносу дорівнює 0, результат дорівнює результату виконання команди ADD. Якщо ж прапор переносу дорівнює 1, то результат на 1 більше результату команди ADD. Таким чином, програма може використовувати прапор переносу для операцій підвищеної точності. Малюнок П4.10 ілюструє додавання пари 32=бітових чисел; у прикладі складаються 32-бітові числа поля VALUE1 і поля VALUE2, а результат міститься в полі VALUE2. Помітимо, що один з операндів повинен бути поміщений у регістр. У першому додаванні використовується команда ADD, тому що поточне значення прапора переносу несуттєве для першого додавання. Після відповідного розміщення операндів програма на рис.П4.10 виконує друге додавання за допомогою команди ADC, з урахуванням прапора переносу, встановленого попереднім додаванням. Це також гарний приклад що показує, чому команда MOV не встановлює ніяких прапорів. Якби команда MOV змінювала прапори, виконати правильно друге додавання було б набагато складніше.
Команда вирахування
Команди вирахування SUB і SBB ідентичні командам додавання, за винятком того, що вони виконують вирахування, а не додавання. Ви можете скорегувати рис.4.8 для розрахування, змінивши знак "+" на знак "-". Розрахунок встановлює прапори стану відповідно до результату операції, причому прапор переносу тепер означає позика. Наприклад, команда SUB AX, BX віднімає значення регістра BX зі значення регістра AX, а потім поміщає результат у регістр AX. Прапори стану змінюються так, щоб відбивати результат виконання команди. Команда розрахування з заемом SBB вирішує задачі розрахування підвищеної точності. Команда SBB враховує прапор заема при розрахуванні, тобто значення заема віднімається з результату, отриманого при нормальному розрахуванні. На рис.П4.10 показано розрахування підвищеної точності, виконане з тими ж значеннями, що і додавання. У цьому прикладі значення поля VALUE1 віднімається зі значення поля VALUE2, поміщаючи результат у поле VALUE2.
Арифметика з одним операндом
Команда заперечення NEG - це оператор зміни знака. Вона змінює знак двоичного додаткового коду операнда - байта чи слова. Інші дві команди з одним операндом змінюють значення оперенда на 1. Команда збільшення INC додає 1 до операнду, а команда зменшення DEC віднімає 1 з операнда.За допомогою команд збільшення і зменшення можна переміщати покажчик по масиві комірок пам'яті. Ці команди також можуть реалізувати лічильник циклу. Кожен прохід по циклу зменшує лічильник, а коли його значення досягне 0, цикл завершується. Усі ці однооперандні команди можуть мати в якості операнда як байт, так і слово. Якщо кожна з цих команд вказує комірку пам'яті за допомогою одного з непрямих способів адресації, наприклад [BX+SI], асемблер має потребу в допомозі, тому що йому необхідно знати довжину операнда в пам'яті, щоб породити правильний код операції. Команда може використовувати модифікатори BYTE PTR чи WORD PTR, щоб описати операнд.
Ці три команди впливають на регістр стану точно так само, як це роблять арифметичні команди. Додаток 1, вирахування 1 і вирахування з 0 ідентичні відповідно INC, DEC і NEG; однак команди з одним операндом більш ефективні.
Лекція 8
1. Поняття "переривання"
2. Поділ переривань між BIOS та операційною системою
3. Використання переривань у програмах
4. Основні переривання та їх функції (крім 21h)
1. Поняття "переривання"
Перериванням називається системний сигнал найвищого рівня пріоритету. При виникненні (збудження) переривання, що може мати місце в результаті дій якогось з периферійних пристроїв, або ж дій користувача чи взаємодії якихось компонентів операційної системи, всі інші програми призупиняються, і виконується так званий обробник переривання, який аналізує вміст регістрів та виконує відповідні дії. Загалом, переривання вперше було використано для виходу з помилкових ситуацій, але пізніше їх було пристостовано для обробки ситуацій з найвищим рівнем пріоритету. Переривання в системі розподілено між різними типами периферійних пристроїв, процесором та операційною системою.
Інструкції цієї групи дозволяють використовувати в програмах сервісні функції, забезпечувані через апарат переривань операційної системи. З цією метою генерується програмне переривання, ефект якого подібний ефекту апаратних переривань. Однак, процесор не виконує цикл передачі підтвердження переривання, якщо переривання ініційовано або програмою зв'язане з NMI. Інструкції переривань кожна по-своєму впли- вають на стан прапорів процесора.
ПЕРЕРИВАННЯ
Інструкція INT активізує процедуру, передбачену для обробки переривання з зазначеним номером. Покажчик стека SP зменшується на 2, у стек містяться прапори (у форматі інструкції PUSHF) і прапори TF і IF устанавливаютя в 0 (для заборони покрокового режиму і маскируемых переривань). Потім SP зменшується ще на 2, і в стек заноситься вміст регістра CS. Адреса покажчика переривання (тобто місцезнаходження адреси програми обробки переривання) обчислюється шляхом множення зазначеного в інструкції INT номера на 4: друге слово покажчика заміщає значення регістра CS. SP знову зменшується на 2, і в стек міститься
вміст регістра IP, а в сам IP заноситься перше слово покажчика. Якщо зазначений номер переривання 3, асемблер генерує коротку (1 байт) форму інструкції, відому як переривання по досягненню крапки виходу. Програмні переривання можуть використовуватися як "виклики супервізора", тобто для запиту сервісу операційної системи, зокрема, процедур, написаних для обробки апаратних переривань.
ПЕРЕРИВАННЯ, ЯКЩО Є ПЕРЕПОВНЕННЯ
По інструкції INTO генерується програмне переривання, якщо встановлений у 1 прапор OF; у противному випадку керування передається наступної інструкції без активізації процедури обробки переривання. Інструкція INTO звертається до необхідній процедурі (номер переривання - 4) через покажчик переривання, розташований по 16-ричному адресі 10, встановлює в 0 прапори TF і IF і в іншому працює також, як INT. Інструкція INTO може використовуватися після арифметичних чи логічних операцій для обробки можливих переповнень.
КРАПКА ВИХОДУ
Виконання цієї інструкції еквівалентно перериванню з номером 3 ("досягнута крапка виходу"). Асемблер генерує коротку, 1-байтную машинну інструкцію.
ПОВЕРНЕННЯ З ПЕРЕРИВАННЯ
По інструкції IRET керування повертається в крапку переривання шляхом відновлення зі стека вмісту регістрів IP і CS і значень прапорів, поміщених туди при виникненні переривання. Ця інструкція використовується для виходу як із програмних, так і з апаратних переривань.
2. Поділ переривань між BIOS та операційною системою
У даному розділі представлені основні переривання BIOS. INT 05H (Печатка екрана). Приводить до передачі вмісту екрана на друкувальний пристрій. INT 05H застосовується для внутрішніх цілей, тобто з програм, клавіші Ctrl/PrtSc активізують печатка з клавіатури. Дана операція маскує перери- вання і зберігає позицію курсору.
Примітка: Переривання 00-1F відносяться до BIOS, переривання 20-FF відносяться до DOS і BASIC.
ПЕРЕРИВАННЯ BIOS
У даному розділі приведені основні переривання BIOS. INT 05H Печатка екрана. Виконує виведення вмісту екрана на друкувальний пристрій. Команда INT 05H виконує дану операцію з програми, а натискання клавішею Ctrl/PrtSc - з клавіатури. Операція забороняє переривання і зберігає позицію курсору. INT 10H Керування дисплеєм. Забезпечує екранні і клавіатурні операції, детально описані в главі 9. INT 11H Запит списку приєднаного устаткування. Визначає наявність різних пристроїв у системі, що результують значення і повертає в регістр AX. При включенні комп'ютера система виконує цю операцію і зберігає вміст AX у пам'яті за адресою тичина.410. Значення бітів у регістрі AX:
INT 12H Запит розміру фізичної пам'яті. Повертає в регістрі AX розмір пам'яті в кілобайтах, наприклад, тичина.200 відповідає пам'яті в 512 ДО. Дана операція корисна для вирівнювання розміру програми відповідно до доступного пам'яттю.
INT 13H Дискові операції введення-висновку. Забезпечує операції введення-висновку для дискет і вінчестера, розглянуті в главі 16.
INT 14H Керування комунікаційним адаптером. Забезпечує послідовний введення-виведення через комунікаційний порт RS232. Регістр DX повинний містити номер (0 чи 1) адаптера стику RS232. Чотири типи операції, обумовлені регістром AH, виконують прийом і передачу символів і повертають у регістрі AX байт стану комунікаційного порту.
INT 15H Касетні операції введення-висновку і спеціальні функції для комп'ютерів AT. Забезпечує операції введення-висновку для касетного магнітофона, а також розширені операції для комп'ютерів AT.
INT 16H Уведення з клавіатури. Забезпечує три типи команд уведення з клавіатури, докладно описані в главі 9.
INT 17H Виведення на принтер. Забезпечує виведення даних на друкуючий пристрій. Докладно розглянуто в главі 19.
INT 18H Звертання до BASIC, убудованому в ROM. Викликає BASIC-інтер- претатор, що знаходиться в постійній пам'яті ROM.
INT 19H Перезапуск системи. Дана операція при доступному диску зчитує сектор 1 з доріжки 0 в область початкової завантаження в пам'яті (сегмент 0, зсув 7C00) і передає керування по цій адресі. Якщо дисковод не доступний, то операція передає керування через INT 18H у ROM BASIC. Дана операція не очищає екран і не інніціалізує дані у ROM BASIC, тому її можна використовувати з програми.
INT 1AH Запит і установка поточного часу і дати. Зчитує і записує показання годин у відповідності із значенням у регістрі AH. Для визначення тривалості виконання програми можна перед початком виконання установити годинник у 0, а після вважати поточний час. Відлік часу йде приблизно 18,2 рази в секунду. Значення в регістрі AH відповідає наступним операціям:
AH=00 - Запит часу. У регістрі CX установлюється старийшая частина значення, а в регістрі DX - молодша. Якщо після останнього запиту пройшло 24 години, то в регістрі AL буде не нульове значення.
AH=01 - Установка часу. Час установлюється по регістрам CX (старша частина значення) і DX (молодша частина значення).
Коди 02 і 06 керують часом і датою для AT.
INT 1FH Адреса таблиці графічних символів. У графічному режимі існує доступ до символів з кодами 128-255 у 1ДО таблиці, що містить по вісім байт на кожен символ. Прямий доступ у графічному режимі забезпечується тільки до перших 128 ASCII-символів (від 0 до 127).
ПЕРЕРИВАННЯ DOS
Під час своєї роботи BIOS використовує два модулі DOS: IBMBIO.COM і IBMDOS.COM. Оскільки модулі DOS забезпечують велику кількість різних додаткових перевірок, то операція DOS звичайно простіша у використан- ні і менш машинно залежна, чим їх BIOS аналоги.
Модуль IBMBIO.COM забезпечує інтерфейс із BIOS низького рівня. Ця програма виконує керування введенням-висновком при читанні даних із зовнішніх пристроїв у пам'ять і записи з пам'яті на зовнішні пристрої.
Модуль IBMDOS.COM містить засоби керування файлами і ряд сервісних функцій, таких як блокування і деблокування записів. Коли користуваль- ницька програма видає запит INT 21H, то в програму IBMDOS через регістри передається визначена інформація. Потім програма IBMDOS транслює цю інформацію в один чи декілька викликів IBMBIO, що в свою чергу викликає BIOS. Зазначені зв'язки приведені на наступній схемі:
Користувальницький Вищий Нижчий ROM Зовнішній
Як показано вище, переривання від тичина 20 до тичина 62 зарезервовані для операцій DOS. Нижче приведені найбільш основні з них:
INT 20H Завершення програми. Запит завершує виконання програми і передає керування в DOS. Даний запит звичайно знаходиться в основній процедурі.
INT 21H Запит функцій DOS. Основна операція DOS, яка визиває визначену функцію відповідно до коду в регістрі AH. Призначення функцій DOS описано в наступному розділі.
INT 22H Адреса підпрограми обробки завершення задачі. (см.INT 24H).
INT 23H Адреса підпрограми реакції на Ctrl/Break. (см.INT 24H).
INT 24H Адреса підпрограми реакції на фатальну помилку. У цьому елементі й у двох попередніх містяться адреси, які ініціалізуються системою в префіксі програмного сегмента і, які можна змінити для своїх цілей. Подробиці приведені в технічному описі DOS.
INT 25H Абсолютне читання з диска. Див.гл.17.
INT 26H Абсолютний запис на диск. Див.гл.17.
INT 27H Завершення програми, що залишає її резедентною.
Дозволяє зберегти COM-програму в пам'яті. Докладно дана операція показана в наступному розділі "Резидентні програми".
3. Використання переривань у програмах
Засобу ініціювання й обробки переривань є важливою складовою частиною будь-якої обчислювальної системи, в тому числі і персональної ЕОМ. Механізм переривань забезпечує ефективна взаємодія пристроїв уведення-висновку з мікропроцесором. Переривання цікавлять нас тому, що обробка переривань - це прерогатива програмування на мові асемблера. У високорівневих мовах відсутні засоби роботи з перериваннями на машинному рівні. Переривання звичайно викликаються зовнішніми пристроями. Переривання сигналізує мікропроцесору, щоб він призупинив виконання поточного завдання і приділив увагу зовнішньому пристрою. У IBM PC клавіатура посилає сигнал переривання кожного раз, коли натискається одна з клавіш. Це переривання повідомляє мікропроцесору, що потрібно припинити поточну роботу і вважати символ із клавіатури. Неважко зрозуміти походження терміна "переривання": сигнал переривання "перериває" поточну роботу мікропроцесора. Переривання є гарним поміч- ником для мікропроцесора, оскільки звільняє його від постійного контролю за зовнішніми пристроями. Якби, наприклад, клавіатура не викликала переривання, то мікропроцесору приходилося б постійно перевіряти стан клавіатури, щоб визначити, чи не була натиснута якась із клавіш. Будь-яка написана для ЕОМ програма повинна була б містити ту саму процедуру, і у процесі свого виконання досить часто здійснювати перевірку стану клавіатури. Однак наявність переривання, знімає це обмеження, і програма може виконуватися без такої перевірки. Клавіатура сигналізує мікропроцесору, щораз, коли їй треба передати інформацію мікропроцесору. Після того, як мікропроцесор задовільнить запит клавіатури, він може відновити нормальний хід виконання програми. У мікропроцесорі 8088 обробка переривань багато в чому схожа на виконання підпрограм. Якщо виникає переривання, то воно не може зупинити мікропроцесор під час виконання ним команди. Насамперед мікропроцесор 8088 завершує виконання поточної команди. Потім, не звертаючи уваги на наступну команду програми, він діє як у випадку виклику підпрограми. Мікропроцесор записує адреса наступної команди в стек і переходить до спеціальної підпрограми, названою обробкою переривання. Ця підпрограма містить команди, що вимагаються пристроєм, який визиває переривання. Для клавіатури, в обробку переривання входять зчитування і запис символу в пам'ять для наступного його використання. Після того, як підпрограма обробки переривання закінчила роботу з пристроєм, він здійснює повернення в крапку програми, де відбулося переривання. Мікропроцесор зчитує зі стека адреса повернення, і програма продовжує виконуватися, начебто нічого не відбулося. Оскільки переривання викликається зовнішніми пристроями, воно може відбутися в будь-який момент виконання програми. Неможливо передбачити в програмі ніяких спеціальних мір підготовки до виникнення переривання, тому що для програми момент уведення символу з клавіатури оператором є непередбаченим. Звідси випливає, що підпрограма обробки переривання не повинна модифікувати значення дані, використо- вувані перерваною програмою. У випадку модифікації їх програма після повернення їй керування не зможе виконуватися правильно. Частина процедури переривання полягає в тому, що коли вона виникає, мікропроцесор 8088 автоматично записує в стек деякі дані перерваної програми. У свою чергу, підпрограма обробки переривань відповідає за запис у пам'ять будь-яких інших даних, що вона може змінити в час свого виконання. Звичайно ці дані записуються в стекову пам'ять. Потім, перед поверненням керування перерваній програмі, підпрограма обробки переривань повинна відновити програмні параметри відповідно до їх значення в момент переривання. Факт виникнення переривання не повинен відбитися на виконуваній програмі. Оскільки існує багато пристроїв, що посилають мікропроцесору сигнали переривання, у мікропроцесорі 8088 мається механізм переривання по вектору. Це означає, що мікропроцесор 8088 визначає, який з пристроїв запросив переривання, і передає керування потрібній програмі обробки переривань, що відповідає цьому пристрою. Мікропроцесор автоматично виконує векторизацію запитів на переривання. Програма обробки переривань не повинна перед обслуговуванням пристрою визначати, яке з них запросило переривання. Це зменшує тривалість переривання і спрощує програму його обробки. У програмах зустрічаються такі ділянки, виконання яких не може бути перервано. Можливо, що частина деякої конкретної програми повинна виконуватися дуже швидко для того, щоб одержати визначений результат, або програма працює з даними, що зберігалися у пам'яті, які можуть бути змінені при обробці переривань. У кожному з цих випадків програма повинна мати можливість заборонити переривання, тобто не допускати виконання переривання на цих критичних ділянках програми. Після прохо- дження цих ділянок, функціонування ситеми переривань повинне бути відновлено програмою. Програма не може блокувати систему переривань занадто довго, інакше в обслуговуванні пристрою, який запросив перерива- ння, може відбутися збій. Якщо програма обробки переривання, яке надійш- ло з клавіатури, не встигне обдумати символ перед тим, як оператор надрукує наступний, то цей другий символ може бути загублений. У мікропроцесорі 8088 є можливість увести заборону на всі зовнішні переривання. У IBM PC, крім того, є можливість задавати пристрою, що можуть викликати переривання. Це дозволяє вибрати в програмі найбільш важливі пристрої, яким дозволене переривання, і одночасно заборонити переривання від інших, менш важливих. Методи заборони переривань будуть розглянуті в наступних главах.
4. Основні переривання та їх функції (крім 21h)
Принтери класифікуються по якості друку. Матричний принтер формує символи у виді матриці крапок і забезпечує нормальний, вузький і широкий формати символів. Більш модернізовані матричні принтери забезпечують крапкову графіку, похилий шрифт, жирний друк і подвійну щільність, а також можуть друкувати, наприклад, символи гральних карт і інші алфавітно-цифрові символи. Високоякісні друкуючі пристрої, що тануть, обмежені набором символів на змінної "ромашці" чи барабані, але забезпечують відмінну якість друку і велику розмаїтість принтерів. Багато з високоякісних принтерів забезпечують друк в 10,12 чи 15 символів на дюйм, а також пропорційне розташування пробілів, підкреслення, тіньового і напівжирного друку. Лазерні принтери мають переваги як для матричної графіки, так і для якісного друку текстів. Інша класифікація друкувальних пристроїв зв'язана з інтерфейсами. Комп'ютери IBM PC мають рівнобіжний інтерфейс, що дозволяє передавати одночасно вісім бітів інформації на принтер. Крім того, існує послідовний інтерфейс, який виконує побітову передачу даних. Багато принтерів мають буфер пам'яті, обсягом у декілька тисяч байтів. Принтери також можуть приймати біти контролю на парність (непарність). Принтери повинні "розуміти" спеціальні сигнали з процесора, наприклад, для прогону листа, перекладу чи рядка горизонтальної табуляції. У свою чергу, процесор повинен "розуміти" сигнали від принте- ра, що вказують на кінець папера або стан "зайняте". На жаль багато типів принтерів по різному реагують на сигнали процесора й однією з найбільш складних проблем для програмістів - забезпечити відповідність власних програм наявним друкувальним пристроєм.
Подобные документы
Розгляд особливостей мови програмування С++: основні можливості, характеристика функцій. Аналіз файлів з вхідними даними. Використання похідних класів як ефективний засіб об’єктно-орієнтованого програмування. Способи роздруківки графічного вирішення.
курсовая работа [510,9 K], добавлен 14.03.2013Робота з цілими значеннями за допомогою арифметичних команд. Механізм роботи команд передачі керування мови Assembler. Типи даних "FPU" та система регістрів. Програма та її структура на мові Assembler, робота з директивами. Текстовий режим відеоадаптера.
лабораторная работа [1,7 M], добавлен 31.05.2014Особливості редагування за допомогою текстового редактора NotePad вхідного файлу. C++ як універсальна мова програмування, знайомство с функціями. Характеристика графічних засобів мови С. Аналіз основних понять об’єктно-орієнтованого програмування.
курсовая работа [123,3 K], добавлен 14.03.2013Характеристика методів та етапів створення простих програм на мові програмування С++. Особливості структури та порядку запуску програми. Функції вводу і виводу та маніпулятори мови С++. Робота з одновимірними масивами. Символьна інформація та рядки.
дипломная работа [91,2 K], добавлен 19.06.2010Характеристика мов програмування. Історія виникнення мови C#, її особливості, версії та нові можливості. Приклад програм виведення на екран, виведення поточної дати та часу та програми музичного програвача. Програмний код та результат виконання програм.
контрольная работа [321,3 K], добавлен 13.06.2012Розробка програми в візуальному середовищі С++. Визначення значення функцій в середовищі Builder мовою програмування С++. Обчислення елементів квадратної матриці згідно заданного алгоритму. Бібліотека візуальних компонентів і середовище програмування.
курсовая работа [451,5 K], добавлен 15.01.2012Розгляд операційних систем MS DOS та Windows. Написання модуля обчислення умовного арифметичного виразу на мові Assembler та вбудування його виводу у програму Pascal. Виконання тестових перевірок та знаходження нормальних і аномальних результатів.
курсовая работа [1,4 M], добавлен 15.02.2010Програми і мови програмування. Алфавіт мови програмування. Лексеми, зарезервовані слова мови Pascal. Ідентифікатори, типи даних. Арифметичні вирази, операції. Стандартні функції, структура програми. Процедури введення-виведення. Правила написання команд.
лекция [445,0 K], добавлен 24.07.2014Аналіз особливостей мови програмування Java та середовища Android Studio. Розробка програмного забезпечення для якісного та ефективного вивчення іноземних слів. Побудова базових алгоритмів і структури даних. Вибір мови програмування, реалізація програми.
курсовая работа [335,3 K], добавлен 11.01.2015Аналіз сучасного стану технологій програмування. Засоби реалізації об'єктів в мові C++, структура даних і функцій. Розробка програмного продукту - гри "трикутники", з використовуванням моделей, класів і функцій об’єктно-орієнтованого програмування.
курсовая работа [117,8 K], добавлен 14.03.2013