Студопедия — Умовні переходи
Студопедия Главная Случайная страница Обратная связь

Разделы: Автомобили Астрономия Биология География Дом и сад Другие языки Другое Информатика История Культура Литература Логика Математика Медицина Металлургия Механика Образование Охрана труда Педагогика Политика Право Психология Религия Риторика Социология Спорт Строительство Технология Туризм Физика Философия Финансы Химия Черчение Экология Экономика Электроника

Умовні переходи






Описані у попередньому розділі інструкції переходів – це тільки частина того, що вам потребується для написання корисних програм. В дійсності необхідна можливість писати такі програми, які можуть приймати рішення. Саме це можливо зробити за допомогою операцій умовних переходів.

Інструкція умовного переходу може здійснювати (чи ні) перехід на цільову (вказану в ній) мітку, в залежності від стану регістру флагів. Роздивимося наступний приклад:

 

mov ah,1; функція DOS вводу з клавіатури

int 21h; отримати наступну

; натиснуту клавішу

cmp al,’A’; чи була натиснута буква ‘A’?

je AwasTyped; якщо так то обробити її

mov [TampByte],al; ні, зберегти символ

.

.

AwasTyped:

push ax; зберегти символ у стекі

 

Спочатку у даній програмі за допомогою функції операційної системи DOS сприймається натиснута клавіша. Потім для зрівняння введеного символу з символом “А” використовується інструкція CMP. Ця інструкція аналогічна інструкції SUB, тільки її виконання ні на що не впливає, тому що призначення даної інструкції полягає у тому, щоб можна було порівняти два операнди, встановивши флаг також, як це робиться у інструкції SUB. Тому у попередньому прикладі флаг нуля встановлюється у значення 1 тільки у тому випадку, якщо регістр AL містить символ А.

Тепер ми підійшли до основного моменту. Інструкція JE представляє собою інструкцію умовного переходу, яка здійснює передачу керування тільки у тому випадку, якщо флаг нуля дорівнює 1. У протилежному випадку виконується інструкція, безпосередньо слідуюча за інструкцією JE (у даному випадку – інструкція MOV). Флаг нуля у даному прикладі буде встановлено тільки у випадку натиснення “А”, і тільки при цьому випадку процесор 8086 перейде до виконання інструкції з міткою AwasTyped, тобто інструкції PUSH.

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

Перелік інструкцій умовних переходів приводиться у табл. 3.2.

 

Таблиця 3.2 – Інструкції умовних переходів

Назва Значення Флажки, що перевіряються
JNB/JNAE Перейти, якщо менш/ перейти, якщо не більш чи дорівнює CF=1
JAE/JNB Перейти, якщо більш чи дорівнює/ перейти, якщо не менш CF=0
JBE/JNA Перейти, якщо менш чи дорівнює/перейти, якщо не більш CF=1 чи ZF=1
JA/JNBE Перейти, якщо більш/ перейти якщо не менш чи дорівнює CF=0 та ZF=0
JE/JZ Перейти, якщо дорівнює ZF=1
JNE/JNZ Перейти, якщо не дорівнює ZF=0
JL/JNGE Перейти, якщо менш ніж/ перейти, якщо не більш ніж чи дорівнює SF=OF
JGE/JNL Перейти, якщо більш ніж чи дорівнює/ перейти, якщо не більш ніж SF=OF
JLE/JNLE Перейти, якщо менш ніж чи дорівнює/ перейти, якщо не більш ніж ZF=1 чи SF=OF
JG/JNLE Перейти, якщо більш ніж/ перейти, якщо не більш ніж чи дорівнює ZF=0 чи SF=OF
JP/JPPE Перейти по парності PF=1
JNP/JPO Перейти по непарності PF=0
JS Перейти по знаку SF=1
JNS Перейти, якщо знак не встановлений SF=0
JC Перейти при наявності переносу CF=1
JNC Перейти при відсутності переносу CF=0
JO Перейти по переповненню OF=1
JNO Перейти при відсутності переповнення OF=0

 

CF – флаг переносу, SF – флаг знаку, OF – флаг переповнення, ZF – флаг нуля, PF – флаг парності

Цикли

Для чого використовуються цикли? Вони служать для роботи з масивами, перевірки стану портів вводу-виводу до отримання певного стану, очистки блоків пам’яті, читання рядків з клавіатури та виводу їх на екран і т.д. Цикли – це головний засіб, який використовується для виконання дій які повторюються. Тому використовуються вони досить часто, настільки часто, що у наборі інструкцій процесора 8086 передбачено фактично декілька інструкцій циклів: LOOP, LOOPNE, LOOPE та JSXZ.

Давайте роздивимось спочатку інструкцію LOOP. Припустимо, ми хочемо вивести 17 символів текстової строки TestString. Це можна зробити наступним чином:

 

TestString DB ‘Це перевірка…’

 

mov cx,17

mov bx,OFFSET TestString

PrintStringLoop:

mov dl,[bx]; отримати наступний

; символ

inc bx; посилка на наступний

; символ

