O printf requer espaço adicional na pilha no x86-64? [duplicado]

Esta questão já tem uma resposta aqui:

Imprimir números de ponto flutuante de x86-64 parece exigir que% rbp seja salvo 1 resposta

Embora eu saiba que é melhor usar intrínsecos do compilador e, nesse caso,printf_chk, e também para colocar dados em.rodata seções, estou olhando para ganhar uma compreensão mais profunda da linguagem assembly e estou interessado em código compacto. Há algo sobreprintf Eu não entendo Eu sei onde colocar os parâmetros e sei usar%al para varargs, mas parece que requer espaço de pilha adicional que não posso explicar.

Este programa curto

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

dá um segfault.

No entanto, quando adiciono mais espaço de pilha ao quadro, ele funciona bem:

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

Poderia ser uma questão de alinhamento? (Eu recebo o mesmo problema quandovalue eformat estão em um.rodata seção.)

questionAnswers(1)

yourAnswerToTheQuestion