Міністерство освіти і науки УкраїниНаціональний технічний університет України
«Київський політехнічний інститут ім. І. Сікорського»
Кафедра автоматизації проектування енергетичних процесів і систем
Лабораторна робота №7
з дисципліни «Операційні системи»
«Система команд. Організація умовних переходів»
Мета роботи
Вивчення команд умовних переходів і способів їх використання в асемблерних програмах для реалізації розгалужень в обчисленнях.
Теоретичні відомості
Команди переходу забезпечують безумовні переходи усередині поточного кодового сегменту (внутрішній перехід) або з поточного сегменту в інший кодовий сегмент (зовнішній або міжсегментний перехід). Всі ці переходи реалізуються за допомогою команди JMP, яка має формат
JMP [type] OPR
де type - тип переходу: SHORT (короткий), NEAR (ближній) або FAR (дальній), за замовчуванням приймається NEAR;
OPR - ім'я, мітка або адресний вираз. Залежно від типу переходу (type) і/або структури операнда OPR можна виділити 5 видів команд безумовного переходу, з яких три визначають внутрішньосегментні переходи, а дві - міжсегментні переходи.
JMP SHORT label ; короткий перехід в межах -128...+127
; байт відносно адреси наступної команди
JMP [NEAR PTR] label ; внутрішньосегментний прямий перехід
; по зсуву відносно мітки label
JMP [NEAR PTR] opr ; внутрішньосегментний непрямий перехід
; opr - регістр або слово в пам'яті, де
; міститься адреса переходу
JMP [FAR PTR] label ; міжсегментний прямий перехід за
; адресою (Seg: Offset) мітки label
JMP [FAR PTR] opr ; міжсегментний непрямий 9 (косвенний) перехід
; за адресою (Seg: Offset), записаною в пам'яті, на
; яку вказує операнд opr
Мітка label - це безпосередня мітка команди (ім'я із завершуючою двокрапкою) або мітка, визначена в кодовому сегменті за допомогою директиви LABEL. Операнд opr в командах непрямого переходу являє собою ім'я регістра, в якому міститься адреса переходу (тільки для внутрішніх переходів), або ім'я змінної, де записана адреса переходу (одне слово для внутрішньосегментного переходу або два слова для міжсегментного переходу), або ж адресний вираз, яким визначається адреса пам'яті, де зберігається адреса переходу. Слід підкреслити, що у разі внутрішньосегментного прямого переходу в команді зберігається не пряма адреса переходу (Offset), а зсув (Displacement) в байтах від наступної після JMP команди до мітки переходу, який складається з поточним вмістом IP при виконання команди JMP і тим самим робить вміст IP рівним цільовій адресі (Offset) переходу в поточному сегменті. Це дозволяє переміщати кодовий сегмент в пам'яті без корекції інформації про переходи. У разі прямих міжсегментних переходів в команді зберігається повна логічна адреса переходу (Seg: Offset), яка повинна коректуватися при переміщеннях сегменту, в якому знаходиться точка переходу.
Окрім розглянутих вище команд безумовного переходу, в системі команд х86 є 17 команд умовного переходу, які, як і команда JMP SHORT label, забезпечують короткий перехід в сегменті в діапазоні -128 ... +127 байтів відносно адреси наступної команди. Всі вони мають 2-байтний формат; причому в другому байті міститься зсув (ціле із знаком), який розширюється знаковим розрядом до слова і складається з вмістом IP, якщо на момент виконання команди задана її мнемокодом умова ВИКОНАНА, інакше цей зсув не додається до IP і, отже, перехід не здійснюється. Деякі команди умовних переходів мають два, а то і 3 різних мнемокоду, наприклад, команди JB, INAE і JC мають абсолютно ідентичний машинний код, але різне контекстне "наповнення" програми:
JB label ;обійти перехід, якщо "менше" (CF=l)
JNAE label ; обійти перехід, якщо "не менше і не дорівнюється" (CF=1)
JC label , обійти перехід, якщо виникло перенесення/заем,т. е. CF=
Програміст вибирає з цих трьох рівноцінних команд ту, яка на його думку краще відображає умову переходу. Команди умовного переходу використовуються після арифметичних, логічних і інших команд, що впливають на прапорці, для розгалуження алгоритму залежно від результату виконання команди Особливо важливо правильно використовувати команди умовних переходів після команди порівняння оскільки шукається відмінність між порівнянням чисел із знаком і без знаку:
СМР ор1,ор2 ; ор1 і ор2 числа із знаком або без знаку
перехід, якщо op1 > ор2 JG (JNLE) JA (JNBE)
ор1 >= ор2 JGE (JNL) JAE (JNB, JNC)
op1 < ор2 JL (JNGE) JB (JNAE, JC)
ор1 <= ор2 JLE (JNG) JBE (JNA)
ор1 = ор2 JE (JZ) JE (JZ)
ор1 <> ор2 JNE (JNZ) JNE (JNZ)
Якщо потрібно здійснити умовний внутрішньосегментний довгий або навіть міжсегментний умовний перехід, то застосовується наступний прийом.
Jcc No_Jump ; обхід JMP по протилежній умові
JMP NEAR PTR або JMP FAR PTR ; по необхідній умові
No_Jump ... ; продовжити, якщо потрібна умова не виконана.
Наприклад, якщо за умови АН > AL (без знаку) потрібно перейти на мітку Too_Big в іншому сегменті, то це можна запрограмувати так:
СМР AH,AL ; порівняти операнди
JBE Cont ; обійти перехід, якщо АН <= AL
JMP FAR PTR Too_Big ; перейти, якщо АН > AL
Cont ... ; продовження, якщо немає переходу за умовою
Використовуючи команди умовних і безумовних переходів, можна реалізувати різні види розгалуження в програмі, у тому числі і цикли. Але для реалізації циклів з певним числом повторень в системі команд х86 є спеціальні команди управління циклами, кожна з яких при виконанні зменшує на 1 вміст CX, а потім використовує його нове значення для ухвалення рішення про перехід:
LOOP label ; продовжити з label, якщо СХ не рівний 0
LOOPE label ; продовжити з label, якщо СХ не рівний 0
; і ZF-1, т .е. повторення циклу припиняється
; якщо СХ = 0 або ZF стане рівний 0
LOOPNE label ; продовжити з label, якщо СХ не рівний 0
; і ZF = 0, тобто повторення циклу припиняється ;если СХ = 0 або ZF стане рівний 1
Для команди LOOPE є еквівалент LOOPZ, а для команди LOOPNE - LOOPNZ. Очевидно, що перед входом в цикл потрібно підготувати лічильник циклів в СХ, для запобігання входу в цикл з нульовим значенням СХ корисно використовувати команду короткого переходу.
JCXZ label ; перехід, якщо СХ = 0
При використанні умовних команд управління циклом в тілі циклу повинні бути команди, що впливають на прапорець ZF.
Завдання:
Обчислити умовний цілочисельний вираз у форматах Integer та Word, використовуючи команди порівняння. Результат перевірити на область допустимих значень. Завдання згідно 24 варіанту :
/
Код створеної програми:
/
/
Трансляція, створення ехе-програми:
/
TD:
/
Дійсно при обчисленні цього виразу з такими значеннями можна отримати такий результат:
Розв’язок: 4/1 + 2 = 6
Висновок: В даній лабораторній роботі було ознайомлено з командами умовного переходу та отримав практичні навички роботи з ними.