mov ah,2; функція DOS виводу на екран

int 21h; визвати DOS для виводу

; символу

dec cx; зменшити лічильник довжини

; рядка

jnz PrintStringLoop; обробити наступний символ, якщо він є.

 

Але ж є кращій спосіб. Можливо ви пам’ятаєте, що раніше ми говорили о том, що регістр СХ корисно буває використовувати для організації циклів. Інструкція:

 

loop PrintStringLoop

 

робить теж саме, що й інструкції:

 

dec cx

jnz PrintStringLoop

 

однак виконується вона скоріше та займає на один байт менше.

Кожний раз, коли вам потрібно організувати цикл, доки значення лічильника не буде дорівнювати 0, запишіть початкове значення лічильника у СХ та використовуйте інструкцію LOOP.

Як же будуються цикли з більш складною умовою завершення, ніж зворотній відлік значення лічильника? Для таких випадків передбачені інструкції LOOP та LOOPNE.

Інструкція LOOPE працює також, як інструкція LOOP, тільки цикл при її виконанні буде завершуватися (тобто перестануть виконуватися переходи), якщо регістр СХ прийме значення 0 чи флаг нуля буде встановлений у значення 1 (треба пам’ятати про те, що флаг нуля встановлюється у значення 1, якщо результат останньої арифметичної операції був нульовим або два операнди у останній операції зрівняння не збігались). Аналогічно, інструкція LOOPNE завершує виконання циклу, якщо регістр СХ прийняв значення 0 або флаг нуля скинутий (має нульове значення).

Інструкція LOOPE звісна також, як інструкція LOOPZ, інструкція LOOPNE – як інструкція LOOPNZ, також як інструкції JE еквівалентна інструкція JZ (це інструкції – синоніми).

Є ще одна інструкція циклу. Це інструкція JCXZ. Інструкція JCXZ здійснює перехід тільки в тому випадку, якщо значення регістру СХ дорівнює 0. Це дає зручний спосіб перевіряти регістр СХ перед початком циклу. Наприклад, у наступному фрагменту програми, при зверненні до якого регістр ВХ вказує на байт, які потрібно обнулити, інструкція JCXZ використовується для пропуску тіла циклу у тому разі, якщо регістр СХ має значення 0:

 

jcxz SkipLoop; якщо СХ має значення 0,;то нічого робити не треба

ClearLoop:

 

mov BYTE PTR [si],0; встановити наступний байту

; значення 0

inc si; посилка на наступний байт, що

; очищується

SkipLoop:

 

Чому бажано пропустити виконання циклу, якщо значення регістру СХ дорівнює 0? Тому що у протилежному випадку значення СХ буде зменшено до величини 0FFFFh та інструкція LOOP здійснить перехід на вказану мітку. Після цього цикл буде виконуватися 65535 разів. Ви ж бажали, щоб значення регістру СХ, рівне 0, вказувало, що треба обнулити 0 байт, а не 65536. Інструкція JCXZ дозволяє вам у цьому випадку швидко виконати потрібну перевірку.







Дата добавления: 2015-04-16; просмотров: 464. Нарушение авторских прав; Мы поможем в написании вашей работы!



Обзор компонентов Multisim Компоненты – это основа любой схемы, это все элементы, из которых она состоит. Multisim оперирует с двумя категориями...

Композиция из абстрактных геометрических фигур Данная композиция состоит из линий, штриховки, абстрактных геометрических форм...

Важнейшие способы обработки и анализа рядов динамики Не во всех случаях эмпирические данные рядов динамики позволяют определить тенденцию изменения явления во времени...

ТЕОРЕТИЧЕСКАЯ МЕХАНИКА Статика является частью теоретической механики, изучающей условия, при ко­торых тело находится под действием заданной системы сил...

Тактика действий нарядов полиции по предупреждению и пресечению правонарушений при проведении массовых мероприятий К особенностям проведения массовых мероприятий и факторам, влияющим на охрану общественного порядка и обеспечение общественной безопасности, можно отнести значительное количество субъектов, принимающих участие в их подготовке и проведении...

Тактические действия нарядов полиции по предупреждению и пресечению групповых нарушений общественного порядка и массовых беспорядков В целях предупреждения разрастания групповых нарушений общественного порядка (далееГНОП) в массовые беспорядки подразделения (наряды) полиции осуществляют следующие мероприятия...

Механизм действия гормонов а) Цитозольный механизм действия гормонов. По цитозольному механизму действуют гормоны 1 группы...

ТЕОРИЯ ЗАЩИТНЫХ МЕХАНИЗМОВ ЛИЧНОСТИ В современной психологической литературе встречаются различные термины, касающиеся феноменов защиты...

Этические проблемы проведения экспериментов на человеке и животных В настоящее время четко определены новые подходы и требования к биомедицинским исследованиям...

Классификация потерь населения в очагах поражения в военное время Ядерное, химическое и бактериологическое (биологическое) оружие является оружием массового поражения...

Studopedia.info - Студопедия - 2014-2024 год . (0.008 сек.) русская версия | украинская версия