Czy printf wymaga dodatkowej przestrzeni stosu na x86-64? [duplikować]

To pytanie ma już tutaj odpowiedź:

Wydrukowanie liczb zmiennoprzecinkowych z x86-64 wydaje się wymagać zapisania% rbp 1 odpowiedź

Chociaż wiem, że najlepiej jest używać kompilatora intrinsics, a co za tym idzie,printf_chk, a także do wprowadzania danych.rodata sekcje, szukam głębszego zrozumienia języka asemblera i interesuje mnie kod kompaktowy. Coś w tym jestprintf Nie rozumiem. Wiem, gdzie umieścić parametry i wiem, jak używać%al dla varargów, ale wydaje się, że wymaga dodatkowego miejsca na stos, którego nie mogę rozliczyć.

Ten krótki program

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

daje segfault.

Jednak gdy dodam dodatkowe miejsce na stos do ramki, działa to poprawnie:

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

Czy może to być problem z wyrównaniem? (Dostaję ten sam problem, kiedyvalue iformat są w.rodata Sekcja.)

questionAnswers(1)

yourAnswerToTheQuestion