Вправи. Живлення. Дієти. Тренування. Спорт

Як називається безумовне виконання команди. Основи програмування МП-пристроїв (Лекція). Команди CMP та TEST

Поряд із засобами арифметичних обчислень, система команд мікропроцесора має також засоби логічного перетворення даних. Під логічними розуміються такі перетворення даних, основу яких лежать правила формальної логіки

Формальна логіка працює на рівні тверджень істинно і хибно. Для мікропроцесора це зазвичай означає 1 і 0 відповідно. Для комп'ютера мова нулів та одиниць є рідною, але мінімальною одиницею даних, з якою працюють машинні команди, є байт. Однак на системному рівні часто необхідно мати можливість працювати на гранично низькому рівні – лише на рівні біт.

Мал. 29. Засоби логічного оброблення даних


До засобів логічного перетворення даних відносяться логічні команди та логічні операції. Операнд команди асемблера у випадку може бути вираз, яке, своєю чергою, є комбінацій операторів і операндов. Серед цих операторів можуть і оператори, реалізують логічні операції над об'єктами висловлювання.

Перед докладним розглядом цих коштів розглянемо, що є самі логічні дані і які операції з них проводяться.

Логічні дані

Теоретичною базою для логічної обробки даних є формальна логіка.Існує кілька систем логіки. Одна з найвідоміших – це обчислення висловлювань.Висловлювання - це будь-яке твердження, про яке можна сказати, що воно або істинно,або помилково.

Обчислення висловлювань є сукупність правил, використовуваних визначення істинності чи хибності деякої комбінації висловлювань.

Обчислення висловлювань дуже гармонійно поєднується із принципами роботи комп'ютера та основними методами його програмування. Усі апаратні компоненти комп'ютера побудовано логічних мікросхемах. Система представлення інформації у комп'ютері на нижньому рівні заснована на понятті біта. Біт, маючи всього два стани (0 (хибно) і 1 (істинно)), природним чином вписується в обчислення висловлювань.

Відповідно до теорії, над висловлюваннями (над бітами) можуть виконуватися такі логічні операції.


1. Заперечення (логічне НЕ) –логічна операція над одним операндом, результатом якої є величина, обернена до значення вихідного операнда.

Ця операція однозначно характеризується наступною таблицею істинності (табл. 12).

Таблиця 12. Таблиця істинності для логічного заперечення

2. Логічне додавання (логічне включає АБО) -логічна операція над двома операндами, результатом якої є «істина» (1), якщо один або обидва операнда мають значення «істина» (1), і «брехня» (0), якщо обидва операнда мають значення «брехня» (0).

Ця операція описується за допомогою наступної таблиці істинності (табл. 13).

Таблиця 13. Таблиця істинності для логічного, що включає АБО

3. Логічне множення (логічне І) -логічна операція над двома операндами, результатом якої є «істина» (1) лише у тому випадку, якщо обидва операнда мають значення «істина» (1). У решті випадків значення операції «брехня» (0).

Ця операція описується за допомогою наступної таблиці істинності (табл. 14).

Таблиця 14. Таблиця істинності для логічного І

4. Логічне виключне додавання (логічне виключне АБО) -логічна операція над двома операндами, результатом якої є «істина» (1), якщо тільки один із двох операндів має значення «істина» (1), і брехня (0), якщо обидва операнда мають значення «брехня» (0) або « істина» (1). Ця операція описується за допомогою наступної таблиці істинності (табл. 15).

Таблиця 15. Таблиця істинності для логічного виключає АБО

Система команд мікропроцесора містить п'ять команд, які підтримують ці операції. Ці команди виконують логічні операції над бітами операндів. Розмірність операндів, звісно, ​​має бути однакова. Наприклад, якщо розмірність операнда дорівнює слову (16 біт), то логічна операція виконується спочатку над нульовими бітами операнда, і її результат записується на місце біта 0 результату. Далі команда послідовно повторює ці дії над усіма бітами з першого до п'ятнадцятого.

Логічні команди

У системі команд мікропроцесора є наступний набір команд, які підтримують роботу з логічними даними:

1) and операнд_1, операнд_2 – операція логічного множення. Команда виконує порозрядно логічну операцію І (кон'юнкцію) над бітами операндів операнд_1 та операнд_2. Результат записується на місце операнд_1;

2) операнд_1, операнд_2 - операція логічного складання. Команда виконує порозрядно логічну операцію АБО (диз'юнкцію) над бітами операндів операнд_1 та операнд_2. Результат записується на місце операнд_1;

3) хог операнд_1, операнд_2 - операція логічного виключає складання. Команда виконує порозрядно логічну операцію виключає АБО над бітами операндів операнд_1 і операнд_2. Результат записується на місце операнді;

4) test операнд_1, операнд_2 - операція "перевірити" (спосібом логічного множення). Команда виконує порозрядно логічну операцію І над бітами операндів операнд_1 та операнд_2. Стан операнда залишається колишнім, змінюються тільки прапори zf, sf, і pf, що дає можливість аналізувати стан окремих бітів операнда без зміни їх стану;

5) not операнд – операція логічного заперечення. Команда виконує порозрядне інвертування (заміну значення зворотне) кожного біта операнда. Результат записується на місце операнда.

Для представлення ролі логічних команд у системі команд мікропроцесора дуже важливо зрозуміти сфери їх застосування та типові прийоми їх використання при програмуванні.

За допомогою логічних команд можливо виділенняокремих бітів в операнді з метою їх установки, скидання, інвертування чи просто перевірки на певне значення.

Для організації подібної роботи з бітами операнд_2 грає роль маски. За допомогою встановлених в 1 биті цієї маски визначаються потрібні для конкретної операції біти операнд_1. Покажемо, які логічні команди можуть застосовуватися для цієї мети:

1) для установки певних розрядів (біт) в 1 застосовується команда операнд_1, операнд_2.

У цій команді операнд_2, що виконує роль маски, повинен містити одиничні біти на місці розрядів, які повинні бути встановлені в 1 в операнд_1;

2) для скидання певних розрядів (біт) 0 застосовується команда and операнд_1, операнд_2.

У цій команді операнд_2, що виконує роль маски, повинен містити нульові біти на місці розрядів, які повинні бути встановлені в 0 в операнд_1;

3) команда хог операнд_1, операнд_2 застосовується:

а) для з'ясування того, які біти в операнд_1 та операнді різняться;

б) для інвертування стану заданих біт операнд_1.

Цікаві біти маски (операнд_2) при виконанні команди хог повинні бути одиничними, інші - нульовими;

Для перевірки стану заданих біт застосовується команда test операнд_1, операнд_2 (перевірити операнд_1).

Перевірені біти операнд_1 масці (операнд_2) повинні мати одиничне значення. Алгоритм роботи команди test подібний до алгоритму команди and, але він не змінює значення операнд_1. Результатом команди є встановлення значення прапора нуля zf:

1) якщо zf = 0, то в результаті логічного множення вийшов нульовий результат, тобто один одиничний біт маски, який не збігся з відповідним одиничним бітом операнді;

2) якщо zf = 1, то результаті логічного множення вийшов ненульовий результат, тобто. хоча б одинодиничний біт маски збігся з відповідним одиничним бітом операнд_1.

Для реакції на результат команди test доцільно використати команду переходу jnz мітка (Jump if Not Zero) – перехід, якщо прапор нуля zf ненульовий, або команду із зворотною дією – jz мітка (Jump if Zero) – перехід, якщо прапор нуля zf = 0.

Наступні дві команди дозволяють здійснити пошук першого встановленого в 1 біт операнда. Пошук можна зробити як з початку, так і від кінця операнда:

1) bsf операнд_1, операнд_2 (Bit Scaning Forward) - сканування бітів уперед. Команда переглядає (сканує) біти операнд_2 від молодшого до старшого (від біта 0 до старшого біта) у пошуках першого біта, встановленого в 1. Якщо такий виявляється, в операнд_1 заноситься номер цього біта у вигляді цілого числа. Якщо всі біти операнд_2 дорівнюють 0, то прапор нуля zf встановлюється в 1, інакше прапор zf скидається в 0;

2) bsr операнд_1, операнд_2 (Bit Scaning Reset) - сканування бітів у зворотному порядку. Команда переглядає (сканує) біти операнд_2 від старшого до молодшого (від старшого біта до біта 0) у пошуках першого біта, встановленого в 1. Якщо такий виявляється, в операнд_1 заноситься номер цього біта у вигляді цілісного значення. При цьому важливо, що позиція першого одиничного біта зліва відраховується однаково щодо біта 0. Якщо всі біти операнд_2 дорівнюють 0, то прапор нуля zf встановлюється в 1, інакше прапор zf скидається в 0.

В останніх моделях мікропроцесорів Intel у групі логічних команд з'явилося ще кілька команд, які дозволяють здійснити доступ до одного конкретного біта операнда. Операнд може бути як у пам'яті, і у регістрі загального призначення. Положення біта визначається зсувом біта щодо молодшого біта операнда. Значення зміщення може задаватися як безпосереднього значення, і утримуватися у регістрі загального призначення. Як значення зміщення можна використовувати результати роботи команд bsr і bsf. Усі команди надають значення обраного біта прапору РЄ

