Режимы адресации для процессоров с архитектурой 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;
}