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?
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
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
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 –