我花了很多时间找到为什么我无法在void * C中存储值。在这段代码中,我可以调用dot_prod来计算内部循环中的点积,并且在溢出的情况下,我使用另一个函数,即mod,取2个参数,一个是dot_prod的返回值,另一个是17,其中是mod(%rax,17)。在我的代码中,我可以打印我的矩阵源A,B,但我不知道为什么我的代码不能计算A,B的矩阵乘积,详细信息如下所示我有一个问题是我可以显示矩阵A,B,但我不能存储存储在C寄存器%rcx中的A,B的输出
and my output looks like:
5 b a 3
a 6 2 1
6 3 e d
8 5 2 0
a c e 5
c a 1 1
c 0 c a
c 0 1 a
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
这里第三个矩阵的值是0,但不是我所期望的,在矩阵C中它应该是A和B的矩阵乘积
.globl matrix_prod
matrix_prod: # void matrix_prod(void *A, void *B, void *C, int n);
#for i from 0 to n-1 do
#for j from 0 to n-1 do
#C[i][j] = mod(dot_prod(A, B, n, i, j), 17)
# long dot_prod(void *A, void *B, int n, int i, int j);
# %rdx: void *C
# %rdi: A
# %rsi: B
# %rcx: n
movq $-1, %r9 #i
movq $0, %r8 #j
movq %rcx, %r11 #save n value
movq $0, %rcx #recycle rcx
outerloop:
incq %r9 #i++
cmpq %r11, %r9 #if i<n
jge endloop
innerloop:
cmpq %r8, %r11 #if j<n
jge outerloop
push %rdx #C
movq %r11, %rdx #now n in rdx
movq %r9, %rcx #now i in rcx
call dot_prod
pop %rdx #now c in %rdx
push %rsi #B
push %rdi #A
movq %rax, %rdi
movq $17, %rsi
call mod
movq %rax, (%rdx)
addq $8, %rdx
pop %rdi #now rdi=A
pop %rsi #now rsi=B
incq %r8 #j++
jmp innerloop
endloop:
ret