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