- •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. Спеціальні числові значення та особливі обчислювальні ситуації
26. Команди переривань і повернення з переривань
Коротко охарактеризуємо команди переривань мікропроцесора i486+. Є три команди, які відносяться до команд переривань: int n, into та iret. Двобайтова int n спочатку записує в стек вміст регістра прапорців flags/eflags і повну адресу повернення вміст регістрів cs та ip/eip. Крім того, прапорці if (як правило) і tf установлюються рівними нулеві. Після цього непрямий перехід через елемент з номером n дескрипторної таблиці переривань IDT. У залежності від типу цього елемента процесор може ініціювати досить складні дії.
Однобайтовий варіант команди int 3 називається перериванням контрольної точки або контрольної зупинки і часто використовується в програмах налагодження.
Команда переривання при переповненні into еквівалентна команді int 4, якщо прапорець переповнення of=1. Якщо of=0, то команда into не виконує ніяких дій.
Команда повернення з переривань iret вибирає зі стека збережені там адресу повернення і регістр flags/eflags. Нагадаємо, що при виборі зі стеку вмісту регістра flags/eflags біти рівня привілеїв введення/виведення iopl та деякі розглянуті раніше значення прапорців модифікуються тільки в тому випадку, коли поточний рівень привілеїв cpl=0. Ця ж команда iret забезпечує повернення зі вкладеної задачі.
27-29. Ланцюжкові команди
-
Загальні поняття.
Ланцюжок – це набір контекстно пов’язаних елементів, які розміщуються в суміжних комірках пам’яті. Елементом ланцюжка може бути байт, слово або подвійне слово.
В системі команд i486+ є п’ять команд, які використовуються для обробки одного елемента ланцюжка і автоматичного просування на наступний елемент. Таким командам може передувати префікс повторення, який зумовлює повторну дію команди над наступним елементом. Дякуючи префіксові повторення, ланцюжки обробляються значно швидше, ніж при організації програмних циклів. Повторення розраховано на максимальну довжину ланцюжка (до 4 Гіга байтів) і може завершуватися за декількома умовами.
В командах може бути або ланцюжок-джерело src, або ланцюжок-приймач dst, або обидва разом. Вважається, що src знаходиться в поточному сегменті даних, адресованому регістром ds, але допускається префікс заміни сегмента. Ланцюжок dst може знаходитися тільки в додатковому сегменті даних, який адресується тільки регістром es, префікс заміни сегмента не дозволяється.
Відзначаємо особливість: в асемблерних програмах для наглядності дозволяється вказувати операнди ланцюжкових команд, але транслятор (і процесор) не використовують їх для адресації ланцюжків. Замість цього вважається, що вміст індексного регістра si/esi є зміщенням поточного елемента ланцюжка-джерела src, а вміст індексного регістра di/edi є зміщенням поточного елемента приймача dst. Ці регістри потрібно відповідно ініціювати до початку виконання ланцюжкових команд, використовуючи, наприклад, команди lea, lds, les.
Операнди ланцюжкових команд можуть бути використані транслятором для того, щоб визначити довжину елемента ланцюжка, якщо це не визначено мнемонікою відповідної ланцюжкової команди.
Під час виконання ланцюжкової команди вміст регістрів si/esi та di/edi автоматично модифікуються так, щоб адресувати наступні елементи ланцюжків. Прапорець напрямку обробки ланцюжка df визначає автоінкремент (df=0) або автодекремент (df=1) індексних регістрів, а величина інкремента/декремента залежить від розміру елемента і дорівнює 1,2 або 4, коли елементами ланцюжків є відповідно байти, слова або подвійні слова.