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
.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"
daje segfault.
Jednak gdy dodam dodatkowe miejsce na stos do ramki, działa to poprawnie:
.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"
Czy może to być problem z wyrównaniem? (Dostaję ten sam problem, kiedyvalue
iformat
są w.rodata
Sekcja.)