¿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 respuestaSi 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.)