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

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

Жанры

Ассемблер для процессоров 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.

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

Бояръ-Аниме. Газлайтер. Том 34

Володин Григорий Григорьевич
34. История Телепата
Фантастика:
фэнтези
боевая фантастика
аниме
5.00
рейтинг книги
Бояръ-Аниме. Газлайтер. Том 34

Враг из прошлого тысячелетия

Еслер Андрей
4. Соприкосновение миров
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Враг из прошлого тысячелетия

Linux программирование в примерах

Роббинс Арнольд
Компьютеры и Интернет:
программирование
ос и сети
5.00
рейтинг книги
Linux программирование в примерах

Проклятый Лекарь. Том 2

Молотов Виктор
2. Анатомия Тьмы
Фантастика:
фэнтези
попаданцы
7.00
рейтинг книги
Проклятый Лекарь. Том 2

Курс 1. Сентябрь

Фокс Гарри
1. Маркатис
Фантастика:
аниме
фэнтези
сказочная фантастика
5.00
рейтинг книги
Курс 1. Сентябрь

Хозяин Теней 6

Петров Максим Николаевич
6. Безбожник
Фантастика:
аниме
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Хозяин Теней 6

Лекарь Империи 6

Карелин Сергей Витальевич
6. Лекарь Империи
Фантастика:
городское фэнтези
боевая фантастика
аниме
попаданцы
5.00
рейтинг книги
Лекарь Империи 6

Жена со скидкой, или Случайный брак

Ардова Алиса
Любовные романы:
любовно-фантастические романы
8.15
рейтинг книги
Жена со скидкой, или Случайный брак

Первый среди равных. Книга XII

Бор Жорж
12. Первый среди Равных
Фантастика:
аниме
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Первый среди равных. Книга XII

Кодекс Охотника. Книга XXI

Винокуров Юрий
21. Кодекс Охотника
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Кодекс Охотника. Книга XXI

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

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

Неучтенный элемент. Том 3

NikL
3. Антимаг. Вне системы
Фантастика:
фэнтези
5.00
рейтинг книги
Неучтенный элемент. Том 3

Изгой Проклятого Клана. Том 4

Пламенев Владимир
4. Изгой
Фантастика:
аниме
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Изгой Проклятого Клана. Том 4

Золотой ворон

Сакавич Нора
5. Все ради игры
Фантастика:
зарубежная фантастика
5.00
рейтинг книги
Золотой ворон