汇编中的矩阵转置

问题描述 投票:0回答:1

我必须在汇编x86 32位中转置一个矩阵,将结果存储在另一个矩阵中,然后将其打印在屏幕上。
但我没有得到正确的结果,我也不明白为什么。我想这与索引有关。

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
.

assembly matrix x86 transpose
1个回答
0
投票
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

您的转置过程可以使用嵌套循环,如下面的代码所示。

数组

A
ESI 源索引采用这些值。它们是数组中的偏移量

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

数组

Tr
EDI 目标索引采用这些值。它们是索引,将通过使用
*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

有关图形解释,请参阅 我最近在 codereview 上的 Q/A 的答案中的图片

© www.soinside.com 2019 - 2024. All rights reserved.