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 і значень прапорів, поміщених туди при виникненні переривання. Ця інструкція використовується для виходу як із програмних, так і з апаратних переривань.
... кодами сканування клавіатури (scan-коды). Код віджимання є двобайтовим: перший байт рівний F0h, а другий байт збігається з кодом натиснення. Є три рівні програмування підсистеми клавіатури: 1) на фізичному рівні (програмування портів 60h і 64h контроллера клавіатури); 2) за допомогою BIOS ( INT 09h, INT 16h ); 3) за допомогою переривання DOS ( INT 21h ). Для виконання введення даних з клаві ...
... обміну даними з ПЭВМ у процесі виконання програми користувача; 11. Вкажіть типи буферних схем, використаних в УУМС-2. Їх призначення та особливості роботи. 12. Дайте визначення адресного простору мікропроцесорної системи та розпишіть його розподіл в УУМС-2. Адресний простір УУМС складається з областей, состав яких показаний у табл.2. Варто звернути увагу, що внутрішні адресні області ...
... Сван Том. – К.: Диалектика, 1997. – 480с., ил. 7. Секреты Delphi 2: Пер. с англ./Рэй Лишнер. – К.: НИПФ «ДиаСофтЛтд.», 1996. – 800 с. ДОДАТОК ТЕКСТ ПРОГРАМИ “ВІЗУАЛЬНИЙ ОБЛІК ВХІДНИХ ДАНИХ ІНТЕРФЕЙСУ RS-232” Текст основної програми program Project1; uses Forms, MainForm in 'MainForm.pas' {Form1 Головна форма}, GraphicDiagram in 'GraphicDiagram.pas', Unit3 in 'Unit3.pas' ...
... CF (a+b+CF), і розміщує результат замість першого операнда. Обмеження на операнді такі ж, як і в команді ADD. Установлюються прапорці AF, CF, OF, FF, SF, ZF. Ця команда використовується для програмування арифметичних операцій над довгими цілими числами. ІNC a - Збільшення на 1. Команда додає 1 до значення операнда а. Операнд може знаходитися в пам'яті або в регістрі. Установлюються прапорці AF, ...
0 комментариев