Режимы адресации для процессоров с архитектурой IA-32. Работа с массивами на ассемблере.

Режимы адресации для процессоров с архитектурой IA-32.

Есть 11 основных режимов адресации.

1. Регистровый режим адресации.

Здесь все достаточно просто. В командах в качестве операндов используются регистры.

Например:

 

MOV AL, BH //8-разрядный регистровый режим адресации

MOV AX, BX //16-разрядный регистровый режим адресации

MOV ЕАХ, ЕВХ //32-разрядный регистровый режим адресации

 

2. Непосредственный режим адресации.

В команду непосредственно встраивается константа.

Например:

 

ADD АН,6

ADD AX,12345

ADD ЕАХ,123456

 

3. Режим прямой адресации.

Адрес операнда задается в виде 8-, 16- или 32-битового смещения в самой команде,

например:

DEC WORD PTR h[500]

или:

DEC WORD PTR h+500

INC DWORD PTR a

 

4. Режим регистровой косвенной адресации.

В этом случае базовый или индексный регистр содержат адрес операнда.

Например:

 

SDB DX, [SI]

SUB EDX, [ЕСХ]

 

5. Базовая адресация.

Содержимое базового регистра суммируется со смещением.

Например:

 

ADD DX, [BX]+100

SUB EDX, [ЕАХ]+10

 

6. Индексная адресация.

Содержимое индексного регистра суммируется со смещением.

Например:

 

ADD DX, brr[BP]

SUB EAX,arr[ЕАХ]

7. Индексная адресация с масштабированием.

Содержимое индексного регистра умножается на масштабный коэффициент и суммируется со смещением.

Например:

 

SUB EAX,arr[EAX*4]

 

8. Базово-индексная адресация.

Содержимое базового регистра складывается с содержимым индексного регистра.

Например:

 

ADD EAX,[EBX+ESI]

9. Базово-индексная адресация с масштабированием.

Содержимое индексного регистра умножается на масштабный коэффициент, и результат суммируется с содержимым базового регистра.

Например:

 

SUB ECX,[EBX+EAX*8]

 

10. Базово-индексная адресация со смещением.

Содержимое базового регистра складывается с содержимым индексного регистра и со смещением.

Например:

 

SUB EDX, ЕСХ[ЕАХ+10]

ADD EAX, [ESI][EBP+00ABCFh]

 

Аналог предыдущей команды:

 

ADD EAX, [ESI+EBP+00ABCFh]

 

11. Базово-индексная адресация со смещением и масштабированием.

Содержимое индексного регистра умножается на масштабный коэффициент, и результат добавляется к содержимому базового регистра, которое суммируется со смещением.

Например:

 

SUB ECX, table[EBX+36+EAX*8]

 

Аналог предыдущей команды:

 

SUB ECX, table[EAX*8][EBX+36]

 

Работа с массивами на ассемблере.

Массив — структурированный тип данных, состоящий из некоторого числа элементов

одного типа.

Все элементы массива располагаются в памяти компьютера последовательно. Интерпритация структуры данных в массиве зависит только от алгоритма обработки этих данных в конкретной программе, а не от особенностей раположения в памяти. Нумерация элементов массива в ассемблере начинается с нуля. Для получения адреса элемента в массиве необходимо начальный (базовый) адрес массива сложить с произведением индекса (номер элемента минус единица) этого элемента на размер элемента массива:

 

база + (индекс*размер элемента)

 

В качестве базового регистра может использоваться любой из восьми регистров общего назначения. В качестве индексного регистра также можно использовать любой регистр общего назначения, за исключением ESP/SP.

Иногда удобно использовать ECX в качестве номера элемента массива в цикле, организованном с помощью команды loop.

Пример: //сумма всех элементов массива

int mas1[2][4];

asm {

mov ecx,8;

xor eax,eax;

lea ebx,mas1[0];

m1: add eax, [ebx][ecx*4-4];

loop m1;

}

//2 вариант кода

asm {

mov ecx,8;

xor eax,eax;

m1: add eax, dword ptr mas1[ecx*4-4];

loop m1;

}