2016-09-29 3 views
-1

Ich bin ziemlich neu in Assembly und ich versuche ein Programm zu erstellen, das scanf verwendet, um eine Nummer vom Benutzer zu erhalten. Es gibt dann "Ergebnis: (die Nummer)" Ich bekomme immer einen Segmentierungsfehler beim Ausführen des Codes. Dieser ist der Code, den ich bekam haben jetzt:Segmentierungsfehler beim Aufruf von scanf in x86_64 AT & T

.global main 
mystring: .asciz"input\n" 
formatstring: .asciz" %d" 
resultstring: .asciz "Result: %ld\n" 

main: 
    movq $0, %rax  
    movq $mystring, %rdi 
    call printf 
    call inout 
    movq $0, %rax 
    movq $resultstring, %rdi 
    call printf 
    jmp end 

inout: 
    pushq %rbp 
    subq $8, %rsp 
    leaq -8(%rbp), %rsi 
    movq $formatstring, %rdi 
    movq $0, %rax 
    call scanf 
    popq %rbp  
    ret 


end: 
    movq $0, %rdi 
    call exit 

Ich vermute, es ist etwas falsch mit dem ‚inout‘ -Methode. Irgendwelche Lösungen, um dieses Programm zum Laufen zu bringen?

+1

In 'inout' setzen Sie nicht' rbp', schieben Sie nur den alten Wert auf Stack, aber dann greifen Sie auf 'rbp-8' Speicher (Zugriff geschieht innerhalb scanf), die irgendwo zeigen kann. BTW "Ich bekomme immer einen Segmentierungsfehler" zeigt mangelnden Aufwand auf Ihrer Seite an, durch Debugging sollten Sie in der Lage sein zu sagen, bei welcher Anweisung es defaults ist und wie der Zustand der CPU ist (Registerwerte, Adresse des Codes, Stack-Inhalt). Aber an diesem Punkt müssten Sie nicht bei SO nachfragen, da Sie wahrscheinlich selbst sehen würden, dass das Argument "% rsi" für "scanf" falsch ist. – Ped7g

+0

Und Sie nicht 'rsp' nach Scanf Aufruf wiederherstellen, tun' pop% rbp' mit falschen 'rsp' Wert. Außerdem sollten Sie sicherstellen, dass der 'rsp' beim Aufruf von' scanf' ausgerichtet ist. Überprüfen Sie dies: http://cs.lmu.edu/~ray/notes/gasexamples/ (sieht kurz genug aus und vielleicht abgeschlossen, durch 4 Sekunden schnellen Blick) – Ped7g

+0

Einige der Kommentare auf, die scheinen, eine ähnliche Frage zu sein, können gefunden werden hier: http://stackoverflow.com/questions/39679848/simple-input-to-output-program-in-assembly –

Antwort

1
leaq -8(%rbp), %rsi 

In dieser Anweisung Sie zum %rbp Register unterschieden werden, aber sie vergessen, es tatsächlich zu initialisieren!

Verwandte Themen