2016-04-07 4 views
0

Ich bin neu in der Assemblersprache mit dem Raspberry Pi. Ich habe versucht, dieses einfache Programm auf einem Raspberry Pi 3 (ARM 8086) zu starten. Es verursacht keinen Fehler, aber wenn ich versuche, das Ergebnis in einem Terminal nach dem Kompilieren und Ausführen von as _o example.o example.s, gcc _o example examle.s und ./example zu sehen. das Ausführungsergebnis ist Segmentierungsfehler, können Sie mir bitte helfen?einfache Codes in Assemblersprache

.align 2 
    .text 
    .global main 
main: 
    stmfd r13!, {r14} 

    mov r0,#1 
    bl print 

    mov r0,#2 
    bl print 

    mov r0,#3 
    bl print 

    ldmfd r13!,{pc} @ return to OS 

print: 
    stmfd r13!, {r0-r3,r12,r14} 
    mov r1,r0 
    ldr r0, =num_str 
    bl printf 
    ldmfd r13!, {r0-r3,r12,pc} 

.data 

    .align 2 
num_str: 
    .asciz “%d\n” 
.end 
+1

_ "8086" _ Huh? Außerdem haben Sie eine Menge Tippfehler in den Befehlen, die Sie sagen ('_o',' exclle.s', 'first', die nicht mit' example' übereinstimmen). – Michael

+0

@Michael, du hast recht, vielen Dank, dass du es bemerkt hast, ich habe es zum Beispiel geändert, das Ergebnis ist Segmentierungsfehler. – rezan

+1

Dieser Code funktioniert ganz gut für mich, vorausgesetzt, die "" "Anführungszeichen werden durch syntaktisch korrekte" "" ersetzt - ich nehme an, dass diese nur ein Artefakt des Postings sind und nicht in Ihrem eigentlichen Code, weil sie das machen Assembler werfen einen Fehler, den Sie sagen, passiert nicht. – Notlikethat

Antwort

2

Der ABI erfordert, dass der Stapelzeiger zu Vielfaches von 8 Bytes ausgerichtet ist, Ihre main Funktion dekrementiert der Stapelzeiger um 4 macht es nicht ausgerichtet. Vermutlich printf verwendet eine Anweisung, die 8-Byte-Ausrichtung erfordert.

+0

vielen dank, es hat funktioniert. – rezan