1) bt операнд, смещение_бита (Bit Test) – перевірка біта. Команда переносить значення біта у прапор cf;

2) bts операнд, смещение_бита (Bit Test and Set) - перевірка та встановлення біта. Команда переносить значення біта у прапор CF і потім встановлює біт, що перевіряється, в 1;

3) btr операвд, смещение_бита (Bit Test and Reset) - перевірка та скидання біта. Команда переносить значення біта у прапор CF і потім встановлює цей біт 0;

4) btc операнд, смещение_бита (Bit Test and Convert) - перевірка та інвертування біта. Команда переносить значення біта у прапор cf і потім інвертує значення цього біта.

Команди зсуву

Команди цієї групи також забезпечують маніпуляції над окремими бітами операндів, але в інший спосіб, ніж логічні команди, розглянуті вище.

Усі команди зсуву переміщують біти в полі операнда ліворуч або праворуч залежно від коду операції. Усі команди зсуву мають однакову структуру - коп операнд, лічильник_зсувів.

Кількість розрядів, що зсуваються – лічильник_зсувів -розташовується на місці другого операнда і може задаватися двома способами:

1) статично,що передбачає завдання фіксованого значення за допомогою безпосереднього операнда;

2) динамічно,що означає занесення значення лічильника зсувів регістр cl перед виконанням команди зсуву.

З розмірності регістра cl зрозуміло, що значення лічильника зрушень може лежати в діапазоні від 0 до 255. Але насправді це не зовсім так. З метою оптимізації мікропроцесор сприймає лише значення п'яти молодших бітівлічильника, тобто значення лежить у діапазоні від 0 до 31.

Усі команди зсуву встановлюють прапор перенесення cf.

У міру зсуву бітів за межі операнда вони спочатку потрапляють на прапор перенесення, встановлюючи його рівним значенню чергового біта, що опинився за межами операнда. Куди цей біт потрапить далі, залежить від типу команди зсуву та алгоритму програми.

За принципом дії команди зсуву можна поділити на два типи:

1) команди лінійного зсуву;

2) команди циклічного зсуву.

Команди лінійного зсуву

До команд цього типу відносяться команди, які здійснюють зсув за наступним алгоритмом:

1) черговий «висувний» біт встановлює прапор CF;

2) біт, що вводиться в операнд з іншого кінця, має значення 0;

3) при зрушенні чергового біта він переходить у прапор CF, при цьому значення попереднього зрушеного біта втрачається! Команди лінійного зсуву діляться на два підтипи:

1) команди логічного лінійного зсуву;

2) команди арифметичного лінійного зсуву.

До команд логічного лінійного зсуву належать такі:

1) shl операнд, лічильник_зсувів (Shift Logical Left) - логічний зсув вліво. Вміст операнда зсувається вліво на кількість бітів, що визначається значенням сдвигов. Праворуч (у позицію молодшого біта) вписуються нулі;

2) shr операнд, лічильник_зсувів (Shift Logical Right) - логічний зсув праворуч. Вміст операнда зсувається праворуч на кількість бітів, що визначається значенням лічильник_зсувів. Ліворуч (у позицію старшого, знакового біта) вписуються нулі.

На малюнку 30 показано принцип роботи цих команд.

Мал. 30. Схема роботи команд лінійного логічного зсуву


Команди арифметичного лінійного зсуву від команд логічного зсуву тим, що вони особливим чином працюють із знаковим розрядом операнда.

1) sal операнд, лічильник зрушень (Shift Arithmetic Left) - арифметичний зрушення вліво. Вміст операнда зсувається вліво на кількість бітів, що визначається значенням сдвигов. Праворуч (у позицію молодшого біта) вписуються нулі. Команда sal не зберігає знаку, але встановлює прапор із/у разі зміни знакачерговим бітом, що висувається. В іншому команда sal повністю аналогічна команді shl;

2) sar операнд, лічильник_зсувів (Shift Arithmetic Right) - арифметичний зсув праворуч. Вміст операнда зсувається праворуч на кількість бітів, що визначається значенням лічильник_зрушень.Зліва в операнд вписуються нулі. Команда sar зберігає знак, відновлюючи його після зсуву кожного біта.

На малюнку 31 показано принцип роботи команд лінійного арифметичного зсуву.


Мал. 31. Схема роботи команд лінійного арифметичного зсуву

Команди циклічного зсуву

До команд циклічного зсуву відносяться команди, що зберігають значення біт, що зрушуються. Є два типи команд циклічного зсуву:

1) команди простого циклічного зсуву;

2) команди циклічного зсуву через прапор перенесення cf.

До команд простого циклічногозсуву відносяться:

1) rol операнд, лічильник_зсувів (Rotate Left) - циклічний зсув вліво. Вміст операнда зсувається вліво на кількість біт, що визначається операндом лічильник_зрушень.Зсувні ліворуч біти записуються в той же операнд праворуч;

2) гог операнд, лічильник_зрушень (Rotate Right) - циклічний зсув вправо. Вміст операнда зсувається праворуч на кількість біт, що визначається операндом лічильник_зрушень.Зсувні вправо біти записуються в той же операнд зліва.

Мал. 32. Схема роботи команд простого циклічного зсуву


Як видно з малюнка 32, команди простого циклічного зсуву в процесі своєї роботи здійснюють одну корисну дію, а саме: біт, що циклічно зрушується не тільки всувається в операнд з іншого кінця, але і одночасно його значення стає значенням прапора РЄ

Команди циклічного зсуву через прапор переносу CFвідрізняються від команд простого циклічного зсуву тим, що біт, що зрушується, не відразу потрапляє в операнд з іншого його кінця, а записується спочатку в прапор переносу РЄ Лише наступне виконання цієї команди зсуву (за умови, що вона виконується в циклі) призводить до приміщення висунутого раніше біта з іншого кінця операнда(Рис. 33).

До команд циклічного зсуву через прапор перенесенняспіввідносяться такі:

1) rcl операнд, лічильник_зсувів (Rotate through Carry Left) - циклічний зсув вліво через перенесення.

Вміст операнда зсувається вліво на кількість біт, що визначається операндом лічильник_зрушень.Збиті біти по черзі стають значенням прапора переносу cf.

2) гсг операнд, лічильник_зсувів (Rotate through Carry Right) - циклічний зсув вправо через перенесення.

Вміст операнда зсувається праворуч на кількість біт, що визначається операндом лічильник_зрушень.Збиті біти по черзі стають значенням прапора переносу СF.

Мал. 33. Команди циклічного зсуву через прапор переносу CF


З малюнка 33 видно, що при зрушенні через прапор переносу з'являється проміжний елемент, за допомогою якого, зокрема, можна проводити заміну бітів, що циклічно зсуваються, зокрема, неузгодженістьбітових послідовностей.

Під неузгодженістю бітової послідовності тут і далі мається на увазі дія, яка дозволяє деяким чином локалізувати та витягти потрібні ділянки цієї послідовності та записати їх в інше місце.

Додаткові команди зсуву

Система команд останніх моделей мікропроцесорів Intel, починаючи з i80386, містить додаткові зсувні команди, що розширюють можливості, розглянуті нами раніше. Це – команди зрушень подвійний точності: 1) shld операнд_1, операнд_2, лічильник_зрушень - зрушення вліво подвійної точності. Команда shld здійснює заміну шляхом зсуву бітів операнда операнд_1 вліво, заповнюючи його біти праворуч значеннями бітів, що витісняються з операнд_2 згідно зі схемою на рис. 34. Кількість біт, що зсуваються, визначається значенням лічильник_зсувів, операнд_2не змінюється.


Мал. 34. Схема роботи команди shld


2) shrd операнд_1, операнд_2, лічильник_зсувів - зсув праворуч подвійної точності. Команда здійснює заміну шляхом зсуву бітів операнда операнд_1 вправо, заповнюючи його біти зліва значеннями бітів, що витісняються з операнд_2 згідно зі схемою на малюнку 35. Кількість біт, що зсуваються, визначається значенням лічильник_зсувів,яке може лежати в діапазоні 0...31. Це значення може задаватися безпосереднім операндом або утримуватися в регістрі cl. Значення операнд_2не змінюється.

Мал. 35. Схема роботи команди shrd


Як ми зазначили, команди shld та shrd здійснюють зрушення до 32 розрядів, але за рахунок особливостей завдання операндів та алгоритму роботи ці команди можна використовувати для роботи з полями завдовжки до 64 біт.

2. Команди передачі управління

Ми познайомились із деякими командами, з яких формуються лінійнідільниці програми. Кожна з них у загальному випадку виконує деякі дії щодо перетворення або пересилання даних, після чого мікропроцесор передає керування наступній команді. Але дуже мало програм працює таким послідовним чином. Зазвичай у програмі є точки, в яких потрібно ухвалити рішення про те, яка команда виконуватиметься наступною. Це рішення може бути:

