Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
асм.docx
Скачиваний:
16
Добавлен:
27.10.2018
Размер:
644.06 Кб
Скачать

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; збереження сегментного регістра.

Особливості команди.

  1. Тільки за допомогою команди mov (і стекових команд) можна завантажувати і зберігати сегментні регістри; тільки в команді mov з регістровою адресацією дозволяється вказувати системні регістри керування cri, налагодження dri і перевірки tri.

  2. Неможливо за допомогою mov завантажувати сталу в сегментний регістр; для цього потрібно використовувати як проміжний загальний регістр (найчастіше використовується регістр ax).

  3. Коли в команді вказано один з акумуляторів eax/ax/al, її довжина зменшується на 1.

  4. В P-режимі завантаження будь-якого сегментного регістра супроводжується читання відповідного дескриптора з таблиці GDT в тіньовий регістр. Тому час виконання команди збільшується. Можуть виникнути особливі ситуації, пов’язані з захистом пам’яті, порушення стека і т. п. Завантаження порожнього селектора в ss зразу ж реєструється особливим випадком.

  5. Виконуючи команду 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:

  1. У процесорі 8086 в стек командою push src записується змінений (sp) зменшений на 2, а в процесорах 80286, 80386 та i486 – (sp/esp) до декремента.

  2. Доцільно розширювати 16-бітовий операнд до 32-бітового і записувати його в стек як подвійне слово, інакше може виникнути порушення вирівнювання пам’яті стека на межу подвійного слова.

  3. Якщо не вистачає пам’яті для записування в стек, то процесори 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 при цьому ігнорується.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]