Метод связанных индексов
Адрес элемента в начале строки используется для формирования адреса очередного элемента для обоих индексов, т.е. фактически требуется 2 экземпляра этого адреса. Т.к. фактически используется одно и тоже значение для работы с каждым индексом метод называется методом связанных индексов. Для получения 2-х экземпляров используется стек. Формируется необходимое значение, один экземпляр которого записывается в стек, второй остается в регистре для работы со вторым индексом. При необходимости работы с первым индексом извлекается значение из стека.
Структура программы для метода связных индексов:
for (i=0; i<.. i++){ mov ecx, ...
mov ebx, Смещение ПОЭ[11]
...
for (j=0; j<... ; j++){ fori:
... push ecx
push ebx
mov ecx,...
forj:
[Имя массива + ebx]
} add ebx, [Hj]
loop forj
} pop ebx
add ebx, Hi
pop ecx
loop fori
Пример 1. Составить программу для нахождения сумм строк матрицы с нечетными номерами
for (k=i=0; i<M; i+=2, k++){
r=0;
for (j=0; j<N; j++)
r+=matr[i][j]
s[k]=r;
}
mov esi, [N]
shl esi, 3; Шаг по i
;for (k=0. i=1; i<M; i+=2, k++){
sub eax, eax; k
mov ecx, [M]
shr ecx, 1
mov ebx, [N]
shl ebx, 2; i
fori:
;r=0;
subаааааа edx, edx
;аа for (j=0; j<N; j++)
pushаааа ecx
movаааа ecx, [N]
pushаааа ebx
forj:
;ааааа r+=matr[i][j]
addааааа edx, [matr+ebx]
;j++
addааааа ebx, 4
loopаааа forj
;аа s[k]=r;
movаааа [s+eax*4], edx
;i++
incаааааа eax
popааааа ebx
addааааа ebx, esi
popааааа ecx
loop fori
¦ЁшьхЁ 2. TюёЄртшЄ№ яЁюуЁрььє фы яхЁхьэюцхэш ьрЄЁшЎ
ideal
p586
model flat
extrn ExitProcess:proc
dataseg
matrаааааа ddааааа 1,1,1,1,1
аааааааааа ddааааа 2,2,2,2,2
аааааааааа ddааааа 3,3,3,3,3
аааааааааа ddааааа 4,4,4,4,4
Mааааааааа ddааааа 4
Nааааааааа ddааааа 5
Sааааааааа ddааааа 5 dup (?)
codeseg
begin:
movааа esi, [N]
shlааа esi, 3; ? г по i
;for (k=0. i=1; i<M; i+=2, k++){
subа eax, eax; k
movа ecx, [M]
shrа ecx, 1
movа ebx, [N]
shlа ebx, 2; i
fori:
;r=0;
subаа edx, edx
;аа for (j=0; j<N; j++)
pushааа ecx
movаааа ecx, [N]
pushааа ebx
forj:
;ааааа r+=matr[i][j]
addааа edx, [matr+ebx]
;j++
addа ebx, 4
loopааааа forj
;аа s[k]=r;
movаааааааа [S+eax*4], edx
;i++
incа eax
popа ebx
addа ebx, esi
popа ecx
loop fori
callааа ExitProcess
endаааа begin
¦ръ тшфэю шч яЁюуЁрььv фы ърцфюую шч ьрёёштют ЄЁхсєхЄё Єюы№ъю юфшэ ЁхушёЄЁ.