1) безумовним –у цій точці необхідно передати управління не тій команді, яка йде наступною, а іншою, яка знаходиться на деякому віддаленні від поточної команди;

2) умовним –Рішення про те, яка команда виконуватиметься наступною, приймається на основі аналізу деяких умов або даних.

Програма є послідовністю команд і даних, що займають певний простір оперативної пам'яті. Цей простір пам'яті може бути безперервним, або складатися з декількох фрагментів.

Те, яка команда програми має виконуватися наступною, мікропроцесор дізнається за вмістом пари регістрів cs:(e)ip:

1) cs - сегментний регістр коду, в якому знаходиться фізична (базова) адреса поточного сегмента коду;

2) eip/ip – регістр покажчика команди, у якому перебуває значення, що є зміщення у пам'яті наступної команди, підлягає виконанню, щодо початку поточного сегмента коду.

Який регістр буде використовуватися, залежить від встановленого режиму адресації use16 або use32. Якщо вказано use 16, використовується ip, якщо use32, то використовується eip.

Таким чином, команди передачі управління змінюють вміст регістрів cs і eip/ip, в результаті чого процесор вибирає для виконання не наступну по порядку команду програми, а команду в деякій іншій ділянці програми. Конвеєр усередині мікропроцесора при цьому скидається.

За принципом дії команди мікропроцесора, що забезпечують організацію переходів у програмі, можна поділити на 3 групи:

1. Команди безумовної передачі управління:

1) команда безумовного переходу;

2) команда виклику процедури та повернення з процедури;

3) команда виклику програмних переривань та повернення з програмних переривань.

2. Команди умовної передачі управління:

1) команди переходу за результатом команди порівняння стор;

2) команди переходу за станом певного прапора;

3) команди переходу за вмістом регістру есх/сх.

3. Команди управління циклом:

1) команда організації циклу з лічильником есх/сх;

2) команда організації циклу з лічильником есх/сх з можливістю дострокового виходу із циклу за додатковою умовою.

Безумовні переходи

Попереднє обговорення виявило деякі деталі механізму переходу. Команди переходу модифікують регістр покажчика команди eip/ip та, можливо, сегментний регістр коду cs. Що саме має бути модифіковано, залежить:

1) від типу операнда у команді безумовного переходу (ближній чи далекий);

2) від вказівки перед адресою переходу (у команді переходу) модифікатора;при цьому сама адреса переходу може знаходитися або безпосередньо в команді (прямий перехід), або в регістрі або комірці пам'яті (непрямий перехід).

Модифікаторможе приймати такі значення:

1) near ptr – прямий перехід на мітку всередині сегмента коду. Модифікується лише регістр eip/ip (залежно від заданого типу сегмента коду use16 або use32) на основі вказаної в команді адреси (мітки) або виразу, який використовує символ отримання значення – $;

2) far ptr – прямий перехід на мітку в іншому сегменті коду. Адреса переходу задається у вигляді безпосереднього операнда або адреси (мітки) і складається з 16-бітного селектора та 16/32-бітного зміщення, які завантажуються, відповідно, в регістри cs та ip/eip;

3) word ptr – опосередкований перехід на мітку всередині поточного сегмента коду. Модифікується (значенням зміщення з пам'яті за вказаною в команді адресою або з регістру) тільки eip/ip. Розмір усунення 16 або 32 біт;

4) dword ptr – опосередкований перехід на мітку в іншому сегменті коду. Модифікуються (значенням із пам'яті – і лише з пам'яті, з регістру не можна) обидва регістри – cs та eip/ip. Перше слово/подвійне слово цієї адреси представляє зміщення та завантажується в ip/eip; друге/третє слово завантажується в cs. Команда безумовного переходу jmp

Синтаксис команди безумовного переходу – jmp [модифікатор] адреса_переходу – безумовний перехід без збереження інформації про точку повернення.

Адрес_перехода є адресу як мітки чи адресу області пам'яті, де знаходиться покажчик переходу.

Загалом у системі команд мікропроцесора є кілька кодів машинних команд безумовного переходу jmp.

Їх відмінності визначаються дальністю переходу та способом завдання цільової адреси. Дальністьпереходу визначається місцезнаходженням операнда адреса_переходу.Ця адреса може знаходитися в поточному сегменті коду або в іншому сегменті. У першому випадку перехід називається внутрішньосегментним,або близьким,у другому - міжсегментним,або далеким.Внутрішньосегментний перехід передбачає, що змінюється лише вміст регістру eip/ip.

Можна виділити три варіанти внутрішньосегментного використання команди jmp:

1) прямий короткий;

2) прямий;

3) непрямий.


Процедури

У мові асемблера є кілька засобів, які вирішують проблему дублювання ділянок програмного коду. До них відносяться:

1) механізм процедур;

2) макроассемблерів;

3) механізм переривань.

Процедура, часто звана також підпрограмою, -це основна функціональна одиниця декомпозиції (поділу кілька частин) деякої завдання. Процедура являє собою групу команд для вирішення конкретної підзадачі і має засоби отримання управління з точки виклику завдання вищого рівня і повернення управління в цю точку.

У найпростішому випадку програма може складатися з однієї процедури. Іншими словами, процедуру можна визначити як правильно оформлену сукупність команд, яка, будучи одноразово описана, при необхідності може бути викликана в будь-якому місці програми.

Для опису послідовності команд як процедури в мові асемблера використовуються дві директиви: PROC і ENDP.

Синтаксис опису процедури такий (рис. 36).


Мал. 36. Синтаксис опису процедури у програмі


З малюнка 36 видно, що у заголовку процедури (директиві PROC) обов'язковим є завдання імені процедури. Серед великої кількості операнда директиви PROC слід особливо виділити [відстань]. Цей атрибут може набувати значення near або far і характеризує можливість звернення до процедури з іншого сегмента коду. За умовчанням атрибут [відстань] набуває значення near.

Процедура може розміщуватись у будь-якому місці програми, але так, щоб на неї випадковим чином не потрапило керування. Якщо процедуру просто вставити в загальний потік команд, то мікропроцесор сприйматиме команди процедури як частину цього потоку і, відповідно, здійснюватиме виконання команд процедури.

Умовні переходи

Мікропроцесор має 18 команд умовного переходу. Ці команди дозволяють перевірити:

1) відношення між операндами зі знаком («більше – менше»);

2) відношення між операндами без знака («вище – нижче»);

3) стан арифметичних прапорів ZF, SF, CF, OF, PF (але не AF).

Команди умовного переходу мають однаковий синтаксис:

jcc тега_переходу

Як видно, мнемокод усіх команд починається з «j» – від слова jump(стрибок), її –визначає конкретну умову, аналізовану командою.

Щодо операнда метка_переходу,то ця мітка може бути тільки в межах поточного сегмента коду, міжсегментна передача управління в умовних переходах не допускається. У зв'язку з цим відпадає питання про модифікатора, який був у синтаксисі команд безумовного переходу. У ранніх моделях мікропроцесора (i8086, i80186 та i80286) команди умовного переходу могли здійснювати лише короткі переходи – на відстань від -128 до +127 байт від команди, що йде за командою умовного переходу. Починаючи з моделі мікропроцесора 80386 це обмеження знято, але, як бачите, тільки в межах поточного сегмента коду.

Для того щоб прийняти рішення про те, куди буде передано управління командою умовного переходу, попередньо має бути сформована умова, на підставі якої прийматиметься рішення про передачу управління.

Джерелами такої умови можуть бути:

1) будь-яка команда, що змінює стан арифметичних прапорів;

2) команда порівняння стор, що порівнює значення двох операндів;

3) стан регістру есх/сх.


Команда порівняння cmp

Команда порівняння стор має цікавий принцип роботи. Він абсолютно такий самий, як і у команди віднімання – sub операнде, операнд_2.

Команда стор так само, як і команда sub, виконує віднімання операндів і встановлює прапори. Єдине, чого вона не робить - це запис результату віднімання на місце першого операнда.

Синтаксис команди стр - стр операнд_1, операнд_2 (compare) - порівнює два операнди і за результатами порівняння встановлює прапори.

Прапори, що встановлюються командою сторінок, можна аналізувати спеціальними командами умовного переходу. Перш ніж ми розглянемо їх, приділимо трохи уваги мнемоніці цих команд умовного переходу (табл. 16). Розуміння позначень при формуванні назви команд умовного переходу (елемент у назві команди jcc, позначений нами її) полегшить їхнє запам'ятовування та подальше практичне використання.

Таблиця 16. Значення абревіатур у назві команди jcc
Таблиця 17. Перелік команд умовного переходу для команди операнд_1, операнд_2

Не дивуйтеся тієї обставини, що однаковим значенням прапорів відповідає кілька різних мнемокодов команд умовного переходу (вони відокремлені косою межею в табл. 17). Різниця у назві обумовлена ​​бажанням розробників мікропроцесора полегшити використання команд умовного переходу у поєднанні з певними групами команд. Тому різні назви відображають швидше різну функціональну спрямованість. Проте те, що ці команди реагують на ті самі прапори, робить їх абсолютно еквівалентними та рівноправними в програмі. Тому в таблиці 17 вони згруповані не за назвами, а за значеннями прапорів (умов), на які вони реагують.


