Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Антонов О.С., Хiхловська I.В. Обчислювальна тех...doc
Скачиваний:
15
Добавлен:
01.09.2019
Размер:
4.12 Mб
Скачать

9.4.2 Розгалужені програми

У послідовних ділянках програми виконування команд відбувається згідно з їхнім розташуванням. Однак за умовами тієї чи іншої задачі може виникнути необхідність зміни порядку виконання команд. Це реалізується за допомогою команд, призначених для передачі керування з однієї точки програми до іншої. При виконанні будь-якої команди відбувається нарощування вмісту вказівника команд IP, що дозволяє одержати адресу наступної виконуваної команди у лінійних програмах. Якщо ж треба перейти до потрібної адреси у програмі, використовують безпосередню зміну значення вказівника команди IP та/або значення сегментного регістра коду CS за допомогою команд умовного та безумовного переходів. Розрізняють команди подальнього (far), близького (near) та короткого (short) переходів. При подальньому переході змінюється не тільки вміст вказівника команд IP, але й вміст сегментного регістра коду CS, тобто можливий перехід до будь-якої комірки пам’яті, на відстань, більшу ніж 216 адрес комірок памяті, а не тільки у межах сегмента коду. Це дає можливість реалізувати міжсегментні переходи до будь-якого сегмента, наприклад, при виконанні підпрограм. Цей сегмент потім стає поточним сегментом коду. При близькому переході змінюється тільки вміст вказівника команд IP у межах [-216... +216-1] адрес, а вміст сегментного регістра CS не змінюється, тобто перехід можливий тільки у сегменті коду CS. При короткому переході границі змінення вказівника команд IP становлять [-128....+127] адрес.

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

Команди безумовного переходу (БП) дозволяють перейти на задану адресу програми без запам’ятовування адреси повернення. Є можливими три форми мнемонічного подання команди безумовного переходу:

JMP 0110H ; Прямий перехід на адресу 0110Н

JMP [offset] ; Перехід за зміщенням відносно поточного вмісту

; вказівника команд IP

JMP [operand] ; Непрямий перехід; адреса переходу вміщується до

; регістрів загального призначення або до комірок

; пам’яті

При прямому переході адреса переходу замінює вміст вказівника команд і, при необхідності, вміст сегментного регістра коду.

Зміщення являє собою 8-, 16- та 32-розрядне число (останнє тільки для МП I80386 та старших).

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

При непрямому переході адреса продовження програми визначається вмістом одного з 16– ( АХ, ВХ, СХ, DX, SI, DI, BP, SP ) або 32– ( EAX, EBX, ECX, EDX, ESI, EDI, EBP, ESP — для старших моделей) розрядних регістрів загального призначення або ділянки пам’яті. У першому випадку реалізується короткий або близький перехід, а у другому і третьому випадках перехід може бути також і подальнім. Вміст вказаного у команді регістра або ділянки пам’яті є новим вмістом вказівника команд IP та, при необхідності, сегментного регістра коду CS. У наступних фрагментах програми показані можливі варіанти указання адреси при безумовних переходах.

CS : IP

7000 : 30 MOV DS, AX ; Завантаження DS з АХ

7000 : 32 MOV AX,1234H ; Завантаження АХ даним 1234Н

7000 : 35 JMP 0039 H ; Обхід команди MOV CX,AX

7000 : 37 MOV CX,AX ; Завантаження СХ з АХ

7000 : 39 MOV DX,AX ; Завантаження DX з АХ

CS : IP

7000 : 30 MOV DS, AX ; Фрагмент

7000 : 32 MOV AX, 0039H ; програми

7000 : 35 JMP AX ; аналогічний

7000 : 37 MOV CX, AX ; попередньому

7000 : 39 MOV DX, AX

CS : IP

7000 : 30 MOV AX, 003CH ; Фрагмент

7000 : 33 MOV [ 50], AX ; програми

7000 : 36 JMP [50] ; аналогічний

7000 : 3A MOV CX, AX ; попередньому

7000 : 3C MOV DX, AX

Прапорці при виконанні команд безумовних переходів не змінюються.

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

Умовні переходи (УП) у програмах здійснюються при виконанні вказаних у них умов залежно від одержаного перед УП результату і не реалізуються, якщо зазначені умови не виконані, тоді виконується ділянка програми, що йде безпосередньо за командою умовного переходу. Команди умовних переходів наводяться у табл. 9.4. Для деяких умов існують кілька команд умовного переходу. Використання певної команди залежить тільки від програміста. Умови “вище” або “нижче” відносяться до величин без знаку, а “більше” та “менше” до величин зі знаком. Зміщення у командах умовного переходу – це величини у діапазоні -128...+127, тобто вони займають 1 байт. Для МП I80386 та старших можна використовувати зміщення, що займає 2 або 4 байти. Вміст регістра СS не змінюється.

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

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

Приклад 9.4.8 Два однобайтових беззнакових даних D1 та D2 зберігаються у стеку. Перше дане міститься за молодшою адресою стека, друге – за старшою. Якщо різниця між першим та другим даними є негативна і кількість одиниць в ній непарна, то слід:

