我必须将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
。
答案 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的答案中的图片