Я пытаюсь передать умножение матриц, записанное в 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?