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

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

Жанры

Ассемблер для процессоров 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 (выделенное жирным шрифтом) в регистр ЕАХ. Для этого воспользуемся несколько искусственной схемой, которая поможет понять суть этого метода адресации.

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

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

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

Тихие ночи

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

Кодекс Охотника XXXI

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

Звездная Кровь. Изгой VII

Елисеев Алексей Станиславович
7. Звездная Кровь. Изгой
Фантастика:
боевая фантастика
технофэнтези
рпг
фантастика: прочее
попаданцы
5.00
рейтинг книги
Звездная Кровь. Изгой VII

Лейтенант космического флота

Борчанинов Геннадий
1. Звезды на погонах
Фантастика:
боевая фантастика
космическая фантастика
космоопера
рпг
фэнтези
фантастика: прочее
5.00
рейтинг книги
Лейтенант космического флота

Имперец. Том 4

Романов Михаил Яковлевич
3. Имперец
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Имперец. Том 4

Законник Российской Империи. Том 2

Ткачев Андрей Юрьевич
2. Словом и делом
Фантастика:
городское фэнтези
альтернативная история
аниме
дорама
6.40
рейтинг книги
Законник Российской Империи. Том 2

Император Пограничья 5

Астахов Евгений Евгеньевич
5. Император Пограничья
Фантастика:
аниме
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Император Пограничья 5

Авиатор: назад в СССР

Дорин Михаил
1. Авиатор
Фантастика:
попаданцы
альтернативная история
5.25
рейтинг книги
Авиатор: назад в СССР

Орден Багровой бури. Книга 1

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

Точка Бифуркации VIII

Смит Дейлор
8. ТБ
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Точка Бифуркации VIII

Шайтан Иван 4

Тен Эдуард
4. Шайтан Иван
Фантастика:
попаданцы
альтернативная история
8.00
рейтинг книги
Шайтан Иван 4

Санек 3

Седой Василий
3. Санек
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Санек 3

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

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