Программирование на Ассемблере

       

Команды пересылки для работы с адресами


Так как адреса - это целые длиной 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]



Содержание раздела