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