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


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

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



Є багато команд умовних переходів Jcc, які дозволяють перевірити будь-яке відношення між знаковими (більше-менше) і без знаковими (вище-нижче) числами, а також стани всіх арифметичних прапорців, крім af. Усі команди умовного переходу передають керування тільки в межах поточного сегмента коду, якщо задана в команді умова задовольняється. Перехід відбувається додаванням 8-, 16- або 32-бітового зміщення, яке трактується як знакове число, (у 8086/80286 мікропроцесорах тільки 8-бітового). Багато з команд мають по дві мнемоніки, які підкреслюють смисл умови, яка перевіряється.

Для перевірки вмісту регістра cx/ecx як лічильника циклу, зручно використовувати команди jcxz і jecxz. Тут зміщення тільки 8 бітів. Розміщуючи jcxz або jecxz перед циклом, можна обійти цикл при нульовому значенні лічильника cx або ecx.

Мнемоніка Перейти, якщо Умова переходу
ja/jnbe вище/не нижче або дорівнює cf=0 і zf=0
jae/jnb вище або дорівнює/не нижче cf=0
jb/jnae нижче/не вище або дорівнює cf=1
jbe/jna нижче або дорівнює/не вище cf=1 або zf=1
jc є перенесення cf=1
je/jz дорівнює/нуль zf=1
jg/jnle більше/не менше або дорівнює zf=0 і sf=of
jge/jnl більше або дорівнює/не менше sf=of
jl/jnge менше/не більше або дорівнює sf<>of
jle/jng менше або дорівнює/не більше zf=1 або sf<>of
jnc немає перенесення cf=0
jne/jnz не дорівнює/не нуль zf=0
jno немає переповнення of=0
jnp/jpo немає паритету/паритет непарний pf=0
jns немає знака (додатний) sf=0
jo є переповнення of=1
jp/jpe є паритет/паритет парний pf=1
js є знак (від’ємний) sf=1

Таблиця 1. Команди умовного переходу

Команди керування циклами. У командах циклу використовується як лічильник регістр cx/ecx. Коли виконується команда loop, то відбувається декремент лічильника (без впливу на прапорці). Якщо (cx/ecx) не дорівнює нулеві, то 8-бітове зміщення з команди додається до (ip/eip) і перехід на початок циклу. Інакше, тобто коли (cx/ecx)=0, цикл завершено і виконується наступна команда. Лічильник циклу вважається цілим числом без знаку.

Мнемоніки loope і loopz визначають одну і ту ж машинну команду, яка декрементує cx/ecx, а потім передає керування на початок циклу, якщо (cx/ecx) не дорівнює нулеві і zf=1. Інакше виконується наступна команда.

Мнемоніки loopne і loopnz також визначають одну і ту ж машинну команду. Додатковою умовою переходу до початку циклу є нульовий стан прапорця zf.
25. Команди виклику і повернення з підпрограм

Команда call застосовується для виклику підпрограми з автоматичним збереженням адреси повернення в стекові (адреси команди, яка знаходиться після команди call). Загальний вигляд команди call [модифікатор] мітка, де мітка позначає ту команду, з якої починається виконання підпрограми. Командою ret підпрограма передає керування за збереженою адресою повернення.

Виклик може бути в межах поточного сегмента або між сегментним. У першому випадку підпрограма має тип near і адреса повернення тільки вміст регістра ip/eip. У другому випадку підпрограма в іншому сегменті коду і має тип far, а тому адреса повернення складається з двох частин: вміст регістра cs та вміст регістра ip/eip. Зауважимо, що всі виклики підпрограм і повернення з підпрограм повинні бути або в межах одного сегмента, або між сегментними. Для обох типів команд виклику і повернення застосовуються однакові мнемоніки call і ret, а тип підпрограми near або far задається на етапі створення підпрограми за допомогою директиви proc.

Команда call має такі ж форми (відносна, пряма і непряма) як і команда jmp; відсутня тільки коротка (short) форма. Щодо алгоритму виконання, то команда call, викликаючи процедуру, додатково в поточний сегмент стека запам’ятовує адресу повернення.

В командах між сегментного виклику селектор, який завантажується в регістр cs, може адресувати інший сегмент коду, шлюз виклику, шлюз задачі або сегмент TSS стану задачі. Якщо селектор вибирає шлюз або сегмент TSS стану задачі, то зміщення в команді call ігнорується; якщо ж селектор вибирає сегмент коду, керування передається за вказаним зміщенням у цьому сегменті коду.

Команди повернення з підпрограм. Кожна підпрограма повинна мати хоча б одну команду повернення ret, яка повертає керування програмі, що викликала підпрограму. Така передача керування означає вибрати зі стеку адресу повернення, яка розміщена в стек командою call. Отже, команда ret не містить ніякої адресної інформації, неявно адресуючи вершину стека. Для повернення в межах одного сегмента адреса в стекові є зміщенням в цьому сегменті, яке вибирається і записується в регістр ip/eip. Вміст регістра cs не змінюється. У випадку між сегментного переходу адреса повернення є довгим вказівником, довжиною 32 або 48 бітів. Першим вибирається зміщення, яке записується в регістр ip/eip, а потім селектор, який записується в регістр cs.

В R режимі регістри ip і cs завантажуються безпосередньо. В Pрежимі між сегментне повернення заставляє процесор контролювати дескриптор, який адресується селектором. Байт AR прав доступу дескриптора повинен показувати сегмент коду з рівними або меншими привілеями (числове значення дорівнює або більше), ніж поточний рівень привілеїв. Повернення до менш привілейованого рівня викличе перевантаження стеку зі значення, збереженого над блоком параметрів. У передачі керування між рівнями команда ret може очистити сегментні регістри ds, es, fs, gs. Якщо ці регістри адресували сегменти, які неможливо використовувати на новому рівні привілеїв, вони очищаються для заборони несанкціонованого доступу з нового рівня привілеїв.

Команди ret обох типів (near і far) припускають в полі операндів безпосередню сталу imm16, яка в таких командах додається до вмісту регістра sp/esp. Це дозволяє вилучити зі стеку параметри, які передавалися викликаній підпрограмі. Оскільки в більшості сучасних мов програмування передача параметрів здійснюється через стек, команда ret imm16 є зручним та ефективним засобом звільнення стека від параметрів після виконання підпрограми.



Поделиться:


Последнее изменение этой страницы: 2017-01-27; просмотров: 359; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.140.185.170 (0.004 с.)