gpt4 book ai didi

assembly - printf 在 x86-64 上是否需要额外的堆栈空间?

转载 作者:行者123 更新时间:2023-12-02 19:22:58 25 4
gpt4 key购买 nike

虽然我知道最好使用编译器内在函数,就此而言,printf_chk ,并将数据放入 .rodata部分,我希望更深入地了解汇编语言,并对紧凑的代码感兴趣。有一些关于printf的事情我不明白。我知道参数放在哪里,我知道如何使用%al对于可变参数,但它似乎需要额外的堆栈空间,我无法解释。

这个小节目

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

出现段错误。

但是,当我向框架添加额外的堆栈空间时,它工作正常:

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

这可能是对齐问题吗? (当 valueformat 位于 .rodata 部分时,我遇到同样的问题。)

最佳答案

根据 www.x86-64.org/documentation/abi.pdf 以及 Microsoft 的 http://msdn.microsoft.com/en-us/library/ms235286(v=vs.80).aspx,堆栈必须是 16 字节对齐的

关于assembly - printf 在 x86-64 上是否需要额外的堆栈空间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10324333/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com