为什么我不能在我的汇编matrix_product代码中节省价值?

时间:2017-10-19 02:14:12

标签: assembly machine-learning x86-64

我花了很多时间找到为什么我无法在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

0 个答案:

没有答案