2016-05-02 20 views
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 
+0

変更する前にレジスタを 'プッシュ 'してから、戻ります。 – EOF

+0

あなたは、着信先保存されたレジスタを保存している(または少なくとも試みている)ようです。しかし、 'LDMIA SP !, {r4-r15}'と 'ldr r13、[r5、r11]'は特に目立ちます - デバッガのものを一歩踏み込んでみてください。 。次に、 'r13'と' r15'がどのような役割を果たすのか調べてみてください;) – Notlikethat

+0

大規模な汎用レジスタファイルを持つアーキテクチャに関するARMの宣伝のために、あなたは落ちているようです。それはしません。また、アーキテクチャのリファレンスマニュアルも読んでください。 – EOF

答えて

1

ARMでは、{r4-r11}を保存して復元する必要があります。過去はすべて特別なレジスタです。以下はARMでの関数のスケルトンです。

my_func: 
    push {r4-r11} # Save callee-saved registers. stmdb sp!, {r4-r11} 
    ... 
    pop {r4-r11} # Restore callee-saved registers. ldmia sp!, {r4-r11} 
    mov r0, #0  # Save return value to r0 
    bx lr 

注意:r9も特別なレジスタであり、保存されてはならないことがあります。それほど珍しいので、詳細には触れません。あなたはそれについてAAPCS(Arm Architecture Procedure Call Standard)http://infocenter.arm.com/help/topic/com.arm.doc.ihi0042f/IHI0042F_aapcs.pdfで読むことができます。

関連する問題