Система команд. Організація умовних переходів

Інформація про навчальний заклад

ВУЗ:
Національний технічний університет України Київський політехнічний інститут
Інститут:
О
Факультет:
Не вказано
Кафедра:
Не вказано

Інформація про роботу

Рік:
2022
Тип роботи:
Звіт до лабораторної роботи
Предмет:
Операційні системи

Частина тексту файла (без зображень, графіків і формул):

Міністерство освіти і науки України Національний технічний університет України «Київський політехнічний інститут імені Ігоря Сікорського» Теплоенергетичний факультет Кафедра автоматизації проектування енергетичних процесів і систем Звіт до лабораторної роботи №7 з дисципліни «Операційні системи» Тема « Система команд. Організація умовних переходів» Варіант 3 КИЇВ-2022 Мета роботи. Вивчення команд умовних переходів і способів їх використання в асемблерних програмах для реалізації розгалужень в обчисленнях. Теоретична частина. Команди переходу забезпечують безумовні переходи усередині поточного кодового сегменту (внутрішній перехід) або з поточного сегменту в інший кодовий сегмент (зовнішній або міжсегментний перехід). Всі ці переходи реалізуються за допомогою команди 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, використовуючи команди порівняння. Результат перевірити на область допустимих значень. / Результати: При a > b (a = 4, b = 2) / / / При a = b / При a < b (a = 2, b = 6) / При діленні на нуль (b = 6, a = 0) / Код програми: ; ЛР-7 ; Слюсарчук ТР-15 ; 29.06.2022 .model small .stack 100h .data a dw 4 b dw 2 h dw ? ;Допоміжна змінна для обчислень message db 'Error! Division by zero.$' .code start: mov ax, @data mov ds, ax mov ax, a cmp ax, b jg @more je @equal jl @less @more: mov ax, a cwd imul a sbb ax, b mov h, ax cmp b, 0 je @error cwd idiv b jmp @main @equal: mov ax, -5 jmp @main @less: mov ax, b cmp a, 0 je @error cwd idiv a add ax, 5 @main: mov h, ax push ax cmp ax, 0 jns @def_count mov ah, 02h mov dl, '-' int 21h pop ax neg ax @def_count: xor cx, cx mov bx, 10 @dvsn: xor dx, dx div bx push dx inc cx test ax, ax jnz short @dvsn mov ah, 02h @output: pop dx add dl, 30h int 21h loop @output jmp @end @error: mov ah, 09h mov dx, offset message int 21h @end: mov ah, 4ch int 21h end start Висновки: В даній лабораторній роботі було ознайомлено з командами умовного переходу та отримав практичні навички роботи з ними.
Антиботан аватар за замовчуванням

06.05.2023 11:05-

Коментарі

Ви не можете залишити коментар. Для цього, будь ласка, увійдіть або зареєструйтесь.

Ділись своїми роботами та отримуй миттєві бонуси!

Маєш корисні навчальні матеріали, які припадають пилом на твоєму комп'ютері? Розрахункові, лабораторні, практичні чи контрольні роботи — завантажуй їх прямо зараз і одразу отримуй бали на свій рахунок! Заархівуй всі файли в один .zip (до 100 МБ) або завантажуй кожен файл окремо. Внесок у спільноту – це легкий спосіб допомогти іншим та отримати додаткові можливості на сайті. Твої старі роботи можуть приносити тобі нові нагороди!
Нічого не вибрано
0%

Оголошення від адміністратора

Антиботан аватар за замовчуванням

Подякувати Студентському архіву довільною сумою

Admin

26.02.2023 12:38

Дякуємо, що користуєтесь нашим архівом!