Benötigt printf zusätzlichen Stapelspeicher auf dem x86-64? [Duplikat]
Diese Frage hat hier bereits eine Antwort:
Das Drucken von Gleitkommazahlen von x86-64 erfordert anscheinend das Speichern von% rbp 1 AntwortObwohl ich weiß, dass es am besten ist, Compiler-Eigenheiten zu verwenden,printf_chk
, und auch Daten in zu setzen.rodata
Ich bin auf der Suche nach einem tieferen Verständnis der Assemblersprache und interessiere mich für kompakten Code. Da ist etwas dranprintf
Ich verstehe nicht Ich weiß, wo ich die Parameter setzen muss und wie ich sie verwende%al
für varargs, aber es scheint, zusätzlichen Stapelplatz zu erfordern, den ich nicht erklären kann.
Dieses kurze Programm
<code> .text .globl main main: movsd value(%rip), %xmm0 # value to print movl $format, %edi # format string movl $1, %eax # one floating-point arg call printf movl $0, %eax # return 0 from main ret .align 8 value: .double 74.321 format: .asciz "%g\n" </code>
gibt einen segfault.
Wenn ich dem Frame zusätzlichen Stapelspeicher hinzufüge, funktioniert dies jedoch einwandfrei:
<code> .text .globl main main: subq $8, %rsp # ADD SOME STACK SPACE TO FRAME (WHY?) movsd value(%rip), %xmm0 # value to print movl $format, %edi # format string movl $1, %eax # one floating-point arg call printf movl $0, %eax # return 0 from main addq $8, %rsp # REMOVE ADDED STACK SPACE ret .align 8 value: .double 74.321 format: .asciz "%g\n" </code>
Könnte es ein Ausrichtungsproblem sein? Ich habe das gleiche Problem, wennvalue
undformat
sind in einem.rodata
Sektion.)