Чтение онлайн

на главную - закладки

Жанры

Ассемблер для процессоров Intel Pentium

Магда Юрий

Шрифт:

mov ES:[ЕВХ]. ЕАХ

Обратите внимание на то, что после имени сегмента указывается символ двоеточия.

На уровне процессора замена сегмента задается специальным префиксом замены, который является однобайтовым числом, располагающимся перед кодом команды. В некоторых случаях замена сегмента не допускается:

– для сегмента программного кода – все команды используют исключительно сегментный регистр CS;

– при выполнении строковых операций строка-приемник адресуется только регистром ES;

– операции помещения в стек и извлечения из стека всегда используют регистр SS.

Некоторые инструкции процессора требуют явной инициализации сегментных регистров. В таких случаях селектор сегмента может быть извлечен из 16-разрядного регистра или переменной в памяти, как, например, в следующей команде:

mov DS. BX

Здесь селектор сегмента, находящийся в регистре ВХ, помещается в сегментный регистр DS. В некоторых случаях селектор сегмента может определяться через 48-разрядный указатель, находящийся в памяти. При этом младшее двойное слово содержит 32-разрядное смещение, а старшее слово – 16-разрядный селектор сегмента.

В большинстве случаев программисты имеют дело с эффективным адресом операнда, то есть с той частью полного адреса операнда, которая определяет смещение операнда в указанном сегменте. Очень часто термины «эффективный адрес» и «смещение» воспринимаются как синонимы при анализе способов адресации операндов, хотя это не совсем так. Для того чтобы избежать путаницы в дальнейшем, мы будем употреблять более корректный термин «эффективный адрес» вместо термина «смещение», а под смещением понимать числовое значение, которое прибавляется к определенному адресу.

Эффективный адрес операнда, находящегося в памяти, может быть задан несколькими способами. В общем случае мы можем определить эффективный адрес операнда как состоящий из нескольких частей:

– смещения, представляющего собой 8-, 16– и 32-разрядное значение;

– базы, представляющей собой содержимое одного из регистров общего назначения;

– индекса, представляющего собой содержимое одного из регистров общего назначения;

– масштабного множителя, равного 2, 4 или 8.

Эффективный адрес, в общем случае, представляет собой сумму смещения, базы и индекса, причем эта сумма может быть скорректирована с помощью масштабного множителя. Схематически это можно представить так, как показано на рис. 3.11.



Рис. 3.11. Схема вычисления эффективного адреса (ЕА)


Существуют определенные ограничения, касающиеся применения регистров общего назначения в качестве базовых или индексных при формировании эффективного адреса:

– регистр ESP нельзя использовать в качестве индексного регистра;

– если в качестве базового используется регистр ESP или ЕВР, то сегментным регистром будет SS. Во всех остальных случаях сегментным регистром по умолчанию является DS.

Следует заметить, что база, индекс и смещение могут применяться в любых комбинациях, причем любой компонент может отсутствовать. Масштабирующий множитель применяется только с индексом. Рассмотрим различные комбинации компонентов для получения эффективного адреса.

Вариант 1. Для формирования эффективного адреса используется только смещение. Такую адресацию называют прямой. При этом способе адресации эффективный адрес берется прямо из поля смещения команды и никакие регистры для его вычисления не привлекаются. Этот режим служит для обращения к простым переменным, как показано в примере

mov AX. menu

Здесь meml – операнд в памяти. Как операнд-источник, так и операнд-приемник должны иметь одинаковый размер, иначе в процессе компиляции будет выдана ошибка. Так, в нашем примере подразумевается, что переменная meml определена как слово. Если, например, операнд в памяти является двойным словом, то в команде нужно явным образом указать старшую или младшую часть с помощью оператора PTR:

mov AX. word ptr meml

Предположим, что переменная meml определена как двойное слово. Тогда показанная ранее команда поместит в регистр АХ значение lD7Fh (рис. 3.12).



Рис. 3.12. Размещение переменной meml в памяти


