Матрица транспонированная сборка - PullRequest
1 голос
/ 20 мая 2019

Я должен переставить матрицу в сборке x86-32bit, сохранить результат в другой матрице и затем распечатать его на экране. Но я не получаю правильный результат и не могу понять, почему. Я полагаю, что это что-то об индексации.

A dd 3,4,1,2,5,6,7,8,9
n dd 9
Tr dd 100 dup(0)
printTr db "transpose of matrix is = ",0
space db " ",0

TRANSPOSE:
    mov edx,nr
    cmp edx,4
    jne DETERMINANT
    mov eax,0
    mov esi,0
    mov ebx,0
    mov ecx,n
    push ecx
loop_tr1:
    mov eax,A[ebx*4+esi]
    mov Tr[ebx+4*esi],eax
    mov eax,0
    add esi,4
    loop loop_tr1

    pop ecx
    sub ebx,ecx
    push offset printTr
    call printf
    add esp,4
    mov ecx,n
    lea edi,Tr
l4:
    push ecx
    push [edi]
    push offset tip
    call printf
    add esp,8
    push offset space
    call printf
    add esp,4
    mov ebx,Tr
    mov [edi],ebx
    add edi,4
    pop ecx
    loop l4

Если я введу матрицу выше, я получу следующий результат: 3 0 0 0 4 0 0 0 1. Но я должен получить: 3 2 7 4 5 8 1 6 9.

1 Ответ

0 голосов
/ 02 июня 2019
A dd 3,4,1,2,5,6,7,8,9
n dd 9

Здесь отсутствует важный номер. Ваша матрица является квадратной матрицей ранга 3 .

A dd 3,4,1,2,5,6,7,8,9
n dd 9
r dd 3

Ваш процесс транспонирования может использовать вложенные циклы, как показано в коде ниже.

Исходный индекс ESI для массива A принимает эти значения. Это смещения в массиве.

0, 4, 8, 12, 16, 20, 24, 28, 32

Целевой индекс EDI для массива Tr принимает эти значения. Это индексы , которые будут масштабироваться с помощью *4.

0, 3, 6, 1, 4, 7, 2, 5, 8

Каждое выполнение внутреннего цикла распределяет элементы всей строки исходной матрицы. То, что делает внешний цикл, это перемещение начальной точки, которую будет использовать внутренний цикл, на одну позицию дальше.

    xor     ebx, ebx
    xor     esi, esi
OuterLoop:
    mov     edi, ebx     ; Set starting point

InnerLoop:
    mov     eax, A[esi]
    mov     Tr[edi*4], eax
    add     esi, 4
    add     edi, r
    cmp     edi, n
    jb      InnerLoop

    inc     ebx          ; Move starting point
    cmp     ebx, r
    jb      OuterLoop

Графическое объяснение см. На рисунках в ответе на это мое недавнее Q / A мое по обзору кода

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...