¿Printf requiere espacio de pila adicional en el x86-64? [duplicar]

Esta pregunta ya tiene una respuesta aquí:

La impresión de números de coma flotante desde x86-64 requiere que se guarde% rbp 1 respuesta

Si bien sé que es mejor usar los intrínsecos del compilador, y para el caso,printf_chk, y también para poner datos en.rodata En las secciones, estoy pensando en obtener una comprensión más profunda del lenguaje ensamblador y estoy interesado en el código compacto. Hay algo acerca deprintf No entiendo. Sé dónde poner los parámetros, y sé cómo usarlos.%al para varargs, pero parece que requiere espacio de pila adicional que no puedo explicar.

Este corto programa

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

Da un segfault.

Sin embargo, cuando agrego espacio de pila adicional al marco, funciona bien:

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

¿Podría ser un problema de alineación? (Me sale el mismo problema cuandovalue yformat están en un.rodata sección.)

Respuestas a la pregunta(1)

Su respuesta a la pregunta