矩阵转置组件

时间:2019-05-20 10:50:47

标签: assembly x86

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

{ texts : [Text,Text,Text],
  emails : [Email,Email,Email]...
}

如果我在上方输入矩阵,则会得到以下结果: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

1 个答案:

答案 0 :(得分: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

有关图形说明,请参见this recent Q/A of mine on codereview的答案中的图片