2016-05-02 15 views
0

Ich erhalte einen Fehler - Segmentierung Fehler (Fehler 139), wenn ich versuche, mein Assembly-Programm zu starten. Wie ich es verstehe, ist es, weil ich Register über R3 verwende, und sie nicht zum Anfangszustand zurückbringen. Wie kann ich das machen?ARM Assembly-Register in den Ausgangszustand zurückkehren

Unten ist mein Code, was könnte das Problem sein?

.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

'drücken 'Sie das Register, bevor Sie es modifizieren,' pop' es vor der Rückkehr? – EOF

+0

Es sieht so aus, als würden Sie bereits gespeicherte Register speichern (oder zumindest versuchen). Besonders hervorzuheben sind jedoch "LDMIA SP !, {r4-r15}" und "ldr r13, [r5, r11]". Versuchen Sie einmal, in einem Debugger durchzugehen (wenn Sie sie überhaupt erreichen) und zu sehen, was danach passiert . Dann geh und schaue nach, welche Rollen 'r13' und' r15' dienen ...;) – Notlikethat

+0

Du scheinst für ARMs Propaganda über die Architektur mit einer großen Allzweck-Registerdatei gefallen zu sein. Es tut nicht. Lesen Sie auch das Referenzhandbuch zur Architektur. – EOF

Antwort

1

In ARM, müssen Sie speichern und wiederherstellen {r4-r11}. Hinter all dem sind spezielle Register. Es folgt ein Skelett einer Funktion in 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 

Hinweis: Manchmal ist r9 ein spezielles Register und sollte nicht gespeichert werden. Ich werde nicht ins Detail gehen, weil es selten genug ist. Sie können darüber im AAPCS (Arm Architecture Procedure Call Standard) http://infocenter.arm.com/help/topic/com.arm.doc.ihi0042f/IHI0042F_aapcs.pdf nachlesen.

Verwandte Themen