– збільшити перше дане на 5Н;

– інвертувати друге дане;

– отримані результати запам’ятати відповідно за суміжними адресами в сегменті даних зі зміщеннями 10Н та 11Н.

У разі парної кількості одиниць у різниці даних необхідно:

– збільшити перше дане на 02Н;

– збільшити друге слово на 01Н;

– отримані результати записати за тими самими адресами.

Якщо різниця даних позитивна, їх слід зберегти у стеку.

Структурна схема алгоритму має вид (рис. 9.13).

Рисунок 9.13 – Структурна схема алгоритму

Фрагмент програми розв’язання задачі:

MOV AX, 0F0A ; Завантаження даних до АХ

PUSH AX ; Завантаження даних до стека

POP AX ; Завантаження даних із стека до АХ

MOV BX,AX ; Збереження вмісту АХ в ВХ

SUB BL,BH ; Різниця даних

JNS POSIT ; позитивна ?

JP EVEN ; Ні, кількість одиниць парна?

ADD AL, 05H ; Ні, зміна першого слова

NOT AH ; Зміна другого даного

MOV [10H], AX ; Запам’ятовування нових даних у

; сегменті даних

JMP KІNEC ; БП на кінець програми

EVEN: ADD AL, 02H ; Так, зміна першого даного

INC AH ; Інкрементування другого даного

MOV [10], AX ;Запам’ятовування даних у сегменті даних

JMP KІNEC ; БП на кінець програми

POSIT: PUSH AX ; Запам’ятовування вхідних даних у стеку

KІNEC: NOP ; Кінець програми

Перед виконанням програми до стека, враховуючи значення вказівника стека SP, треба по черзі завантажувати дані D1 та D2 так, щоб кожного разу виконувалася одна гілка розгалуженої програми , а комірки пам’яті у сегменті даних зі зміщеннями 10Н та 11Н попередньо обнулити, щоб перевірити правильність виконання програми. Якщо перше дане дорівнює 0АН, а друге – 0FH , то при завантаженні регістра АХ із стека після виконання команди POP AX у регістрі AL буде розміщене перше дане – 0AH, а у регістрі АН – друге дане, 0FH. Різниця першого та другого даних після виконання команди SUB BL, BH становить FBH. Встановлюється ознака SF=1, що вказує на одержання негативного результату. Через це буде виконуватися команда JP, чергова за списком, а умовний перехід за командою JNS не виконується.

Кількість одиниць у різниці непарна, тому встановлюється ознака (прапорець) PF=0, і виконується лінійна ділянка програми, що йде за командою УП JP, включаючи команду БП на кінець програми. Сам умовний перехід не виконується. У результаті виконання цього фрагмента у комірці пам’яті зі зміщенням 10Н буде записане число 00H, а у комірці пам’яті зі зміщенням 11Н – число F0H.

Якщо вхідні дані становили відповідно 0FH та 0AH, то їхня різниця буде позитивною, 05Н, і після її обчислення здійснюється перехід до команди з ефективною адресою 012F PUSH AX, за якою вхідні дані будуть розміщені у стеку за попередніми адресами.

Якщо вхідні дані дорівнюють відповідно 0АН та 0ЕН, то в їх різниці FCH буде парна кількість одиниць, і за ознакою PF=1 команда JP 0126 реалізує умовний перехід. У результаті виконання послідовної ділянки програми, включаючи команду БП на кінець програми, у комірці пам’яті зі зміщенням 10Н буде завантажене число 0СН, а зі зміщенням 11Н – число 0FH.

У таблицях 9.5...9.7 подані протоколи виконання різних гілок розгалуженої програми залежно від різних значень вхідних даних D1 та D2. Для наочності у стовпчику ІР показано адресу поточно виконуваної команди, а не наступної.

Слід відмітити, що приклад має виключно навчальне значення.

Контрольні запитання:

  1. З якою метою у програмах реалізуються БП?

  2. Чи зберігається адреса повернення до основної програми, якщо реалізується безумовний перехід?

  3. Знайти добуток двох однобайтових даних, що зберігаються у регістрі АХ. Якщо одержаний результат від’ємний і вміщує парну кількість одиниць, то до нього треба додати одиницю і запам’ятати у стеку. Якщо кількість одиниць непарна, то добуток треба подати у прямому коді і записати у сегменті даних за зміщенням 0012. Якщо добуток додатний, його треба запам’ятати у сегменті даних за адресою 7000:0014Н. Значення вхідних даних задати самостійно.

  4. Знайти частку від ділення двох однобайтових даних. Ділене знаходиться у регістрі АН, а дільник у регістрі AL. Якщо одержаний результат від’ємний і вміщує парну кількість одиниць, то до нього треба додати одиницю і запам’ятати у стеку. Якщо кількість одиниць непарна, то частку треба подати у прямому коді за зміщенням 0012. Якщо частка додатна, її треба запам’ятати у сегменті даних за адресою 7000:0016Н. Значення вхідних даних задати самостійно.