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

Задание двухмерного массива


Пусть необходимо задать матрицу, определенную в С:

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



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