Команда додавання
Команда 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 ДО. Дана операція корисна для вирівнювання розміру програми відповідно до доступного пам'яттю.