Передачі адресних об’єктів, команди введення-виведення і передачі прапорців 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Передачі адресних об’єктів, команди введення-виведення і передачі прапорців



Ці команди забезпечують передачу в регістри не даних, а їхні адреси. Використання: ініціалізація регістрів-вказівників для адресації структур даних в оперативній пам’яті.

Команда 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 – привілейовані, тому в прикладних програмах введення-виведення здійснюється в основному через виклики операційної системи. Однак, якщо процедура має привілеї введення-виведення (тобто значення її cpl iopl), то команда in або out виконуються негайно. Якщо ж такого привілею процедура не має, то перевіряється бітова карта дозволу введення-виведення для поточної задачі і операція виконується, якщо біт для відповідного порта містить 0.

Команди передачі прапорців. Команда lahf – завантаження прапорців в регістр ah: копіює молодший байт регістра eflags в регістр ah (тут їх можна змінити, перевірити або зберегти). Біти 1, 3, 5 регістра ah потрібно маскувати, оскільки вони не використовуються.

Команда sahf – зберегти (ah) в молодшому байті регістра eflags. Інші біти прапорців без зміни.

Команди pushf/pushfd і popf/popfd – відповідно записати в стек і вибрати зі стека вміст регістра flags/eflags. Звичайно застосовуються на початку (pushf) і в кінці (popf) процедур. Виконання команд popf/popfd пов’язано з перевіркою захисту за привілеями.



Поделиться:


Последнее изменение этой страницы: 2017-01-27; просмотров: 320; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.191.195.110 (0.005 с.)