Команди умовного переходу та прапори

Мнемонічне позначення деяких команд умовного переходу відображає назву прапора, з яким вони працюють, і має таку структуру: першим іде символ «j» (Jump,перехід), другим - або позначення прапора, або символ заперечення "n", після якого стоїть назва прапора. Така структура команди відбиває її призначення. Якщо символу «n» немає, то перевіряється стан прапора, якщо він дорівнює 1, переходить на мітку переходу. Якщо символ «n» присутній, то перевіряється стан прапора на рівність 0, й у разі успіху відбувається перехід на мітку переходу.

Мнемоди команди, назви прапорів та умови переходів наведені в таблиці 18. Ці команди можна використовувати після будь-яких команд, що змінюють зазначені прапори.

Таблиця 18. Команди умовного переходу та прапори

Якщо уважно подивитися на таблиці 17 і 18, видно, що багато команд умовного переходу в них є еквівалентними, тому що в основі тих і інших лежить аналіз однакових прапорів.


Команди умовного переходу та регістр есх/сх

Архітектура мікропроцесора передбачає специфічне використання багатьох регістрів. Наприклад, регістр EAX/AX/AL використовується як акумулятор, а регістри ВР, SP – до роботи зі стеком. Реєстр ЕСХ/СХ також має певне функціональне призначення: він виконує роль лічильникау командах управління циклами та при роботі з ланцюжками символів. Можливо, що функціонально команду умовного переходу, пов'язану з регістром есх/сх, правильніше було б віднести до цієї групи команд.

Синтаксис цієї команди умовного переходу такий:

1) jcxz мітка_переходу (Jump if ex is Zero) - перехід, якщо сх нуль;

2) jecxz мітка_переходу (Jump Equal есх Zero) – перехід, якщо есх нуль.

Ці команди дуже зручно використовувати при організації циклу та при роботі з ланцюжками символів.

Слід зазначити обмеження, властиве команді jcxz/jecxz. На відміну з інших команд умовної передачі управління команда jcxz/jecxz може адресувати лише короткі переходи – на -128 байт чи +127 байт від наступної команди.

Організація циклів

Цикл, як відомо, є важливою алгоритмічною структурою, без використання якої не обходиться, напевно, жодна програма. Організувати циклічне виконання деякої ділянки програми можна, наприклад, використовуючи команди умовної передачі чи команду безумовного переходу jmp. За такої організації циклу всі операції з його організації виконуються вручну. Але, враховуючи важливість такого алгоритмічного елемента, як цикл, розробники мікропроцесора ввели у систему команд групу із трьох команд, що полегшує програмування циклів. Ці команди також використовують регістр есх/сх як лічильник циклу.

Дамо коротку характеристику цим командам: 1) loop метка_переходу (Loop) - повторити цикл. Команда дозволяє організувати цикли, подібні до циклів for у мовах високого рівня з автоматичним зменшенням лічильника циклу. Робота команди полягає у виконанні наступних дій:

б) порівняння регістру ЕСХ/СХ з нулем: якщо (ЕСХ/СХ) = 0, то управління передається на наступну після loop команду;

2) loope/loopz тега_переходу

Команди loope та loopz – абсолютні синоніми. Робота команд полягає у виконанні наступних дій:

а) декременту регістру ЕСХ/СГ;

в) аналіз стану прапора нуля ZF якщо (ЕСХ/СХ) = 0 або XF = 0, управління передається на наступну після loop команду.

3) loopne/loopnz тега_переходу

Команди loopne та loopnz також абсолютні синоніми. Робота команд полягає у виконанні наступних дій:

а) декременту регістру ЕСХ/СГ;

б) порівняння регістру ЕСХ/СХ із нулем;

в) аналіз стану прапора нуля ZF: якщо (ЕСХ/СХ) = 0 або ZF = 1, управління передається на наступну після loop команду.

Команди loope/loopz та loopne/loopnz за принципом своєї роботи є взаємозворотними. Вони розширюють дію команди loop тим, що додатково аналізують прапор zf, що дає можливість організувати достроковий вихід із циклу, використовуючи цей прапор як індикатор.

Недолік команд організації циклу loop, loope/loopz і loopne/loopnz у тому, що вони реалізують лише короткі переходи (від -128 до +127 байт). Для роботи з довгими циклами доведеться використовувати команди умовного переходу та команду jmp, тому постарайтеся освоїти обидва способи організації циклів.

