- •2. Структура регістра eflags
- •3. Організація оперативної пам’яті. Сегментована модель оперативної пам’яті. Формування адреси в реальному режимі
- •4. Формати і типи даних. Формат машинних команд. Система переривань
- •5. Десяткова арифметика. Форми зображення десяткових чисел
- •7. Ділення ascii-чисел.
- •6. Директиви сегментації. Директиви proc і endp
- •7. Опис простих типів мовою асемблера
- •10. Синтаксис команд мовою асемблера
- •11. Команди передач даних
- •Xchg ax, data1; (data2) в data1, (ax) – початковий стан
- •12. Стекові передачі даних
- •13. Передачі адресних об’єктів, команди введення-виведення і передачі прапорців
- •14. Команди передачі даних movXx. Команда setCc. Команда xlat
- •15. Команди додавання, віднімання і порівняння
- •Inc reg/mem; Розмір 8/16/32.
- •16. Команди множення і ділення
- •20. Команди логічних операцій. Команди зсувів
- •22. Команди операцій з двійковими ланцюжками
- •23. Команди передачі керування (безумовні переходи)
- •24. Команди умовних переходів і команди керування циклами
- •26. Команди переривань і повернення з переривань
- •Загальні поняття.
- •Використання префіксів в ланцюжкових командах.
- •Команда movs.
- •Команда cmps.
- •Команда scas.
- •Команда lods.
- •Команда stos.
- •Команди введення/виведення ланцюжків.
- •29. Команди керування процесором
- •Команди, які впливають на прапорці.
- •Команди синхронізації.
- •Системні команди
- •31. Формати даних, які підтримуються fpu
- •Параметри для трьох форматів в таблиці
- •32. Програмна модель fpu
- •33. Слово стану sw і слово керування cw пристрою fpu.
- •Відповідність між кодом умови і прапорцями
- •34. Команди передач даних fpu: завантаження, збереження, збереження з вибором зі стека, обміну, завантаження сталих.
- •35. Арифметичні команди fpu: додавання, віднімання, множення, ділення.
- •36. Додаткові арифметичні команди fpu.
- •37. Команди порівняння fpu
- •38. Команди трансцендентних функцій. Алгоритми обчислення значень функцій і та логарифмів за будь-якою основою.
- •39. Команди керування пристроєм fpu
- •40. Спеціальні числові значення та особливі обчислювальні ситуації
24. Команди умовних переходів і команди керування циклами
Є багато команд умовних переходів 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 є зручним та ефективним засобом звільнення стека від параметрів після виконання підпрограми.