Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Опорний конспект лекцій_ Асемблер.Docx
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
506.89 Кб
Скачать
      1. Команди умовного переходу і прапори

Мнемонічне позначення деяких команд умовного переходу відображає назву прапора, з яким вони працюють. Перед позначенням прапора може стояти символ “n”. Якщо символа “n” нема, то перевіряється стан прапора і, якщо він дорівнює 1, робиться перехід на мітку. Якщо символ “n” присутній, то перехід на мітку здійснюється при стані прапора 0. Мнемокоди команд і прапори наведено в табл. 6.2.

Табл. 6.2

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

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

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

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

Значення прапора для переходу

прапор переносу 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=1

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

2

jnp

pf=1

прапор нуля zf

6

jnz

zf=1

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

7

jns

sf=1

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

11

jno

of=1

      1. Команди умовного переходу і регістр ecxlcx

Регістр ecx/cx – виконує роль лічильника в командах керування циклами і при роботі з ланцюжками символів. З цим регістром зв’язана команда умовного переходу:

jcxz мітка_перехода (jump if cx is zero) – перехід якщо cx ноль.

jecxz мітка_перехода (jump Equal cx is zero) – перехід якщо ecx ноль.

Команда jcxz/jecxz може адресувати тільки короткі переходи на –128 або +127 байт від наступної за нею команди.

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

Для полегшення програмування циклів є три команди:

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

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

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

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

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

loope/loopz мітка_перехода (Loop till cx <> 0 або zf=0) – повторити цикл, поки cx<>0 або

zf=0. Робота команди полягає у наступному: o декремент регістра ecx/cx; o порівняння регістра ecx/cx з нулем; o аналіз стану прапора нуля zf;

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

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

loopne/loopnz мітка_перехода (Loop till cx <> 0 або zf=1) – повторити цикл, поки cx<>0

або zf=1. Робота команди полягає у наступному:

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

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

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

Команди loope/loopz і loopne/loopnz дозволяють достроково вийти із циклу на основі аналізу прапора zf.

Недолік команд організації циклів loop, loope/loopz, loopne/loopnz в тому, що вони реалізовують тільки короткі переходи від –128 до +127. Для роботи із довгими циклами необхідно використовувати команди умовного переходу і команду jmp.