0
エラーが発生しました - アセンブリプログラムを実行しようとすると、セグメンテーションフォルト(エラー139)が発生します。私が理解しているように、私はr3より上のレジスタを使用し、それらを初期状態に戻さないからです。どうやってやるの?ARMアセンブリレジスタが初期状態に戻る
以下は私のコードですが、何が問題なのでしょうか?
.text
.align 2
.global matmul
.type matmul, %function
matmul:
@-- check if matrices can be multiplied
cmp r1,r3
beq loadvalues @-- matrices can be multiplied
mov r0,#1
bx lr
@-- load matrice values
loadvalues:
stmdb SP!, { r4-r15 }
ldr r4, [sp, #0]
ldr r5, [sp, #4]
ldr r6, [sp, #8]
mov r7, #0
mov r8, #0
mov r9, #0
mov r10, #4
b firstloop
mov r0, #0
bx lr
@-- Loop r7 to r0
firstloop:
cmp r7, r0
blt firstloopex
firstloopex:
add r7, r7, #1
b secondloop
LDMIA SP!, { r4-r15 }
endfirstloop:
mov r0, #0
bx lr
@-- Loop r8 to r4
secondloop:
cmp r8, r4
blt secondloopex
secondloopex:
add r8, r8, #1
b thirdloop
endsecondloop:
mul r11, r7, r8
mul r11, r10, r11
sub r11, r11, r10
str r0, [r6, r11]
mov r8, #0
@-- Loop r9 to r1
thirdloop:
cmp r9, r1
blt thirdloopex
thirdloopex:
add r9, r9, #1
@-- load value of matrice 1
mul r11, r7, r9
mul r11, r10, r11
sub r11, r11, r10
ldr r12, [r2, r11]
@-- load value of matrice 2
mul r11, r9, r8
mul r11, r10, r11
sub r11, r11, r10
ldr r13, [r5, r11]
@-- sum up value
mul r14, r12, r13
add r0, r0, r14
endthirdloop:
mov r9, #0
変更する前にレジスタを 'プッシュ 'してから、戻ります。 – EOF
あなたは、着信先保存されたレジスタを保存している(または少なくとも試みている)ようです。しかし、 'LDMIA SP !, {r4-r15}'と 'ldr r13、[r5、r11]'は特に目立ちます - デバッガのものを一歩踏み込んでみてください。 。次に、 'r13'と' r15'がどのような役割を果たすのか調べてみてください;) – Notlikethat
大規模な汎用レジスタファイルを持つアーキテクチャに関するARMの宣伝のために、あなたは落ちているようです。それはしません。また、アーキテクチャのリファレンスマニュアルも読んでください。 – EOF