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

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

Жанры

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

Магда Юрий

Шрифт:

В регистр ЕВХ поместим адрес массива аЗ (команда mov EBX, iarray+8), в котором находится искомое число. Таким образом, регистр ЕВХ будет использоваться как базовый. Регистр ESI будет выступать в качестве индексного, куда мы поместим значение 4 (размер двойного слова в байтах) с помощью команды

mov ESI. 4

Наконец, последняя команда загружает искомый элемент массива аЗ (380) в регистр ЕАХ:

mov EAX. [EBX][ESI*2][8]

В этой команде выражение [ESI*2], равное 8, указывает на элемент массива аЗ с индексом 2 (то есть число -177), а выражение [8] определяет смещение на 8. В результате суммирования всех значений (ЕВХ, ESI, 8) получаем эффективный адрес (ЕА) искомого элемента.

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

Хочу сделать важное замечание: все семь рассмотренных вариантов адресации проверены на компиляторе MASM версии 7.10 из пакета Windows XP DDK.

Рассмотрим еще один способ адресации данных в памяти, который используется в ряде случаев и называется непосредственной адресацией. При этом способе адресации операнд задается непосредственно в инструкции. Например, следующая команда вычитает значение 20 из регистра ЕАХ:

sub ЕАХ, 20

Все арифметические команды, за исключением команд dпv и idiv, допускают непосредственную адресацию. Максимальное значение непосредственного операнда варьируется для разных команд, однако в любом случае не может превышать значения, которое может принимать операнд размером в двойное слово без знака (232).

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

mov EAX. EDX

add EAX. ECX

Оба операнда должны иметь одинаковую размерность. Следующая команда вызовет ошибку:

mov EAX. BL

Здесь оба операнда – регистры ЕАХ и BL – имеют разную размерность, поэтому компилятор выдаст ошибку при трансляции этой команды.

Рассмотрим вкратце команды общего назначения процессора Intel Pentium. Более детальный анализ всех групп команд мы будем проводить в следующих главах, когда будут рассматриваться практические аспекты применения языка ассемблера. Команды общего назначения (general-purpose instructions) по функциональному признаку можно разделить на несколько групп:

– команды перемещения (пересылки, передачи) данных;

– команды целочисленной арифметики (сложения, вычитания, умножения и деления);

– команды логических операций;

– команды передачи управления (условных и безусловных переходов, вызовов процедур);

– команды строковых операций (иногда встречается название «строковые, или цепочечные, команды»).

Часть команд сложно отнести к какой-либо группе (например, команды помещения данных в стек или извлечения данных из стека, команды работы с табличными данными и т. д.).

Большинство команд работают с операндами в памяти, адресуемыми одним из способов, рассмотренных ранее, а также с регистрами общего назначения (ЕАХ, ЕВХ, ECX, EDX, ESI, EDI, EBP, ESP) и с регистрами сегментов (CS, DS, SS, ES, FS, GS).

Макроассемблер MASM версии 6.14 и выше поддерживает все основные команды процессора Intel Pentium, а также специальные группы команд ММХ-, SSE– и SSЕ2-расширений, которые подробно рассматриваются в последующих главах. Перечень всех команд процессора приводится в приложениях А и Б.

Глава 4
Структура программы на языке ассемблера

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

4.1. Организация сегментов

Для хорошего понимания, как работает программа на ассемблере, нужно очень четко представлять себе организацию сегментов. Применительно к процессорам Intel Pentium термин «сегмент» имеет два значения:

– Область физической памяти заранее определенного размера. Для 16-разрядных процессоров размер сегмента физической памяти не может превышать 64 Кбайт, в то время как для 32-разрядных может достигать 4 Гбайт.

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

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

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

При использовании 32-разрядного защищенного режима эти проблемы исчезают. Например, в плоской модели памяти (о ней мы поговорим чуть позже) для адресации программного кода и данных достаточно 32-разрядного эффективного адреса внутри непрерывной области памяти.

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

На границе империй. Том 10. Часть 6

INDIGO
Вселенная EVE Online
Фантастика:
боевая фантастика
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 10. Часть 6

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

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

Стая

Сергеева Оксана Николаевна
1. Стая
Любовные романы:
современные любовные романы
остросюжетные любовные романы
9.37
рейтинг книги
Стая

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

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

Вторая жизнь майора. Цикл

Сухинин Владимир Александрович
Вторая жизнь майора
Фантастика:
героическая фантастика
боевая фантастика
попаданцы
5.00
рейтинг книги
Вторая жизнь майора. Цикл

Окончательно мертв

Харрис Шарлин
6. Сьюки Стакхаус
Фантастика:
ужасы и мистика
8.73
рейтинг книги
Окончательно мертв

Имя нам Легион. Том 9

Дорничев Дмитрий
9. Меж двух миров
Фантастика:
боевая фантастика
рпг
аниме
5.00
рейтинг книги
Имя нам Легион. Том 9

Сердце Дракона. нейросеть в мире боевых искусств (главы 1-650)

Клеванский Кирилл Сергеевич
Фантастика:
фэнтези
героическая фантастика
боевая фантастика
7.51
рейтинг книги
Сердце Дракона. нейросеть в мире боевых искусств (главы 1-650)

Тень воина

Прозоров Александр Дмитриевич
7. Ведун
Фантастика:
фэнтези
8.94
рейтинг книги
Тень воина

Программирование для Linux. Профессиональный подход

Самьюэл Алекс
Компьютеры и Интернет:
программирование
5.00
рейтинг книги
Программирование для Linux. Профессиональный подход

Досье «ОДЕССА»

Форсайт Фредерик
Детективы:
политические детективы
7.56
рейтинг книги
Досье «ОДЕССА»

Наномашины, демоненок! Том 3

Новиков Николай Васильевич
3. Чего смотришь? Иди книгу читай
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Наномашины, демоненок! Том 3

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

Грехов Тимофей
2. Гримуар темного лорда
Фантастика:
фэнтези
попаданцы
аниме
5.25
рейтинг книги
Гримуар темного лорда II

Метатель

Тарасов Ник
1. Метатель
Фантастика:
боевая фантастика
попаданцы
рпг
фэнтези
фантастика: прочее
постапокалипсис
5.00
рейтинг книги
Метатель