Команды пересылки для работы с адресами
Так как адреса - это целые длиной 32 бита (модель flat), для работы с адресами можно использовать обычную команду mov.
Пример. Реализовать операторы
Int i1[4], *p=i1, *q;
q = &i1[3]; *p = *q;
i1 dd 4 dup (?)
p dd i1
q dd ?
…
; q = &i1[3]; *p = *q;
mov eax, [p]; &i1[0]
add eax, 3*4; &i1[3]
mov [q],eax; q=&i1[3]
mov ebx, [eax]; *q
mov ecx, [p]
mov [ecx], ebx; *p = *q;
В этом примере используются области памяти для хранения адресов. Для формирования адреса без использования областей памяти можно использовать операцию offset и команду mov.
Например, команда
mov eax, offset x
записывает адрес переменной x
в регистр eax.
По второму адресу можно задать адрес данного с использованием только относительной адресации. Для других способов адресации операция offset не используется.
Для этого используется специальная команда:
lea <оп1>, <оп2>.
В качестве <оп1>
используется регистр 32-битный или 16 битный в зависимости от типа приложения. В качестве <оп2>
используется адрес памяти, для задания которого можно применять любой способ адресации.
Пример 1. Команды
mov eax, offset x
lea eax, [x]
эквивалентны по выполняемым действиям, но первая команда более эффективна.
Пример 2. Записать адрес третьего элемента массива x , если длина элемента – 4 байта:
Lea eax, [x+12]