Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Lekz._12.doc
Скачиваний:
3
Добавлен:
11.08.2019
Размер:
146.43 Кб
Скачать

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

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

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

Таблиця 12.3 - Команди умовного переходу і прапори

Назва прапора

Номер біта в eflags/flag

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

Значення прапора для здійснення переходу

Прапор переносу cf

1

jc

cf = 1

Прапор парності pf

2

jp

pf = 1

Прапор нуля zf

6

jz

zf = 1

Прапор знака sf

7

js

sf = 1

Прапор переповнення of

11

jo

of = 1

Прапор переносу cf

1

jnc

cf = 0

Прапор парності pf

2

jnp

pf = 0

Прапор нуля zf

6

jnz

zf = 0

Прапор знака sf

7

jns

sf = 0

Прапор переповнення of

11

jno

of = 0

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

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

Архітектура мікропроцесора передбачає специфічне використання багатьох регістрів.

Наприклад, регістр eax/ax/al використовується як акумулятор, а регістри bp, sp - для роботи зі стеком.

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

Синтаксис цієї команди умовного переходу такий: jcxz мітка_переходу (Jump if cx is Zero) - перехід, якщо cx нуль; jecxz метка_перехода (Jump Equal ecx Zero) - перехід, якщо ecx нуль.

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

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

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

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

Дамо коротку характеристику цим командам:

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

• декремент регістра ecx/cx;

• порівняння регістра ecx/cx з нулем:

• якщо (ecx/cx) > 0, то управління передається на мітку переходу;

• якщо (ecx/cx) = 0, то управління передається на наступну після loop команду.

loope/loopz мітка_переходу (Loop till cx <> 0 or Zero Flag = 0) - повторити цикл, поки cx <> 0 або zf = 0. Команди loope і loopz - абсолютні синоніми, тому використовуйте ту команду, яка вам більше подобається. Робота команд полягає у виконанні наступних дій:

• декремент регістра ecx / cx;

• порівняння регістра ecx / cx з нулем;

• аналізу стану прапора нуля zf:

• якщо (ecx / cx)> 0 і zf = 1, управління передається на мітку переходу;

• якщо (ecx / cx) = 0 або zf = 0, управління передається на наступну після loop команду.

loopne/loopnz мітка_переходу (Loop till cx <> 0 or Not Zero flag = 0) - повторити цикл поки cx <> 0 або zf = 1. Команди loopne і loopnz також абсолютні синоніми. Робота команд полягає у виконанні наступних дій:

• декремент регістра ecx/cx;

• порівняння регістра ecx/cx з нулем;

• аналізу стану прапора нуля zf:

• якщо (ecx/cx)> 0 і zf = 0, управління передається на мітку переходу;

• якщо (ecx/cx) = 0 або zf = 1, управління передається на наступну після loop команду.

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

6

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]