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 Antwort

Obwohl 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.)

Antworten auf die Frage(1)

Ihre Antwort auf die Frage