Задание двухмерного массива
Пусть необходимо задать матрицу, определенную в С:
int matr[][4]= {{1,2,3,4}, {5,6,7,8}, {9,10,11,12}};
matr dd 1,2,3,4
dd 5,6,7,8
dd 9,10,11,12
Задание адреса элемента
Для адресации данных массива можно использовать 2 регистра индексный и базисный [3.4.3]. Для каждого индекса определяется шаг изменения адреса.
Например, для массива:
int x[M][N] шаг изменения адреса по второму индексу Hj равен sizeof (int) = 4, а для первого индекса Hi равен Hj * N. Если длина элемента совпадает со значением масштабного множителя (стандартная длина элемента -1, 2, 4, 8), то в индексный регистр записывается значение индекса, если не совпадает то - значение смещения.
Для задания адреса элемента X[i][j] со стандартной длиной элемента используется запись вида [X+REG1 + REG2 * LEN], где REG1- общий регистр, содержащий смещение для i - ой строки, а REG2-
общий регистр, содержащий значение индекса j. Для элемента массива нестандартной длины адрес задается в виде [X+REG1 + REG2], где REG1- общий регистр, содержащий смещение для i - ой строки, а REG2- общий регистр, содержащий смещение для j - ого элемента строки.
Пример. Оттранслировать операторы:
int matr[][4]= {{1,2,3,4}, {5,6,7,8}, {9,10,11,12}};
long double numbers [][4]= {{1,2,3,4}, {5,6,7,8}, {9,10,11,12}};
// Формирование i, j
matr[i][j]=0; numbers[i][j]=0;
matr dd 1,2,3,4
dd 5,6,7,8
dd 9,10,11,12
numbers
dt 1,2,3,4
dt 5,6,7,8
dt 9,10,11,12
HIMATR dd 16
HINumbers dd 40
...
mov eax, HIMATR
mul [i]
mov ebx, [j]
mov [matr+eax+ebx*4], 0
mov eax, HINumbers
mul [i]
mov ebx, eax; База
mov eax, 10
mul [j]
mov [dword ptr numbers + eax + ebx], 0
mov [dword ptr numbers + eax + ebx + 4], 0
mov [word ptr numbers + eax + ebx + 8], 0