переписывание C умножения матриц в сборку ARM (64) - PullRequest
0 голосов
/ 14 апреля 2020

Я пытаюсь передать умножение матриц, записанное в C, на сборку ARM вручную. Матрицы всегда являются квадратными матрицами, определенными TAM, и я использую одномерные массивы, как вы можете видеть здесь . Исходный код C:

void multiply(int *a, int *b, int *c){
    int i = 0;
    while(i < TAM){
        int j = 0;
        while(j < TAM){
            int k = 0;
            while(k < TAM){
                c[i*TAM + j] = c[i*TAM + j] + a[i*TAM + k]*b[k*TAM + j];
                k++;
            }
            j++;
        }
        i++;
    }
}

И код ARM получает ошибку сегмента в инструкции магазина, но я не могу найти причину:

       ldr x0, =matriz1
       ldr x1, =matriz2
       ldr x2, =matriz3
       mov x3, #10  //TAM = 10

       mov x4, #0    //i = 0
loop_i:              //while(i<TAM){
       mov x5, #0    //j = 0

loop_j:              //while(j<TAM){
       mov x6, #0    //k = 0

loop_k:              //while(k<TAM){
       madd x7, x3, x4, x6  //x7 <- i*TAM + k
       ldr x7, [x0, x7]     //a[x7]

       madd x8, x6, x3, x5  //x8 <- k*TAM + j
       ldr x8, [x1, x8]     //b[x8]

       madd x9, x3, x4, x5  //x9 <- i*TAM + j
       ldr x10, [x2, x9]     //c[x9]

       madd x10, x7, x8, x10  //c[i*TAM + j] + a[i*TAM + k]*b[k*TAM + j]
       str x10, [x2, x9]         //c[i*TAM + j] = c[i*TAM + j] + a[i*TAM + k]*b[k*TAM + j]

end_loop_k:
       add x6, x6, #1       //k++
       cmp x6, #10   
       blt loop_k           // }

end_loop_j:
       add x5, x5, #1       //j++
       cmp x5, #10
       blt loop_j           // }

end_loop_i:
       add x4, x4, #1       //i++
       cmp x4, #10
       blt loop_i           //}

Комментарии связаны с оригиналом C код. Есть ли у вас идеи, почему Segfault?

...