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