- •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. Спеціальні числові значення та особливі обчислювальні ситуації
11. Команди передач даних
Команди використовуються для пересилання байтів, слів і подвійних слів з оперативної пам’яті в регістр, з регістра в оперативну пам’ять і з регістра в регістр.
Найпотужнішою серед них є команда mov (MOVe – передати, переслати). Її дія еквівалентна дії оператора присвоєння в мовах високого рівня. Має узагальнене зображення
mov dst, src; dst=(src)
Результат виконання: вміст джерела src (source) dst (destination)
mov reg, imm; завантаження довільної сталої в регістр
mov reg/mem, imm; завантаження довільної сталої в регістр або пам’ять
mov reg/mem, reg; передача з регістра в регістр або пам’ять
mov reg, reg/mem; передача з регістра або пам’яті в регістр
mov sreg, reg/mem16; завантаження сегментного регістра
mov reg/mem16, sreg; збереження сегментного регістра.
Особливості команди.
-
Тільки за допомогою команди mov (і стекових команд) можна завантажувати і зберігати сегментні регістри; тільки в команді mov з регістровою адресацією дозволяється вказувати системні регістри керування cri, налагодження dri і перевірки tri.
-
Неможливо за допомогою mov завантажувати сталу в сегментний регістр; для цього потрібно використовувати як проміжний загальний регістр (найчастіше використовується регістр ax).
-
Коли в команді вказано один з акумуляторів eax/ax/al, її довжина зменшується на 1.
-
В P-режимі завантаження будь-якого сегментного регістра супроводжується читання відповідного дескриптора з таблиці GDT в тіньовий регістр. Тому час виконання команди збільшується. Можуть виникнути особливі ситуації, пов’язані з захистом пам’яті, порушення стека і т. п. Завантаження порожнього селектора в ss зразу ж реєструється особливим випадком.
-
Виконуючи команду mov ss, src, процесор забороняє апаратні переривання (навіть немасковані по входу nmi) на час виконання наступної команди. Вважається, що цією командою буде команда mov sp/esp, src (тобто команда завантаження регістра sp або esp для забезпечення правильної роботи стека).
Команда echg також відносить до загальних передач даних і має узагальнений формат
xchg dst, src;
та форми використання:
xchg reg, reg/mem,
xchg reg/mem, reg.
Тут однією командою забезпечено обмін вмісту джерела і вмісту приймача. Команда має вбудований префікс lock, тобто на час її виконання заблоковано використання загальної шини даних.
Команда xchg прискорює такі алгоритми сортування, в яких вимагається обмін двох елементів масиву в пам’яті. Наприклад, наступні три команди
xchg ax, data1; (data1) в ax, (ax) в data1,
xchg ax, data2; (data1) в data2, (data2) в ax,
Xchg ax, data1; (data2) в data1, (ax) – початковий стан
забезпечують обмін двох слів у пам’яті, використовуючи тільки один проміжний загальний регістр, не змінюючи його вмісту.
12. Стекові передачі даних
Стек – структура даних, яка використовується для тимчасового зберігання даних і знаходиться в оперативній пам’яті в області поточного сегмента стека. Поточний сегмент стека визначається вмістом двох регістрів: сегментного регістра ss і загального регістра sp (тип сегмента use16) або esp (тип сегмента use32). Вміст регістра ss визначає розміщення в оперативній пам’яті початку сегмента, а вміст sp або esp (надалі писатимемо sp/esp), визначає адресу розміщення вершини стека відносно його початку (останнього елемента записаного в стек). Усі стекові операції автоматично модифікують вміст sp/esp, тобто вершина стека є рухомою.
Операція запису в стек ініціюється командою push src, алгоритм виконання якої можна описати так:
if StackAddrSize=16 */якщо use16/* Then */то використати /* sp else esp
if OperandSize=16 */якщо use16/* Then
sp/esp=(sp/esp) – 2;
Передати слово (src) у вершину стека ss:[sp/esp];
Else */OperandSize=32/*
sp/esp=(sp/esp) – 4;
Передати подвійне слово (src) у вершину стека ss:[sp/esp].
Тут і надалі між подвійними символами */ та подвійними символами /* ми записуватимемо коментар.
Як джерело, тобто src, можна використовувати: сегментний регістр sreg, загальний регістр reg16/32, комірку оперативної пам’яті mem16/32, безпосередню сталу imm16/32.
Три особливості використання команди push src:
-
У процесорі 8086 в стек командою push src записується змінений (sp) зменшений на 2, а в процесорах 80286, 80386 та i486 – (sp/esp) до декремента.
-
Доцільно розширювати 16-бітовий операнд до 32-бітового і записувати його в стек як подвійне слово, інакше може виникнути порушення вирівнювання пам’яті стека на межу подвійного слова.
-
Якщо не вистачає пам’яті для записування в стек, то процесори 80386 та i486 автоматично переходять у стан вимикання (shutdown).
Команда pusha – запису в стек восьми 16-бітових загальних регістрів у порядку: ax, cx, dx, bx, sp, bp, si, di. Для регістра sp в стек записується те значення, яке було до виконання команди pusha. Команда pushad – запису в стек восьми 32-бітових загальних регістрів у порядку: eax, ecx, edx, ebx, esp, ebp, esi, edi. Для регістра esp в стек записується те значення, яке було до виконання команди pushad. Зрозуміло, що одна команда pusha/pushad замінює вісім команд push.
Операція вибору (виштовхування) зі стека ініціюється командою
pop dst, алгоритм виконання якої можна описати так:
if StackAddrSize=16 */якщо use16/* Then */то використати /* sp else esp
if OperandSize=16 */якщо use16/* Then */то використати /* sp else esp
Передати слово з вершини стека ss:[sp/esp] в dst;
sp/esp=(sp/esp) + 2;
Else */OperandSize=32/*
Передати подвійне слово з вершини стека ss:[sp/esp] в dst;
sp/esp=(sp/esp) + 4.
Як dst можна використовувати: сегментний регістр sreg, загальний регістр reg16/32, комірку оперативної пам’яті mem16/32.
На час виконання наступної команди після команди pop ss процесор забороняє апаратні переривання з розрахунком на те, що вона завантажуватиме регістр sp/esp для правильної адресації стека.
Команда вибору зі стека pop sreg ініціює читання у відповідний тіньовий регістр дескриптора з таблиці GDT, який відповідає значенню селектора – вмісту сегментного регістра в sreg. Тому збільшується час виконання команди, можуть виникнути особливі випадки, а також вибір слів зі стека може порушити вирівнювання пам’яті на межу подвійного слова.
Команда popa/popad є двоїстою до команди pusha/pushad відповідно і виштовхує зі стека значення восьми загальних регістрів у зворотному порядку, в якому записувала їхній вміст pusha/pushad. Значення регістра sp/esp при цьому ігнорується.