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

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

Жанры

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

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

Кодекс Крови. Книга III

Борзых М.
3. РОС: Кодекс Крови
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Кодекс Крови. Книга III

Отчий дом. Семейная хроника

Чириков Евгений Николаевич
Проза:
классическая проза
5.00
рейтинг книги
Отчий дом. Семейная хроника

Скандальная свадьба

Данич Дина
1. Такие разные свадьбы
Любовные романы:
современные любовные романы
эро литература
5.00
рейтинг книги
Скандальная свадьба

Путанабус. Трилогия

Старицкий Дмитрий
Фантастика:
боевая фантастика
6.93
рейтинг книги
Путанабус. Трилогия

Идеальный мир для Лекаря 25

Сапфир Олег
25. Лекарь
Фантастика:
фэнтези
юмористическое фэнтези
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря 25

Кодекс Крови. Книга ХVI

Борзых М.
16. РОС: Кодекс Крови
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Кодекс Крови. Книга ХVI

Проданная невеста

Wolf Lita
Любовные романы:
любовно-фантастические романы
5.80
рейтинг книги
Проданная невеста

Потомок бога

Решетов Евгений Валерьевич
1. Локки
Фантастика:
попаданцы
альтернативная история
аниме
сказочная фантастика
5.00
рейтинг книги
Потомок бога

С Д. Том 16

Клеванский Кирилл Сергеевич
16. Сердце дракона
Фантастика:
боевая фантастика
6.94
рейтинг книги
С Д. Том 16

Переиграть войну! Пенталогия

Рыбаков Артем Олегович
Переиграть войну!
Фантастика:
героическая фантастика
альтернативная история
8.25
рейтинг книги
Переиграть войну! Пенталогия

От Советского Информбюро - 1941-1945 (Сборник)

Неизвестен 3 Автор
Документальная литература:
биографии и мемуары
5.00
рейтинг книги
От Советского Информбюро - 1941-1945 (Сборник)

Санек 3

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

Прометей: повелитель стали

Рави Ивар
3. Прометей
Фантастика:
фэнтези
7.05
рейтинг книги
Прометей: повелитель стали

Отмороженный 14.0

Гарцевич Евгений Александрович
14. Отмороженный
Фантастика:
боевая фантастика
попаданцы
рпг
5.00
рейтинг книги
Отмороженный 14.0