Содержимое индексного регистра умножается на масштабный коэффициент, и результат суммируется с содержимым базового регистра.
Например:
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;
}
Понятие модульного программирования. Понятие подпрограммы. Ассемблерные процедуры и функции.