gpt4 book ai didi

c - C 编译器如何在 ASM 中处理函数的结构返回值

转载 作者:太空狗 更新时间:2023-10-29 14:56:10 24 4
gpt4 key购买 nike

当谈到C函数的返回值时,返回值存储在EAX寄存器中。假设我们正在谈论 32 位寄存器,整数是受欢迎的,但是当我们返回这些类型时会发生什么:long longlong double,大于32bit的struct/union

最佳答案

在常见的 x86 调用约定中,适合两个寄存器的对象在 RDX:RAX 中返回。这是相同的寄存器对,它是 div 和 mul 指令以及 cdq/cqo 的隐式输入/输出(将 e/rax 符号扩展到 e/rdx)。

i386 Linux (SysV) 调用约定仅以这种方式返回 64 位整数。结构(甚至由单个 int32_t 组成的结构)使用隐藏参数方法而不是打包 eaxedx:eax。 64 位 Linux 和 Microsoft 当前的标准 __vectorcall,都将结构打包到 e/raxe/rdx:e/rax 中。

许多调用约定通过添加隐藏的额外参数来处理较大的对象:指向用于存储返回值的空间的指针。有关您正在使用的特定 ABI,请参阅 ABI 文档。 (链接位于 wiki)。


与评论中讨论的其他调用约定(例如隐式使用堆栈上的空间来存储返回的大对象)相比,传递指针可以保存副本,因为指针可以指向最终目的地而不是暂存空间堆栈。

但通常仅当最终目的地在堆栈上时。被调用者可以假设返回值对象是不是相同的对象,因为/没有别名任何全局或它可以通过指针到达的任何内存。即调用者必须进行逃逸分析。参见 What prevents the usage of a function argument as hidden pointer? - 在 C 抽象机中,返回值对象直到函数返回的那一刻才被写入,在它完成读取任何内容之后。

但它可以指向调用者栈帧中任何方便的位置,而不是相对于 RSP 的固定位置,这样可以避免复制。

关于c - C 编译器如何在 ASM 中处理函数的结构返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24741218/

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