На головну

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

  1. B) До сутнісному визначенню філософії не веде манівці порівняння з мистецтвом і релігією.
  2. JCC метка_перехода
  3. Loopne / loopnz метка_перехода
  4. MS Access. Для порівняння значень з константами можна використовувати оператори
  5. Активи, капітал та зобов'язання умовного підприємства.
  6. Аналіз і коректування елементів порівняння
  7. В Excel для переходу в будь-яку іншу клітинку електронної таблиці необхідно натиснути комбінацію клавіш

Якщо перехід здійснюється тільки при виконанні деякої умови і не здійснюється в іншому випадку, то такий перехід називається умовним. Умовний перехід зазвичай реалізується в два етапи: спочатку порівнюються деякі величини, в результаті чого відповідним чином формуються прапори (ZF, SF і т. Д.), А потім виконується власне умовний перехід в залежності від значень прапорів. Тому ми зараз розглянемо і команду порівняння, і команди умовного переходу.

Порівняння (compare): CMP op1, op2

Ця команда еквівалентна команді SUB op1, op2 за одним винятком: обчислена різниця op1-op2 нікуди не записується. Тому єдиний і головний ефект від команди порівняння - це установка прапорів, що характеризують отриману різницю, або, що те ж саме, що характеризують порівнювані величини ОР1 і ор2. Як формуються прапори при відніманні, ми вже розглядали (див. Лаб. 5), тому повторюватися не будемо.

Що ж стосується команд умовного переходу, то їх в ПК досить багато, але в Асемблері вони все записуються одноманітно:

Jxx <мітка>

де операнд вказує мітку тієї команди програми, на яку треба зробити перехід в разі виконання деякого умови, а мнемокод починається буквою J (від jump), за якою слідує одна або кілька букв, в скороченому вигляді описують цю умову.

Всі команди умовного переходу можна розділити на три групи.

До першої групи входять команди, які ставляться після команди порівняння. В їх мнемокодах за допомогою певних букв описується той результат порівняння, при якому треба робити перехід. Це такі літери:

Е - equal (так само)

N - not (ні, заперечення)

G - greater (більше) - для чисел зі знаком

L - less (менше) - для чисел зі знаком

А - above (вище, більше) - для чисел без знака

В - below (нижче, менше) - для чисел без знака

Як видно, для умов "менше" і "більше" введені дві системи позначень. Це пов'язано з тим, що після порівняння чисел зі знаком і порівняння чисел без знака треба реагувати на різні значення прапорів.

Відзначимо, що одна і та ж команда умовного переходу може мати кілька назв-синонімів. Це пояснюється тим, що один і той же умова переходу може бути сформульовано по-різному. Наприклад, умова "менше" - це в той же час і умова "не вірно, що більше або дорівнює", тому перехід по менше для знакових чисел позначається і як JL, і як JNGE. Яке з цих назв-синонімів використовувати - це особиста справа автора програми.

мнемокод Змістовне умова для переходу після СМР ОР1, ор2 Стан прапорів для переходу
 для будь-яких чисел
 JE  op1 = op2  ZF = 1
 JNE  op1 <> op2  ZF = 0
 для чисел зі знаком
 JL / JNGE  op1  SF <> OF
 JLE / JNG  op1 <= op2  SF <> OF або ZF = 1
 JG / JNLE  op1> op2  SF = OF і ZF = 0
 JGE / JNL  op1 <= op2  SF = OF
 для чисел зі знаком
 JB / JNAE  op1  CF = 1
 JBE / JNA  op1 <= op2  CF = 1 або ZF = 1
 JA / JNBE  op1> op2  CF = 0 і ZF = 0
 JAE / JNB  op1 <= op2  CF = 0

(Пояснимо, наприклад, чому в команді умовного переходу "по менше" для знакових чисел (JL) перевіряється співвідношення OF <> SF. Якщо в команді СМР op1, op2 порівнювані числа трактуються як знакові, тоді можливі дві комбінації прапорів, відповідні умові op1 SF. Саме ця умова і зазначено в таблиці для команди JL.)