Если нужно сохранить в регистре АХ значение старшего слова переменной meml, то следует применить команду

mov AX, word ptr meml+2

В этом случае в регистр АХ помещаются старшие два байта переменной meml (см. рис. 3.12), после чего АХ будет содержать значение 0EC34h (обратите внимание на порядок расположения байтов!).

Остановимся более подробно на операторе PTR. В общем случае этот оператор можно представить в виде

тип PTR выражение

При помощи оператора PTR переменная или метка, задаваемая выражением, может трактоваться как переменная или метка указанного типа. Тип может быть задан одним из имен или значений, показанных в табл. 3.3.


Таблица 3.3. Атрибуты оператора PTR



Выражение может включать в себя любые операнды. Типы BYTE, WORD, DWORD, QWORD и TWORD могут быть использованы только с операндами памяти, а типы NEAR и FAR – только с метками. Если PTR не используется, то ассемблер подразумевает умалчиваемый тип ссылки. Кроме того, оператор PTR служит для организации доступа к объекту, который при другом способе привел бы к ошибке компиляции (например, для доступа к старшему байту переменной размера WORD).

Вариант 2. Для формирования эффективного адреса используется только содержимое базового регистра («база»). Такая адресация называется базовой и служит для адресации динамических структур данных, например строк и массивов. Этот способ адресации иногда называют «косвенной адресацией».

Рассмотрим пример программного кода

lea BX. meml

mov AX. [BX]

В этом примере meml – переменная в памяти размером в слово. Первая команда загружает адрес переменной в регистр BX, a вторая помещает в регистр АХ значение, содержащееся по адресу, который находится в ВХ. Работу этого фрагмента кода иллюстрирует рис. 3.13.

Поделиться:
Популярные книги

Гримуар темного лорда IV

Грехов Тимофей
4. Гримуар темного лорда
Фантастика:
фэнтези
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Гримуар темного лорда IV

Мой муж – чудовище! Изгнанная жена дракона

Терин Рем
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Мой муж – чудовище! Изгнанная жена дракона

Жертва

Привалов Сергей
2. Звездный Бродяга
Фантастика:
боевая фантастика
космическая фантастика
рпг
попаданцы
5.00
рейтинг книги
Жертва

Бомбардировщики. Полная трилогия

Максимушкин Андрей Владимирович
Фантастика:
альтернативная история
6.89
рейтинг книги
Бомбардировщики. Полная трилогия

Я все еще граф. Книга IX

Дрейк Сириус
9. Дорогой барон!
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Я все еще граф. Книга IX

Шатун. Лесной гамбит

Трофимов Ерофей
2. Шатун
Фантастика:
боевая фантастика
7.43
рейтинг книги
Шатун. Лесной гамбит

Беглец

Бубела Олег Николаевич
1. Совсем не герой
Фантастика:
фэнтези
попаданцы
8.94
рейтинг книги
Беглец

Я граф. Книга XII

Дрейк Сириус
12. Дорогой барон!
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Я граф. Книга XII

Хозяин Стужи

Петров Максим Николаевич
1. Злой Лед
Фантастика:
аниме
фэнтези
попаданцы
7.00
рейтинг книги
Хозяин Стужи

Дважды одаренный. Том II

Тарс Элиан
2. Дважды одаренный
Фантастика:
городское фэнтези
альтернативная история
аниме
5.00
рейтинг книги
Дважды одаренный. Том II

Тринадцатый XI

NikL
11. Видящий смерть
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Тринадцатый XI

Последний Паладин. Том 11

Саваровский Роман
11. Путь Паладина
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Последний Паладин. Том 11

Нелюдь

Шелег Дмитрий Витальевич
1. Нелюдь
Фантастика:
фэнтези
8.87
рейтинг книги
Нелюдь

Кондотьер

Листратов Валерий
7. Ушедший Род
Фантастика:
фэнтези
боевая фантастика
аниме
попаданцы
5.00
рейтинг книги
Кондотьер