![](/user_photo/2706_HbeT2.jpg)
- •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. Спеціальні числові значення та особливі обчислювальні ситуації
13. Передачі адресних об’єктів, команди введення-виведення і передачі прапорців
Ці команди забезпечують передачу в регістри не даних, а їхні адреси. Використання: ініціалізація регістрів-вказівників для адресації структур даних в оперативній пам’яті.
Команда lea (Load Effective Address) – завантаження ефективної адреси (EA). Має наступні форми:
lea reg16, mem16,
lea reg32, mem16,
lea reg16, mem32,
lea reg32, mem32.
Алгоритм виконання: обчислюється EA оперативної пам’яті, яка задається другим операндом і завантажується в загальний регістр, який задається першим операндом. Якщо адреса mem16 завантажується в reg32, то вона розширюється з нулем до 32 бітів, а якщо адреса mem32 завантажується в регістр reg16, то беруться тільки молодші 16 бітів ефективної адреси. Припустимий будь-який режим адресації. Деякі приклади:
lea eax, [eax*2]; множення (eax) на 2,
lea eax, [eax][eax*2]; множення (eax) на 3,
lea eax, [eax*4]; множення (eax) на 4.
Швидке множення – швидше ніж за допомогою команд множення.
Ще один приклад
lea eсx, [eax][esi+5]; цю команду можна реалізувати за допомогою наступних команд
mov ecx, eax
add ecx, esi
add ecx, 5
Команди lsreg. Таких команд є п’ять з кодами операцій: lss, lds, les, lfs і lgs. Це команди завантаження сегментних регістрів ss, ds, es, fs і gs відповідно та одночасного завантаження будь-якого загального регістра. Отже, в пару регістрів sreg:reg завантажується з оперативної пам’яті повний вказівник селектор:зміщення. Зрозуміло, що спочатку такий повний вказівник повинен бути створений в оперативній пам’яті. Цей вказівник може мати довжину 32 біти, якщо використовується 16-бітова адресація (use16), або довжину 48 бітів, якщо використовується 32-бітова адресація (use32).
Кожна з команд має дві форми:
lsreg reg16, mem32
lsreg reg32, mem48
Основне застосування вказаних команд: підготовка сегментного регістра даних і одного з індексних регістрів команди lds та les (для ланцюжкових команд ініціалізація пар регістрів ds:si/esi та es:di/edi). Команда lss використовується для ініціалізації вказівника вершини стека sp/esp одночасно з ініціалізацією сегментного регістра ss.
Зауваження. Як звичайно в P-режимі завантаження селектора в сегментний регістр супроводжується завантаженням дескриптора відповідного сегмента в тіньовий регістр, що збільшує час виконання команди. Можуть виникнути особливі випадки.
Команди введення-виведення in, out. Використовуються для звернення до портів, які зосереджені в адресному просторі введення-виведення. Команди мають наступні форми:
in acc, port; введення з фіксованого порта в акумулятор
in acc, dx; введення зі змінного порта в акумулятор
out port, acc; виведення у фіксований порт
out dx, acc; виведення у змінний порт.
Тут acc – один з регістрів eax/ax/al, port – восьми-бітове число imm8, яке вважається адресою порта і розширюється з нулем до 16-бітового значення. Якщо вказується dx, то його вміст є адресою порта і ця адреса може динамічно (тобто в процесі виконання програми) змінюватися.
Команда in пересилає байт, слово або подвійне слово даних з порта, який визначається другим операндом, відповідно в регістр al або ax, або eax, вказаний першим операндом. Адреса порта може вказуватися другим байтом команди imm8 або вмістом регістра dx. Отже, можливе звернення або до 256 портів, адреси яких фіксовані в програмі (imm8), або до 65536 портів, адреси яких можуть змінюватися за рахунок зміни вмісту регістра dx. Коли нам потрібно працювати з 16-бітовими даними, то кількість портів зменшується вдвічі, а їх адреси повинні бути парними числами: 0, 2, 4, …, 254 для фіксованих портів; 0, 2, 4, …, 65534 для змінюваних портів. Відповідно для 32-бітових даних кількість портів зменшується ще вдвічі, а їх адреси – числа кратні чотирьом: 0, 4, 8, …, 252, …, 65532. Отже, номери портів повинні бути вирівняні на межі, кратні довжинам даних, які передаються, відповідно 1, 2 або 4.
Команда out пересилає байт, слово або подвійне слово даних з регістра (al, ax або eax), вказаного другим операндом, в порт виведення, адресований першим операндом. Адреса порта може вказуватися першим байтом команди imm8 або вмістом регістра dx. Отже, можливе звернення або до 256 портів, адреси яких фіксовані в програмі (imm8), або до 65536 портів, адреси яких можуть змінюватися за рахунок зміни вмісту регістра dx. Інші вимоги до адрес портів такі ж, як і в команді in.
Команди in
і out
– привілейовані, тому в прикладних
програмах введення-виведення здійснюється
в основному через виклики операційної
системи. Однак, якщо процедура має
привілеї введення-виведення (тобто
значення її cpliopl),
то команда in
або out
виконуються негайно. Якщо ж такого
привілею процедура не має, то перевіряється
бітова карта дозволу введення-виведення
для поточної задачі і операція виконується,
якщо біт для відповідного порта містить
0.
Команди передачі прапорців. Команда lahf – завантаження прапорців в регістр ah: копіює молодший байт регістра eflags в регістр ah (тут їх можна змінити, перевірити або зберегти). Біти 1, 3, 5 регістра ah потрібно маскувати, оскільки вони не використовуються.
Команда sahf – зберегти (ah) в молодшому байті регістра eflags. Інші біти прапорців без зміни.
Команди pushf/pushfd і popf/popfd – відповідно записати в стек і вибрати зі стека вміст регістра flags/eflags. Звичайно застосовуються на початку (pushf) і в кінці (popf) процедур. Виконання команд popf/popfd пов’язано з перевіркою захисту за привілеями.