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

Керування циклом за ecx/cx із врахуванням ознаки zf

Синтаксис LOOPE/LOOPZ мітка 

LOOPNE/LOOPNZ мітка 

Алгоритм роботи:

  • виконати декремент умісту регістра ECX/CX;

  • проаналізувати регістр ECX/CX:

    • якщо ECX/CX =0, передати керування наступної за LOOPXX команді;

    • якщо ECX/CX =1, передати керування команді, мітка який зазначена в якості операнда LOOPXX;

  • аналіз прапора ZF:

    • якщо ZF=0, для команд LOOPE/LOOPZ це означає вихід з циклу, для команд LOOPNE/LOOPNZ — перехід до початку циклу;

    • якщо ZF=1, для команд LOOPE/LOOPZ це означає перехід до початку циклу, для команд LOOPNE/LOOPNZ — вихід з циклу.

Виконання команди не впливає на ознаки.

Команду LOOP застосовують для організації циклу з лічильником. Кількість повторень циклу задається значенням у регістрі ECX/CX перед входом у послідовність команд, що складають тіло циклу. Пам'ятайте про два важливі моменти:

  • для запобігання виконання циклу при нульовому ECX/CX використовуйте команду JECXZ/JCXZ. Якщо цього не зробити, то при початковому нульовому значенні вмістимого регістру ECX/CX цикл повториться 4 294 967 295/65 536 разів;

  • зсув мітки, що є операндом LOOP, не повинне виходити з діапазону -128...+127 байт.

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

Призначення: перехід всередині поточного сегменту в залежності в умов.

Схема команди : Jcc мітка

JCXZ мітка

JECXZ мітка

Алгоритм роботи команд (крім JCXZ/JECXZ):

Перевірка стану ознак у залежності від коду операції (код операції відображає умову, яка перевіряється):

  • якщо умова істина, то перейти до осередку, позначеної операндом;

  • якщо умова хибна, то передати керування наступній команді.

Команди умовного переходу зручно застосовувати для перевірки умов, що виникають у процесі виконання програми. Багато команд мови асемблера за результатами своєї роботи формують ознаки, які записуються в регістрі ознак EFLAGS/FLAGS. Команди умовних переходів аналізують ці ознаки та здійснюють переходи в залежності від проведеного аналізу. Нижче приведені перелік команд умовного переходу та ознаки які ними аналізуються та відповідні їм логічні умови переходу.

Команда

Стан ознак, які перевіряються

Умова переходу

JA

CF = 0 і ZF = 0

якщо вище

JAE

CF = 0

якщо вище або дорівнює

JB

CF = 1

якщо нижче

JBE

CF = 1 або ZF = 1

якщо нижче або дорівнює

JC

CF = 1

якщо перенос

JE

ZF = 1

якщо дорівнює

JZ

ZF = 1

якщо 0

JG

ZF = 0 і SF = OF

якщо більше

JGE

SF = OF

якщо більше або дорівнює

JL

SF <> OF

якщо менше

JLE

ZF=1 або SF <> OF

якщо менше або дорівнює

JNA

CF = 1 і ZF = 1

якщо не вище

JNAE

CF = 1

якщо не вище або дорівнює

JNB

CF = 0

якщо не нижче

JNBE

CF=0 і ZF=0

якщо не нижче або дорівнює

JNC

CF = 0

якщо немає переносу

JNE

ZF = 0

якщо не дорівнює

JNG

ZF = 1 або SF <> OF

якщо не більше

JNGE

SF <> OF

якщо не більше або дорівнює

JNL

SF = OF

якщо не менше

JNLE

ZF=0 і SF=OF

якщо не менше або дорівнює

JNO

OF=0

якщо немає переповнення

JNP

PF = 0

якщо кількість одиничних , бітів результату непарний (непарний паритет)

JNS

SF = 0

якщо знак плюс (знаковий (старший) біт результату дорівнює 0)

JNZ

ZF = 0

якщо немає нуля

JO

OF = 1

якщо переповнення

JP/JPE

PF = 1

якщо кількість одиничних бітів результату парний (парний паритет)

JPO

PF = 0

Те ж, що і JNP

JS

SF = 1

якщо знак мінус (знаковий (старший) біт результату дорівнює 1)

JZ

ZF = 1

якщо нуль

Логічні умови "більше" і "менше" використовуються при порівняні цілочислових значень зі знаком, а "вище і "нижче" — при порівняні цілочислових значень без знака. Якщо уважно подивитися в таблицю, то в багатьох команд мови асемблера однакові значення ознак для переходу. Це пояснюється наявністю декількох ситуацій, що можуть викликати однаковий стан ознак. У цьому випадку з метою зручності асемблер допускає кілька різних мнемонічних позначень однієї і тієї ж машинної команди умовного переходу. Ці команди асемблера за дію абсолютно рівнозначні, тому що одна машинна команда. У мікропроцесорі і8086 команди умовного переходу могли здійснювати тільки короткі переходи(SHORT) в межах -128...+127 байт, починаючи від наступної команди. З мікропроцесора i386, ці команди можуть виконувати переходи в межах поточного сегмента команд. Для реалізації міжсегментних переходів необхідно комбінувати команди умовного переходу і команду безумовного переходу JMP. При цьому можна скористатися тим, що практично всі команди умовного переходу парні, тобто мають команди, що перевіряють зворотні умови.

Алгоритм роботи команди JCXZ/JECXZ:

Перевірка умови рівності нулю вмісту регістра ECX/CX:

  • якщо умова істинна, тобто вміст ECX/CX дорівнює 0, то перейти до осередку, позначеної операндом мітка;

  • якщо умова хибна, тобто вміст ECX/CX не дорівнює 0, то передати керування наступної за JCXZ/JECXZ команді програми.

Застосування JCXZ/JECXZ:

Команда

Стан ознак у EFLAGS/FLAGS

Умова переходу

JCXZ

Не впливає

якщо регістр CX=0

JECXZ

Не впливає

якщо регістр ECX=0

Команду JCXZ/JECXZ зручно використовувати з усіма командами, що використовують регістр ECX/CX для своєї роботи. Це команди організації циклу і ланцюжкових команди. Важливо відзначити те, що команда JCXZ/JECXZ, на відміну від інших команд переходу, може виконувати тільки близькі переходи в межах -128...+127 байт, починаючи від наступної команди.

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