Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Книга_Вычисл техн и микропроц_2 автора_130709.doc
Скачиваний:
9
Добавлен:
07.05.2019
Размер:
5.26 Mб
Скачать

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

Вхідний контроль:

  1. За якими умовами (прапорцями) можна реалізувати умовні переходи?

  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 0039H ; Обхід команди 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,0F0AH ; Завантаження даних до АХ

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. Для наочності у стовпчику ІР показано адресу поточно виконуваної команди, а не наступної.

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

Таблиця 9.5 – Протокол виконання програми D1 = 0AH, D2 = 0FH

№ пп.

Мнемоніка команд

IP

AX

BX

SP

DS

SS

CS

PF

SF

ZF

CF

1

MOV AX,0F0A

0109

0F0A

0000

FFEE

7000

7000

7000

1

0

0

0

2

PUSH AX

010С

0F0A

0000

FFEC

7000

7000

7000

1

0

0

0

3

POP AX

010D

0F0A

0000

FFEE

7000

7000

7000

1

0

0

0

4

MOV BX,AX

010E

0F0A

0F0A

FFEE

7000

7000

7000

1

0

0

0

5

SUB BL,BH

0110

0F0A

0FFB

FFEE

7000

7000

7000

0

1

0

1

6

JNS 0128

0112

0F0A

0FFB

FFEE

7000

7000

7000

0

1

0

1

7

JP 011F

0114

0F0A

0FFB

FFEE

7000

7000

7000

0

1

0

1

8

ADD AL,05

0116

0F0F

0FFB

FFEE

7000

7000

7000

1

0

0

0

9

NOT AH

0118

F00F

0FFB

FFEE

7000

7000

7000

1

0

0

0

10

MOV[10],AX

011A

F00F

0FFB

FFEE

7000

7000

7000

1

0

0

0

11

JMP 0129

0126

F00F

0FFB

FFEE

7000

7000

7000

1

0

0

0

12

NOP

0129

F00F

0FFB

FFEE

7000

7000

7000

1

0

0

0

Таблиця 9.6 – Протокол виконання програми D1 = 0FH, D2 = 0АН

пп.

Мнемоніка

команд

IP

AX

BX

SP

DS

SS

CS

PF

SF

ZF

CF

1

MOV AX,0А0F

0109

0A0F

0000

FFEE

7000

7000

7000

0

0

0

0

2

PUSH AX

010C

0A0F

0000

FFEC

7000

7000

7000

0

0

0

0

3

POP AX

010D

0A0F

0000

FFEE

7000

7000

7000

0

0

0

0

4

MOV BX,AX

010E

0A0F

0A0F

FFEE

7000

7000

7000

0

0

0

0

5

SUB BL,BH

0110

0A0F

0A05

FFEE

7000

7000

7000

1

0

0

0

6

JNS 0129

0112

0A0F

0A05

FFEE

7000

7000

7000

1

0

0

0

7

PUSH AX

0128

0A0F

0A05

FFEC

7000

7000

7000

1

0

0

0

8

NOP

0129

0A0F

0A05

FFEC

7000

7000

7000

1

0

0

0

Таблиця 9.7 – Протокол виконання програми D1 = 0AH, D2 = 0EH

пп.

Мнемоніка

команд

IP

AX

BX

SP

DS

SS

CS

PF

SF

ZF

CF

1

MOV AX,0E0A

0109

0E0A

0000

FFEE

7000

7000

7000

0

0

0

0

2

PUSH AX

010C

0E0A

0000

FFEC

7000

7000

7000

0

0

0

0

3

POP AX

010D

0E0A

0000

FFEE

7000

7000

7000

0

0

0

0

4

MOV BX,AX

010E

0E0A

0E0A

FFEE

7000

7000

7000

0

0

0

0

5

SUB BL,BH

0110

0E0A

0EFC

FFEE

7000

7000

7000

1

1

0

1

6

JNS 0128

0112

0E0A

0EFC

FFEE

7000

7000

7000

1

1

0

1

7

JP 011F

0114

0E0A

0EFC

FFEE

7000

7000

7000

1

1

0

1

8

ADD AL,02

011F

0E0C

0EFC

FFEE

7000

7000

7000

1

0

0

0

9

INC AH

0121

0F0C

0EFC

FFEE

7000

7000

7000

1

0

0

0

10

MOV[0010],AX

0123

0F0C

0EFC

FFEE

7000

7000

7000

1

0

0

0

11

JMP 0129

0126

0F0C

0EFC

FFEE

7000

7000

7000

1

0

0

0

12

NOP

0129

0F0C

0EFC

FFEE

7000

7000

7000

1

0

0

0

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

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

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

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

Контрольні питання підвищеної складності:

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

    2. Перевірити, чи буде вірний фрагмент програми

7000:0120 CMP AL,BL

7000:0122 JZ 8000:0100