我必须在汇编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
.
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 的答案中的图片