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

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

Жанры

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

Магда Юрий

Шрифт:
 


Рис. 3.13. Схема косвенной адресации


Предположим, что переменная meml размером в слово имеет значение 1A9Fh и занимает два байта в памяти с адресами 1CD6h (младший байт) и 1CD7 (старший байт). После выполнения первой команды в регистре ВХ будет находиться адрес переменной meml, являющийся одновременно и адресом первого элемента. Вторая команда помещает в регистры АХ значение переменной meml.

 

Вариант 3. Для формирования эффективного адреса операнда используется содержимое базового

регистра плюс смещение («база + смещение»). Такой вариант адресации удобен в двух случаях:

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

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

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

[база + смещение]

[база][смещение]

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

. . .

s1 DB «String 1»

. . .

lea EBX. s1

mov AL. byte ptr [EBX][5]

. . .

Здесь первая команда (lea EBX, sl) помещает в регистр EBX адрес строки, который одновременно является и адресом первого элемента (имеющего индекс 0). Во время выполнения второй команды к содержимому регистра ЕВХ прибавляется значение 5, указывая на 6-й по порядку элемент строки s1 (это символ g), после чего значение этого символа помещается в регистр AL. Таким образом, после выполнения второй команды регистр a1 будет содержать символ д. Алгоритм выполнения этого фрагмента программного кода показан на рис. 3.14.



Рис. 3.14. Схема базовой адресации


Вариант 4. В следующем режиме эффективный адрес формируется по принципу «индекс + смещение». Смещение при таком способе адресации указывает на начало массива чисел или строки, а индексный регистр содержит номер элемента данных. Например, в показанном ниже фрагменте программного кода в регистр a1 помещается элемент строки s1 с индексом 10 (11-й элемент строки, символ +):

. . .

s1 DB «!@#$Г&*+][»

. . .

mov EBX. 10

mov AL. byte ptr s1 [EBX]

. . .

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

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

. . .

s1 DB «0123456789ABCDEF»

. . .

mov EBX. 7

mov AL. byte ptr s1 [EBX*2]

. . .

При указанном значении регистра ЕВХ в регистр a1 будет помещен символ Е, поскольку он находится по смещению 14 (7 х 2) в строке si.

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

. . .

s1 DB «ABCD EFGH IJKLM»

s2 DB «abcd efgh ijklm»

s3 DB «0123 4567 89»

sarray label dword

DD s1

DD s2

DD s3

. . .

mov EBX, sarray+4

mov ESI. 10

mov AL. byte ptr [EBX][ESI][2]

. . .

Здесь в сегменте данных определен массив строк sarray, содержащий адреса строк s1 – s3. В каждой строке определены группы элементов, разделенные символом пробела. Предположим, нужно получить доступ к символу к, находящемуся в строке s2. Будем использовать регистр ЕВХ как базовый, а регистр ESI как индексный. Поместим в ЕВХ адрес строки s2, где находится искомый элемент (команда mov ЕВХ, sarray+4), а в регистр ESI – смещение группы элементов, в которой находится символ к (величина смещения в данном случае равна 10). Для этого выполним команду

mov ESI. 10

Символ к находится по смещению 2 относительно группы элементов ijklm, поэтому последняя команда помещает символ в регистр AL:

mov AL. byte ptr [EBX][ESI][2]

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

. . .

al DD 45, -87, 23, -11, 83, -442, 56, -340

а2 DD 92, -31, 9, -598, 361, 406, -172, 7

аЗ DD 234, 8, -177, 921, 380, -12, 0, -51

iarray label dword

DD a1

DD a2

DD a3

. . .

mov EBX. iarray+8

mov ESI. 4

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

Здесь определены три массива целых чисел (a1 – аЗ), состоящих из двухсловных элементов. Предположим, требуется поместить число 380 (выделенное жирным шрифтом) в регистр ЕАХ. Для этого воспользуемся несколько искусственной схемой, которая поможет понять суть этого метода адресации.

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

Второй кощей

Билик Дмитрий Александрович
8. Бедовый
Фантастика:
юмористическое фэнтези
городское фэнтези
мистика
5.00
рейтинг книги
Второй кощей

Кротовский, вы сдурели

Парсиев Дмитрий
4. РОС: Изнанка Империи
Фантастика:
попаданцы
альтернативная история
рпг
5.00
рейтинг книги
Кротовский, вы сдурели

Вперед в прошлое 6

Ратманов Денис
6. Вперед в прошлое
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Вперед в прошлое 6

(Не)зачёт, Дарья Сергеевна!

Рам Янка
8. Самбисты
Любовные романы:
современные любовные романы
5.00
рейтинг книги
(Не)зачёт, Дарья Сергеевна!

Адепт. Том второй. Каникулы

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

Неудержимый. Книга XX

Боярский Андрей
20. Неудержимый
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Неудержимый. Книга XX

Герцог. Книга 1. Формула геноцида

Юллем Евгений
1. Псевдоним "Испанец" - 2
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Герцог. Книга 1. Формула геноцида

Сирота

Шмаков Алексей Семенович
1. Светлая Тьма
Фантастика:
юмористическое фэнтези
городское фэнтези
аниме
5.00
рейтинг книги
Сирота

Бракованная невеста. Академия драконов

Милославская Анастасия
Фантастика:
фэнтези
сказочная фантастика
5.00
рейтинг книги
Бракованная невеста. Академия драконов

Хозяин оков II

Матисов Павел
2. Хозяин Оков
Фантастика:
юмористическое фэнтези
попаданцы
фэнтези
5.00
рейтинг книги
Хозяин оков II

Студент из прошлого тысячелетия

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

Чехов. Книга 2

Гоблин (MeXXanik)
2. Адвокат Чехов
Фантастика:
фэнтези
альтернативная история
аниме
5.00
рейтинг книги
Чехов. Книга 2

Изменяющий-Механик. Компиляция. Книги 1-18

Усманов Хайдарали
Собрание сочинений
Фантастика:
боевая фантастика
космическая фантастика
5.00
рейтинг книги
Изменяющий-Механик. Компиляция. Книги 1-18

Матабар

Клеванский Кирилл Сергеевич
1. Матабар
Фантастика:
фэнтези
5.00
рейтинг книги
Матабар