Приклад. Нехай X, Y і Z - змінні розміром в слово. Потрібно записати в Z максимальне з чисел X і Y.

Вирішення цього завдання по-різному для чисел зі знаком (див. Зліва) і для чисел без знака (див. Праворуч), т. К. Доводиться використовувати різні команди умовного переходу:

; Числа зі знаком; числа без знака

MOV АХ, Х MOV АХ, Х

СМР AX, Y; х = у? СМР AX, Y

JGE М; х> = у а M JAE M

MOV AX, Y MOV AX, Y

M: MOV Z, AX M: MOV Z, AX

До другої групи команд умовного переходу входять ті, які ставляться після команд, відмінних від команди порівняння, і які реагують на ту чи іншу значення якого-небудь певного прапора. У мнемокодах цих команд вказується перша буква перевіряється прапора, якщо перехід повинен бути виконаний при значенні 1 у прапора, або ця буква вказується з буквою N (not), якщо перехід треба зробити при нульовому значенні прапора:

мнемокод Умова переходу мнемокод Умова переходу
 JZ  ZF = 1  JNZ  ZF = 0
 JS  SF = 1  JNS  SF = 0
 JC  CF = 1  JNC  CF = 0
 JO  OF = 1  JNO  OF = 0
 JP  PF = 1  JNP  PF = 0

(Зауваження. Легко помітити, що такі пари Мнемокод еквіваленти: JE і JZ, JNE і JNZ, JB і JC, JNB і JNC.)

Приклад. Нехай А, В і С - беззнакові байтові змінні. Потрібно обчислити С = А * А + В, але якщо відповідь перевершує розмір байта, тоді треба передати управління на мітку ERROR.

Можливе рішення цього завдання:

MOV AL, A

MUL AL

JC ERROR; A * A> 255 (CF = 1) а ERROR

ADD AL, B

JC ERROR; перенесення (CF = 1) а ERROR

MOV C, AL

І, нарешті, до третьої групи входить тільки одна команда умовного переходу, перевіряти не прапори, а значення регістра СХ:

JCXZ <мітка>

Дія команди JCXZ (jump if CX is zero) можна описати так:

if CX = 0 then goto <мітка>

Приклади на використання цієї команди будуть приведені пізніше.

Відзначимо загальну особливість команд умовного переходу: всі вони здійснюють тільки короткий перехід, т. Е. З їх допомогою можна передати упраштеніе не далі ніж на 127-128 байтів вперед або назад. Це приблизно 30-40 команд (в середньому одна команда ПК займає 3-4 байта). Справа в тому, що в ПК все машинні команди умовного переходу мають вигляд КОП i8 і реалізують короткий відносний перехід: IP: = IP + i8, а команд з операндом в слово (i16) немає. Це пояснюється тим, що в більшості випадків якраз і потрібні такі короткі переходи, а з іншого боку, для команд довгих умовних переходів в ПК просто не вистачило кодів операцій.

Природно, виникає питання: а як в цих умовах здійснювати довгі умовні переходи, на відстань понад 127 байтів від команди переходу? Тут треба залучати команду довгого безумовного переходу. Наприклад, при "далекої" мітці М оператор

if AX = BX then goto M

слід реалізовувати так:

if AX <> BX then goto L; {Короткий перехід}

goto M; {Довгий перехід}

L: ...

На ЯА це записується в такий спосіб:

CMP AX, BX

JNE L

JMP M

L: ...

Виходить дуже коряво, але іншого варіанту немає.

Відзначимо, що використовувати в командах умовного переходу оператор SHORT не треба, т. К. Всі ці переходи і так короткі.



непрямий перехід | Команди управління циклом

Особливості складання чисел в зворотному і додатковому кодах. | Числа з фіксованою точкою. | Числа з плаваючою точкою. | Арифметичні операції над числами з фіксованою точкою | Арифметичні операції над двійковими числами з плаваючою точкою | Множення двійкових чисел | Склад обладнання | Визначення обсягу оперативної пам'яті | Команди додавання і віднімання | команди множення |

© um.co.ua - учбові матеріали та реферати