логічне АБО , додавання за модулем 2 (Виключає АБО);
  • логічні, арифметичні та циклічні зрушення;
  • перевірка бітів та операндів;
  • встановлення та очищення бітів (прапорів) регістру станупроцесора ( PSW).
  • Команди логічних операцій дозволяють бітно обчислювати основні логічні функції двох вхідних операндов. Крім того, операція І (AND ) використовується для примусового очищення заданих бітів (як один з операндів при цьому використовується код маски, в якому розряди, що вимагають очищення, встановлені в нуль). Операція АБО (OR) застосовується для примусової установки заданих бітів (як один з операндів при цьому використовується код маски, в якому розряди, що вимагають установки в одиницю, дорівнюють одиниці). Операція "Виключає АБО" (XOR ) використовується для інверсії заданих бітів (як один з операндів при цьому застосовується код маски, в якому біти, що підлягають інверсії, встановлені в одиницю). Команди вимагають двох вхідних операндів та формують один вихідний операнд.

    Команди зрушень дозволяють бітно зрушувати код операнда вправо (у бік молодших розрядів) чи ліворуч (убік старших розрядів). Тип зсуву (логічний, арифметичний або циклічний) визначає, яке буде нове значення старшого біта (при зрушенні вправо) або молодшого біта (при зрушенні вліво), а також визначає, чи буде десь збережено колишнє значення старшого біта (при зрушенні вліво) або молодшого біта (при зрушенні праворуч). Наприклад, при логічному зрушенні праворуч у старшому розряді коду операнда встановлюється нуль, а молодший розряд записується як прапор переносу в регістр стану процесора. А при арифметичному зрушенні праворуч значення старшого розряду зберігається колишнім (нулем або одиницею), молодший розряд також записується як прапор переносу.

    Циклічні зрушення дозволяють зрушувати біти коду операнда по колу (за годинниковою стрілкою при зрушенні праворуч або проти годинникової стрілки при зрушенні вліво). При цьому кільце зсуву може входити або не входити прапор переносу. У біт прапора перенесення (якщо він використовується) записується значення старшого біта при циклічному зрушенні вліво та молодшого біта при циклічному зрушенні вправо. Відповідно, значення біта прапора перенесення переписуватиметься в молодший розряд при циклічному зрушенні вліво і старший розряд при циклічному зрушенні вправо.

    Наприклад на рис. 3.12 показані дії, що виконуються командами зрушень праворуч.

    Команди перевірки бітів та операндів призначені для встановлення або очищення бітів регістру станупроцесора залежно від значення обраних бітів чи всього операнда загалом. Вихідного операнда команди не формують. Команда перевірки операнда ( TST) перевіряє весь код операнда загалом рівність нулю і знак (на значення старшого біта), вона вимагає лише одного вхідного операнда. Команда перевірки біта (BIT ) перевіряє лише окремі біти, для вибору яких в якості другого операнда використовується код маски. У коді маски бітам основного операнда, що перевіряються, повинні відповідати одиничні розряди.


    Мал. 3.12.

    Нарешті, команди установки та очищення бітів регістру станупроцесора (тобто прапори) дозволяють встановити або очистити будь-який прапор, що буває дуже зручно. Кожному прапору зазвичай відповідають дві команди, одна з яких встановлює його в одиницю, а інша скидає на нуль. Наприклад, прапор перенесення C (від Carry ) відповідатиме командам CLC (очищення) та SEC або STC (установка).

    3.3.4. Команди переходів

    Команди переходівпризначені для організації різноманітних циклів, розгалужень, викликів підпрограм тощо, тобто вони порушують послідовний хід виконання програми. Ці команди записують у регістр- лічильник команд нове значення і цим викликають перехід процесора не до наступної по порядку команді, а до будь-якої іншої команди пам'яті програм. Деякі команди переходівпередбачають надалі повернення назад, у точку, з якої було зроблено перехід, інші не передбачають цього. Якщо повернення передбачено, поточні параметри процесора зберігаються в стеку. Якщо повернення не передбачене, поточні параметри процесора не зберігаються.

    Команди переходівбез повернення поділяються на дві групи:

    • команди безумовних переходів;
    • команди умовних переходів.

    В позначках цих команд використовуються слова Branch(розгалуження) і Jump(стрибок).

    Команди безумовних переходіввикликають перехід у нову адресу незалежно від чого. Вони можуть викликати перехід на вказану величину зсуву (вперед або назад) або на вказану адресу пам'яті. Величина зміщення або нове значення адреси вказуються як вхідний операнд.

    Команди умовних переходіввикликають перехід який завжди, лише при виконанні заданих умов. Як такі умови зазвичай виступають значення прапорів у регістрі стану процесора ( PSW). Тобто умовою переходу є результат попередньої операції, яка змінює значення прапорів. Усього таких умов переходу може бути від 4 до 16. Кілька прикладів команд умовних переходів:

    • перехід, якщо дорівнює нулю;
    • перехід, якщо не дорівнює нулю;
    • перехід, якщо є переповнення;
    • перехід, якщо немає переповнення;
    • перехід, якщо більше за нуль;
    • перехід, якщо менше або дорівнює нулю.
    нового значення. Якщо ж умова переходу не виконується, лічильник команд просто нарощується, і процесор вибирає та виконує наступну по порядку команду.

    Спеціально для перевірки умов переходу застосовується команда порівняння ( CMP), що передує команді умовного переходу(або навіть кільком командам умовних переходів). Але прапори можуть встановлюватись і будь-якою іншою командою, наприклад командою пересиланняданих, будь-якої арифметичної або логічною командою. Зазначимо, що самі команди переходівпрапори не змінюють, що якраз і дозволяє ставити кілька команд переходіводну за одною.

    Спільне використання кількох команд умовних та безумовних переходівдозволяє процесору виконувати розгалужені алгоритми будь-якої складності. Наприклад на рис. 3.13 показано розгалуження програми на дві гілки з наступним з'єднанням, а на рис. 3.14 – розгалуження на три гілки з подальшим з'єднанням.

    Команди переходівз подальшим поверненням у точку, з якої було зроблено перехід, застосовуються до виконання підпрограм , тобто допоміжних програм. Ці команди також називаються командами виклику підпрограм (поширена назва - CALL ). Використання підпрограм дозволяє спростити структуру основної програми, зробити її більш логічною, гнучкою, легкою для написання та налагодження. У той самий час треба враховувати, що широке використання підпрограм , зазвичай, збільшує час виконання програми.


    Мал. 3.13.


    Мал. 3.14.

    Усе команди переходівіз поверненням припускають безумовний перехід (вони не перевіряють жодних прапорів). При цьому вони вимагають одного вхідного операнда, який може вказувати абсолютне значення нової адреси, так і зсув, що складається з поточним значенням адреси. Поточне значення лічильника команд (поточна адреса) зберігається перед виконанням переходу до стеку.

    Для зворотного повернення до точки виклику

    Команди мікропроцесора.

    Тепер зупинимося докладніше на командах, що виконуються. Весь набір команд будь-якого мікропроцесора можна поділити на кілька груп.

    Перша група -це команди переміщення даних.Підкоряючись цим командам, процесор копіює вміст однієї комірки пам'яті в іншу, копіює інформацію з комірки пам'яті в один із внутрішніх регістрів або, навпаки, копіює вміст регістру в одну з комірок пам'яті. Крім того, дані можуть копіюватися з одного внутрішнього регістру до іншого.

    Слід зауважити, що так звані команди переміщення, по суті, не переміщують дані з комірки до комірки, а копіюють ці дані. Операція переміщення у цифровій техніці безглузда. У загальноприйнятому розумінні перемістити означає усунути з одного місця і помістити в інше. Але прибрати дані з комірки пам'яті неможливо!

    Будь-який біт будь-якого осередку пам'яті завжди дорівнює або нулю, або одиниці. Тобто завжди містить якесь число. Тому команди переміщення зчитують байт даних з осередку-джерела і записують їх у осередок-приймач. При цьому в осередку-джерелі дані не змінюються.

    До другийгрупі відносяться команди перетворення даних.Саме до цієї групи входять команди додавання, віднімання, логічних перетворень, зсуву розрядів тощо.

    До третьої групи належать команди передачі керування.Ось про цей клас команд я хотів би поговорити докладніше. Складно уявити програму, що складається лише з одного послідовного ланцюжка команд. Переважна кількість алгоритмів вимагають розгалуження програми. Це означає, що програма має вміти виконувати різні послідовності дій залежно від певної умови.

    приклад.

    Допустимо, що наш мікропроцесорний пристрій має кнопки управління. При натисканні кожної кнопки має виконуватися певна дія. Наприклад, при натисканні однієї кнопки виконавчий механізм повинен повернутись ліворуч. При натисканні іншої- повернутися праворуч і т. п. Для того, щоб це було можливо, програма періодично зчитує стан кнопок. Потім програма має оцінити їхній стан. Якщо натиснута перша кнопка, виконується певна послідовність команд, що видає на відповідний порт код, що призводить до включення двигуна прямому напрямку. Якщо натиснута друга кнопка, то виконується інша послідовність команд, що видає той самий порт зовсім інший код. Цей код повинен викликати увімкнення двигуна в реверсному напрямку.

    Вочевидь, що з реалізації цього алгоритму доведеться перервати послідовне виконання команд. Для того, щоб програма мала можливість змінювати алгоритм своєї роботи залежно від будь-якої умови, у системі команд будь-якого процесора обов'язково є команди передачі керування. До команд передачі управління належать такі види команд: команди умовного переходу; команди безумовного переходу; команди переходу до підпрограми; команди організації циклу Розглянемо ці види команд по порядку.

    Команди умовного та безумовного переходу

    Обидва ці види команд призначені для того, щоб переривати послідовне виконання програми та викликати так званий перехід.Причому умовний перехід відбувається лише за дотримання будь-якої умови. Безумовний перехід виконується завжди, коли програма зустріне відповідну команду. Як умови переходу може виступати один з наступних логічних виразів:

    ♦ величина А дорівнюєвеличині;

    ♦ величина А не дорівнюєвеличині;

    ♦ величина А меншевеличини;

    ♦ величина А більшевеличини;

    ♦ величина А менше або дорівнюєвеличині;

    ♦ величина А більше або дорівнюєвеличині Ст.

    Як величини для порівняння може виступати вміст будь-яких внутрішніх регістрів процесора, вміст будь-яких осередків пам'яті чи просто константи.

    приклад.

    Розглянемо приклад застосування умовного та безумовного переходів. Для наочності зобразимо ланцюжок команд у програмній пам'яті як послідовності графічних елементів (див.Мал. 2.2). Хід виконання програми показано за допомогою стрілок. Квадратиками позначені звичайні команди (команди переміщення та команди перетворення даних). Гурточок із запитанням- це команда умовного переходу. Округлений елемент знак оклику- це безперечний перехід. Така програма має дві гілки. Якщо умова є брехня, виконується гілка номер 1. У разі, якщо умова- істина, виконується гілка №2.

    Припустимо, що умовний перехід здійснює порівняння коду натиснутої клавіші з деякою константою. Тоді дію, яку виконує умовний оператор, можна записати так: "Якщо код натиснутої клавіші дорівнює 0, перейти до виконання гілки номер 2".Відповідно, у разі невиконання умови (наприклад, лічені числа одно 1), програма продовжить свою роботу у звичайному режимі і перейде, таким чином, до виконання гілки номер 1.

    У групі команд передачі управління розрізняють чотири типи команд: безумовні переходи, умовні переходи, цикли та переривання .

    Команди безумовних переходів. Включають три мнемокод: JMP (безумовний перехід), CALL (виклик підпрограми) і RET (повернення з підпрограми).

    Команда JMP дозволяє здійснити перехід до будь-якої точки програми, розташованої як у поточному програмному сегменті, так і в іншому сегменті. При переході в межах поточного програмного сегмента використовуються перші три формати JMP.

    Перший формат забезпечує перехід у довільну точку програми всередині поточного програмного сегмента, для чого до вмісту IP додається додатковий код 16-розрядне зміщення, старший розряд якого є знаковим. Другий, укорочений формат дозволяє перейти до точки програми, що знаходиться не більше ніж на -128-f-127 адрес від команди JMP. Нарешті, третій формат здійснює завантаження покажчика команд 16-розрядним числом, розміщеним за виконавчою адресою ЕА, що визначається постбайтом. Цей перехід називається непрямим, оскільки використовується непряма адресація.

    Для реалізації безумовного переходу до точки програми, розташованої поза поточним програмним сегментом, коли потрібно перезавантаження сегментного регістру CS, використовуються четвертий та п'ятий формати команди JMP.

    Четвертий формат визначає прямий міжсегментний перехід, при якому в другому та третьому байтах формату вказано відносну адресу точки переходу, а в четвертому та п'ятому байтах - нове значення CS. П'ятий формат за допомогою постбайту дозволяє визначити виконавчу адресу ЕА, за якою знаходиться відносна адреса точки переходу (у байтах пам'яті з адресами ЕА, ЕА+1), та нове значення CS (у байтах пам'яті ЕА+2, ЕА+3).

    Команда CALL дозволяє викликати підпрограму, розташовану як у поточному програмному сегменті, так і в іншій області пам'яті. Вона має такі самі формати, як і команда JMP, за винятком укороченого. На відміну від команди JMP аналогічного формату за командою CALL перед зміною значень IP або IP та CS відбувається автоматичний запис у стек поточних значень цих регістрів, що забезпечує запам'ятовування точки повернення з підпрограми.

    Для повернення з підпрограми використовується команда RET, під дією якої відбувається передача керування на адресу повернення, занесеному до стека при виконанні попередньої команди CALL. При поверненні з підпрограм, розташованих у поточному програмному сегменті, застосовуються перші два формати команди RET, причому другий формат відрізняється від першого тим, що до вмісту покажчика стека додається константа, записана у 2-му та 3-му байтах команди. Це дозволяє одночасно з поверненням з підпрограми скидати параметри, записані в стек при виконанні цієї підпрограми і які не використовуються в подальшому.

    Для міжсегментного повернення застосовуються третій і четвертий формати RET, які забезпечують відновлення вмісту як покажчика команд, і програмного сегмента.

    Команди умовних переходів.Здійснюють передачу керування залежно від результатів попередніх операцій. Розрізняють три різновиди умовних переходів, які використовуються для встановлення співвідношень чисел зі знаком, чисел без знака та довільних чисел. У перших двох різновидах для тих самих співвідношень між числами вибираються різні мнемокоды команд, оскільки одним і тим самим співвідношенням чисел зі знаком і чисел без знака відповідають різні значення прапорів.

    У мнемокодах команд умовних переходів при порівнянні чисел зі знаком для позначення умови «більше» використовується буква G (Greater- більше), а для позначення - «менше» буква L (Less- Менше). Для аналогічних умов при порівнянні чисел без знака використовуються відповідно букви A (Above- над) та В (Below- Під). Умова рівності позначається буквою Е (Equal- одно), а невиконання певної умови - буквою N (Not- Не). Слід зазначити, що допускається використання двох різних мнемокодів для кожної команди; наприклад, мнемокоды JL і JNGF - еквівалентні, оскільки умови "менше" і "не більше або одно" - ідентичні.

    Повний список мнемокодов команд, умов, що перевіряються, а також відповідні булевські комбінації прапорів та їх значення наведено в табл. 1.4.

    Таблиця 1.4

    Менімокод команди Умова Значення прапорів
    Для чисел зі знаком
    JL/JNGE Менше/не більше чи одно SF + OF = l
    JNL/JGE Не менше/більше або одно SF + OF = 0
    JG/JNLE Більше/не менше чи одно (SF + OF) V ZF = 0
    JNG/JLE Не більше/менше або одно Для чисел без знака (SF + OF) V ZF = l
    JB/JNAE Менше/не більше чи одно CF = 1
    JNB/JAE Не менше/більше або одно CF = 0
    JA/JNBE Більше CF V ZF = 0
    JNA/JBE Не більше Для інших даних CF V ZF = 1
    JE/JZ Рівно/по нулю ZF = 1
    JNE/JNZ Не одно/по нулю ZF = 0
    JS за мінусом SF = 1
    JNS По плюсу SF = 0
    JO По переповненню OF = l
    JNO За відсутністю переповнення OF = 0
    JP/JPE По парному паритету PF = 1
    JNP/JPO По парному паритету PF = 0

    Усі команди умовних переходів мають однаковий двобайтовий формат, у першому байті якого задається код операції (КОП), а у другому - 8-розрядне зміщення, яке розглядається як число зі знаком і, отже, дозволяє здійснювати зміну адреси в діапазоні від -128 до + 127. За необхідності більш віддаленого («далекого») переходу на виконання умови використовується додатково команда безумовного переходу.

    Час виконання кожної з команд умовних переходів зазначено для двох випадків: 1) умова виконана та управління дійсно передається відповідно до зміщення; 2) умова не виконана, так що управління передається наступній команді.

    Команди організації циклів.Введені в ЦП для зручності виконання обчислювальних циклів. До них відносяться такі мнемокоди: LOOP (цикл, поки (СХ) не дорівнює 0), LOOPNZ/LOOPNE (цикл, поки не нуль/не дорівнює), LOOPZ/LOOPE (цикл, поки нуль/рівно) та JCXZ (перехід по нулю у СГ). Кожна з цих команд має двобайтовий формат, у другому байті якого вказується 8-розрядне зміщення, яке використовується для організації переходу. Це усунення сприймається як число зі знаком і перед обчисленням адреси переходу воно розширюється зі знаком до 16 розрядів.

    Використовуючи команди циклів разом із командами маніпуляції елементами рядків, можна становити досить складні програми перетворення рядків. Розглянемо приклад складання програми для перекладу рядка даних, записаних у шістнадцятковій системі числення, деякий код, для якого перекодувальна таблиця знаходиться в пам'яті з початкової адреси, вказаної в ВХ, як це потрібно для використання команди табличного перетворення кодів XLAT. Нехай далі вихідний рядок містить 80 елементів і знаходиться в пам'яті з відносної початкової адреси 100, а рядок-результат повинна бути розміщена з відносної адреси 200. :

    MOV SI 100
    MOV DI,200
    MOV СГ, 80

    Тут використано команду табличного перетворення кодів XLAT, описану в 1.2.

    Команди переривання.Включають три мнемокод: INT (переривання), INTO (переривання при переповненні) та IRET (повернення з переривання).

    Команда переривання INT при v = 1має двобайтовий формат, другий байт якого містить 8-розрядне число, що визначає тип (type)або рівень переривання. За командою INT typeпроцесор переходить до виконання програми обслуговування переривання зазначеного рівня, причому автоматично виконуються дії, необхідні забезпечення повернення в точку переривання. Ці дії полягають у наступному: вміст регістру прапорів F записується в стек (PUSHF), скидаються прапори IF і TF, поточні значення регістру CS та покажчика команд IP записуються в стек.

    Для визначення початкової адреси програми обслуговування відповідно до значення typeвикористовується таблиця рівнів переривання. Для кожного з 256 рівнів переривань у цій таблиці відведено по чотири байти: перші два байти визначають значення покажчика команд IP, другі - значення сегментного регістру CS. Ця четвірка байтів визначає початкові адреси програм обслуговування (пари значень CS, IP), які мають бути попередньо записані до осередків пам'яті за абсолютними адресами 0-3FFH. Адреса таблиці, що відповідає вказаному у команді INT typeрівнем переривання, визначається ЦП наступним чином. Після запам'ятовування у стеку поточних значень CS та ГР здійснюються завантаження: CS = type x 4 + 2 та IP = type x 4. Нові значення CS та IP, взяті відповідно з осередків з адресами type x 4 + 2 і type x 4, визначають початкову адресу необхідної програми обслуговування.

    Розглянута вище команда переривання INT під час поля v = 0має однобайтовий формат, тобто не вимагає спеціальної вказівки рівня переривання. Ця команда автоматично сприймається процесором як переривання третього рівня. (type=3)і зазвичай використовується в програмах як контрольна точка.

    Команда переривання під час переповнення INTO викликає перехід на обслуговування переривання четвертого рівня (type = 4)у разі, коли значення прапора переповнення OF = 1.Команда INTO зазвичай використовується після арифметичних команд над числами зі знаком. Зазвичай кілька перших рівнів переривань (до 32) резервуються під обробку низки специфічних ситуацій, таких, наприклад, як спроба поділу на нуль, переповнення тощо.

    Особливість обробки переривань зарезервованих рівнів полягає в тому, що процесор переходить до обслуговування незалежно від значення прапора IF дозволу переривань.

    Однобайтова команда IRET ставиться наприкінці кожної програми обслуговування переривання та забезпечує повернення з переривання. За цією командою процесор витягує зі стека значення вказівника команд IP та програмного сегмента CS, а також відновлює колишній вміст регістру прапорів F (як і за командою POPF). При необхідності вміст інших регістрів ЦП, відповідне перерваної програмі, може бути запам'ятоване у стеку під час переходу програму обслуговування і потім відновлено під час повернення з неї з допомогою команд звернення до стеку.

    Інформатика та інформаційні технології: конспект лекцій Цвєткова А В

    2. Команди передачі управління

    Ми познайомились із деякими командами, з яких формуються лінійнідільниці програми. Кожна з них у загальному випадку виконує деякі дії щодо перетворення або пересилання даних, після чого мікропроцесор передає керування наступній команді. Але дуже мало програм працює таким послідовним чином. Зазвичай у програмі є точки, в яких потрібно ухвалити рішення про те, яка команда виконуватиметься наступною. Це рішення може бути:

    1) безумовним –у цій точці необхідно передати управління не тій команді, яка йде наступною, а іншою, яка знаходиться на деякому віддаленні від поточної команди;

    2) умовним –Рішення про те, яка команда виконуватиметься наступною, приймається на основі аналізу деяких умов або даних.

    Програма є послідовністю команд і даних, що займають певний простір оперативної пам'яті. Цей простір пам'яті може бути безперервним, або складатися з декількох фрагментів.

    Те, яка команда програми має виконуватися наступною, мікропроцесор дізнається за вмістом пари регістрів cs:(e)ip:

    1) cs - сегментний регістр коду, в якому знаходиться фізична (базова) адреса поточного сегмента коду;

    2) eip/ip – регістр покажчика команди, у якому перебуває значення, що є зміщення у пам'яті наступної команди, підлягає виконанню, щодо початку поточного сегмента коду.

    Який регістр буде використовуватися, залежить від встановленого режиму адресації use16 або use32. Якщо вказано use 16, використовується ip, якщо use32, то використовується eip.

    Таким чином, команди передачі управління змінюють вміст регістрів cs і eip/ip, в результаті чого процесор вибирає для виконання не наступну по порядку команду програми, а команду в деякій іншій ділянці програми. Конвеєр усередині мікропроцесора при цьому скидається.

    За принципом дії команди мікропроцесора, що забезпечують організацію переходів у програмі, можна поділити на 3 групи:

    1. Команди безумовної передачі управління:

    1) команда безумовного переходу;

    2) команда виклику процедури та повернення з процедури;

    3) команда виклику програмних переривань та повернення з програмних переривань.

    2. Команди умовної передачі управління:

    1) команди переходу за результатом команди порівняння стор;

    2) команди переходу за станом певного прапора;

    3) команди переходу за вмістом регістру есх/сх.

    3. Команди управління циклом:

    1) команда організації циклу з лічильником есх/сх;

    2) команда організації циклу з лічильником есх/сх з можливістю дострокового виходу із циклу за додатковою умовою.

    Безумовні переходи

    Попереднє обговорення виявило деякі деталі механізму переходу. Команди переходу модифікують регістр покажчика команди eip/ip та, можливо, сегментний регістр коду cs. Що саме має бути модифіковано, залежить:

    1) від типу операнда у команді безумовного переходу (ближній чи далекий);

    2) від вказівки перед адресою переходу (у команді переходу) модифікатора;при цьому сама адреса переходу може знаходитися або безпосередньо в команді (прямий перехід), або в регістрі або комірці пам'яті (непрямий перехід).

    Модифікаторможе приймати такі значення:

    1) near ptr – прямий перехід на мітку всередині сегмента коду. Модифікується лише регістр eip/ip (залежно від заданого типу сегмента коду use16 або use32) на основі вказаної в команді адреси (мітки) або виразу, який використовує символ отримання значення – $;

    2) far ptr – прямий перехід на мітку в іншому сегменті коду. Адреса переходу задається у вигляді безпосереднього операнда або адреси (мітки) і складається з 16-бітного селектора та 16/32-бітного зміщення, які завантажуються, відповідно, в регістри cs та ip/eip;

    3) word ptr – опосередкований перехід на мітку всередині поточного сегмента коду. Модифікується (значенням зміщення з пам'яті за вказаною в команді адресою або з регістру) тільки eip/ip. Розмір усунення 16 або 32 біт;

    4) dword ptr – опосередкований перехід на мітку в іншому сегменті коду. Модифікуються (значенням із пам'яті – і лише з пам'яті, з регістру не можна) обидва регістри – cs та eip/ip. Перше слово/подвійне слово цієї адреси представляє зміщення та завантажується в ip/eip; друге/третє слово завантажується в cs. Команда безумовного переходу jmp

    Синтаксис команди безумовного переходу – jmp [модифікатор] адреса_переходу – безумовний перехід без збереження інформації про точку повернення.

    Адрес_перехода є адресу як мітки чи адресу області пам'яті, де знаходиться покажчик переходу.

    Загалом у системі команд мікропроцесора є кілька кодів машинних команд безумовного переходу jmp.

    Їх відмінності визначаються дальністю переходу та способом завдання цільової адреси. Дальністьпереходу визначається місцезнаходженням операнда адреса_переходу.Ця адреса може знаходитися в поточному сегменті коду або в іншому сегменті. У першому випадку перехід називається внутрішньосегментним,або близьким,у другому - міжсегментним,або далеким.Внутрішньосегментний перехід передбачає, що змінюється лише вміст регістру eip/ip.

    Можна виділити три варіанти внутрішньосегментного використання команди jmp:

    1) прямий короткий;

    2) прямий;

    3) непрямий.

    Процедури

    У мові асемблера є кілька засобів, які вирішують проблему дублювання ділянок програмного коду. До них відносяться:

    1) механізм процедур;

    2) макроассемблерів;

    3) механізм переривань.

    Процедура, часто звана також підпрограмою, -це основна функціональна одиниця декомпозиції (поділу кілька частин) деякої завдання. Процедура являє собою групу команд для вирішення конкретної підзадачі і має засоби отримання управління з точки виклику завдання вищого рівня і повернення управління в цю точку.

    У найпростішому випадку програма може складатися з однієї процедури. Іншими словами, процедуру можна визначити як правильно оформлену сукупність команд, яка, будучи одноразово описана, при необхідності може бути викликана в будь-якому місці програми.

    Для опису послідовності команд як процедури в мові асемблера використовуються дві директиви: PROC і ENDP.

    Синтаксис опису процедури такий (рис. 36).

    Мал. 36. Синтаксис опису процедури у програмі

    З малюнка 36 видно, що у заголовку процедури (директиві PROC) обов'язковим є завдання імені процедури. Серед великої кількості операнда директиви PROC слід особливо виділити [відстань]. Цей атрибут може набувати значення near або far і характеризує можливість звернення до процедури з іншого сегмента коду. За умовчанням атрибут [відстань] набуває значення near.

    Процедура може розміщуватись у будь-якому місці програми, але так, щоб на неї випадковим чином не потрапило керування. Якщо процедуру просто вставити в загальний потік команд, то мікропроцесор сприйматиме команди процедури як частину цього потоку і, відповідно, здійснюватиме виконання команд процедури.

    Умовні переходи

    Мікропроцесор має 18 команд умовного переходу. Ці команди дозволяють перевірити:

    1) відношення між операндами зі знаком («більше – менше»);

    2) відношення між операндами без знака («вище – нижче»);

    3) стан арифметичних прапорів ZF, SF, CF, OF, PF (але не AF).

    Команди умовного переходу мають однаковий синтаксис:

    jcc тега_переходу

    Як видно, мнемокод усіх команд починається з «j» – від слова jump(стрибок), її –визначає конкретну умову, аналізовану командою.

    Щодо операнда метка_переходу,то ця мітка може бути тільки в межах поточного сегмента коду, міжсегментна передача управління в умовних переходах не допускається. У зв'язку з цим відпадає питання про модифікатора, який був у синтаксисі команд безумовного переходу. У ранніх моделях мікропроцесора (i8086, i80186 та i80286) команди умовного переходу могли здійснювати лише короткі переходи – на відстань від -128 до +127 байт від команди, що йде за командою умовного переходу. Починаючи з моделі мікропроцесора 80386 це обмеження знято, але, як бачите, тільки в межах поточного сегмента коду.

    Для того щоб прийняти рішення про те, куди буде передано управління командою умовного переходу, попередньо має бути сформована умова, на підставі якої прийматиметься рішення про передачу управління.

    Джерелами такої умови можуть бути:

    1) будь-яка команда, що змінює стан арифметичних прапорів;

    2) команда порівняння стор, що порівнює значення двох операндів;

    3) стан регістру есх/сх.

    Команда порівняння cmp

    Команда порівняння стор має цікавий принцип роботи. Він абсолютно такий самий, як і у команди віднімання – sub операнде, операнд_2.

    Команда стор так само, як і команда sub, виконує віднімання операндів і встановлює прапори. Єдине, чого вона не робить - це запис результату віднімання на місце першого операнда.

    Синтаксис команди стр - стр операнд_1, операнд_2 (compare) - порівнює два операнди і за результатами порівняння встановлює прапори.

    Прапори, що встановлюються командою сторінок, можна аналізувати спеціальними командами умовного переходу. Перш ніж ми розглянемо їх, приділимо трохи уваги мнемоніці цих команд умовного переходу (табл. 16). Розуміння позначень при формуванні назви команд умовного переходу (елемент у назві команди jcc, позначений нами її) полегшить їхнє запам'ятовування та подальше практичне використання.

    Таблиця 16. Значення абревіатур у назві команди jcc

    Таблиця 17. Перелік команд умовного переходу для команди операнд_1, операнд_2

    Не дивуйтеся тієї обставини, що однаковим значенням прапорів відповідає кілька різних мнемокодов команд умовного переходу (вони відокремлені косою межею в табл. 17). Різниця у назві обумовлена ​​бажанням розробників мікропроцесора полегшити використання команд умовного переходу у поєднанні з певними групами команд. Тому різні назви відображають швидше різну функціональну спрямованість. Проте те, що ці команди реагують на ті самі прапори, робить їх абсолютно еквівалентними та рівноправними в програмі. Тому в таблиці 17 вони згруповані не за назвами, а за значеннями прапорів (умов), на які вони реагують.

    Команди умовного переходу та прапори

    Мнемонічне позначення деяких команд умовного переходу відображає назву прапора, з яким вони працюють, і має таку структуру: першим іде символ «j» (Jump,перехід), другим - або позначення прапора, або символ заперечення "n", після якого стоїть назва прапора. Така структура команди відбиває її призначення. Якщо символу «n» немає, то перевіряється стан прапора, якщо він дорівнює 1, переходить на мітку переходу. Якщо символ «n» присутній, то перевіряється стан прапора на рівність 0, й у разі успіху відбувається перехід на мітку переходу.

    Мнемоди команди, назви прапорів та умови переходів наведені в таблиці 18. Ці команди можна використовувати після будь-яких команд, що змінюють зазначені прапори.

    Таблиця 18. Команди умовного переходу та прапори

    Якщо уважно подивитися на таблиці 17 і 18, видно, що багато команд умовного переходу в них є еквівалентними, тому що в основі тих і інших лежить аналіз однакових прапорів.

    Команди умовного переходу та регістр есх/сх

    Архітектура мікропроцесора передбачає специфічне використання багатьох регістрів. Наприклад, регістр EAX/AX/AL використовується як акумулятор, а регістри ВР, SP – до роботи зі стеком. Реєстр ЕСХ/СХ також має певне функціональне призначення: він виконує роль лічильникау командах управління циклами та при роботі з ланцюжками символів. Можливо, що функціонально команду умовного переходу, пов'язану з регістром есх/сх, правильніше було б віднести до цієї групи команд.

    Синтаксис цієї команди умовного переходу такий:

    1) jcxz мітка_переходу (Jump if ex is Zero) - перехід, якщо сх нуль;

    2) jecxz мітка_переходу (Jump Equal есх Zero) – перехід, якщо есх нуль.

    Ці команди дуже зручно використовувати при організації циклу та при роботі з ланцюжками символів.

    Слід зазначити обмеження, властиве команді jcxz/jecxz. На відміну з інших команд умовної передачі управління команда jcxz/jecxz може адресувати лише короткі переходи – на -128 байт чи +127 байт від наступної команди.

    Організація циклів

    Цикл, як відомо, є важливою алгоритмічною структурою, без використання якої не обходиться, напевно, жодна програма. Організувати циклічне виконання деякої ділянки програми можна, наприклад, використовуючи команди умовної передачі чи команду безумовного переходу jmp. За такої організації циклу всі операції з його організації виконуються вручну. Але, враховуючи важливість такого алгоритмічного елемента, як цикл, розробники мікропроцесора ввели у систему команд групу із трьох команд, що полегшує програмування циклів. Ці команди також використовують регістр есх/сх як лічильник циклу.

    Дамо коротку характеристику цим командам: 1) loop метка_переходу (Loop) - повторити цикл. Команда дозволяє організувати цикли, подібні до циклів for у мовах високого рівня з автоматичним зменшенням лічильника циклу. Робота команди полягає у виконанні наступних дій:

    б) порівняння регістру ЕСХ/СХ з нулем: якщо (ЕСХ/СХ) = 0, то управління передається на наступну після loop команду;

    2) loope/loopz тега_переходу

    Команди loope та loopz – абсолютні синоніми. Робота команд полягає у виконанні наступних дій:

    а) декременту регістру ЕСХ/СГ;

    в) аналіз стану прапора нуля ZF якщо (ЕСХ/СХ) = 0 або XF = 0, управління передається на наступну після loop команду.

    3) loopne/loopnz тега_переходу

    Команди loopne та loopnz також абсолютні синоніми. Робота команд полягає у виконанні наступних дій:

    а) декременту регістру ЕСХ/СГ;

    б) порівняння регістру ЕСХ/СХ із нулем;

    в) аналіз стану прапора нуля ZF: якщо (ЕСХ/СХ) = 0 або ZF = 1, управління передається на наступну після loop команду.

    Команди loope/loopz та loopne/loopnz за принципом своєї роботи є взаємозворотними. Вони розширюють дію команди loop тим, що додатково аналізують прапор zf, що дає можливість організувати достроковий вихід із циклу, використовуючи цей прапор як індикатор.

    Недолік команд організації циклу loop, loope/loopz і loopne/loopnz у тому, що вони реалізують лише короткі переходи (від -128 до +127 байт). Для роботи з довгими циклами доведеться використовувати команди умовного переходу та команду jmp, тому постарайтеся освоїти обидва способи організації циклів.

    З книги ПРОГРАМНЕ ЗАБЕЗПЕЧЕННЯ ВБУДОВАНИХ СИСТЕМ. Загальні вимоги до розробки та документування автора Держстандарт Росії

    З книги Linux для користувача автора Костромін Віктор Олексійович

    З книги Інформатика та інформаційні технології: конспект лекцій автора Цвєткова А В

    ЛЕКЦІЯ № 19. Команди передачі управління

    З книги 200 найкращих програм для Інтернету. Популярний самовчитель автора Країнський І

    2. Команди передачі управління Ми познайомилися з деякими командами, у тому числі формуються лінійні ділянки програми. Кожна з них у загальному випадку виконує деякі дії щодо перетворення або пересилання даних, після чого мікропроцесор передає керування

    З книги Windows Vista без напруження автора

    Існують два способи передачі потокового відео - послідовний (Progressive Streaming) і в реальному часі (Real-Time Streaming). При передачі послідовним способом якість зображення завжди краще, оскільки відео відтворюється з жорсткого диска

    З книги Linux-сервер своїми руками автора

    Проблеми передачі Під час трансляції потокового відео через Інтернет можуть виникати проблеми, що погіршують якість передачі. Серед них можна виділити кілька основних. Перебої у зв'язку Потокове мовлення вимагає стабільного зв'язку. Оскільки Інтернет не може забезпечити

    З книги TCP/IP Архітектура, протоколи, реалізація (включаючи IP версії 6 та IP Security) автора Фейт Сідні М

    8.1. Панель керування потрібна для керування У будь-якому складному пристрої завжди є пульт – набір кнопок, важелів, сенсорних датчиків, штурвалів… словом, пристроїв, за допомогою яких можна цим складним пристроєм керувати. Є такий «пульт» і в Vista. Він називається

    З книги OrCAD PSpice. Аналіз електричних кіл автора Кеоун Дж.

    5.3. Команди управління процесами Команда psКоманда ps призначена для виведення інформації про виконувані в даний момент процеси. Ця команда має багато параметрів, про які ви можете прочитати у посібнику (man ps). Тут я опишу лише найчастіше використовувані

    З книги Linux: Повний посібник автора Колісниченко Денис Миколайович

    10.4. Команди керування сервером DNS Для керування сервером DNS використовується програма ndc. Її можна використовувати з параметрами start, stop, reload, restart. Параметр start запускає сервер, a stop – зупиняє. Параметр reload перезавантажує файли зони, якщо в них відбулися зміни,

    З книги ПК без напруження автора Жвалевський Андрій Валентинович

    14.6.1 Команди керування доступом Команди та параметри, які визначають доступ користувача до сховища файлів віддаленого хоста, визначені в таблиці 14.1. Таблиця 14.1 Команди авторизації користувача для доступу до архіву

    З книги Мистецтво програмування мовою сценаріїв командної оболонки автора Купер Мендель

    14.6.2 Команди керування файлами Команди з таблиці 14.2 дають можливість виконувати типові операції позиціонування на каталог та керування файлами віддаленого хоста. Робочим каталогом (working directory) називається поточний каталог користувача. Таблиця 14.2 Команди вибору

    З книги автора

    Лінії передачі Хоча PSpice є спеціальний пристрій під ім'ям T (для ліній передачі), застосування його обмежено, оскільки ця модель не враховує втрат у лінії. Ми вважаємо за краще використовувати для лінії передачі модель, яка враховує втрати і містить елементи R,

    З книги автора

    9.2. Команди управління процесами 9.2.1. Ієрархія процесів: ps та pstree Про те, що команда ps дозволяє переглянути відомості про всі процеси, що протікають у системі в даний момент, ви вже знаєте (п.3.2). З ключем -f ця команда виводить як PID самого процесу, і PPID його батька,

    З книги автора

    Панель керування потрібна для керування У будь-якому складному пристрої завжди є пульт – набір кнопок, важелів, сенсорних датчиків, штурвалів… словом, пристроїв, за допомогою яких можна цим складним пристроєм керувати. Є такий «пульт» і в Vista. Він називається

    З книги автора

    11.1. Команди керування завданнями Деякі з наведених нижче команд приймають, як аргумент, "ідентифікатор завдання". Див. таблицю в кінці глави. jobs Виводить список завдань, що виконуються у фоні. Команда s більш інформативна. Завдання та процеси легко сплутати.

    З книги автора

    12.7. Команди керування терміналом Команди, що мають відношення до консолі або терміналуtputініціалізація терміналу або виконання запиту до бази даних терміналів terminfo. За допомогою tput можна виконувати різні операції. tput clear - еквівалентно команді clear. tput reset - еквівалентно



    Сподобалася стаття? Поділіться з друзями!
    Чи була ця стаття корисною?
    Так
    Ні
    Дякую за ваш відгук!
    Щось пішло не так і Ваш голос не був врахований.
    Дякую. Ваше повідомлення відправлено
    Знайшли у тексті помилку?
    Виділіть її, натисніть Ctrl+Enterі ми все виправимо!