c++ - x86-64 调用约定中的返回值

标签 c++ linux assembly x86-64 abi

  1. 如果我编写一个返回 void 的函数,根据 x86-64 约定调用,我会破坏 rax/eax 吗?
  2. 关于返回 double 值的函数的类似问题(因为真正的返回将发生在 xmm0 中)
  3. 如果我执行 movq xmm0 -> rax.然后我得到一个可以放入的数字

    union { 
        int, 
        double
    };
    

    通过 int.然后当我读完 double 时,我得到了预期的 double 值。我的行为有哪些陷阱?

最佳答案

rax是暂存寄存器,并且 double属于 SSE 类,因此它在 xmm0 中返回/xmm1 。这些记录在 SysV ABI 中。没有什么可以阻止您使用 xmm0在将返回值放入其中之前作为草稿。 x86 tag wiki 中有指向 ABI 文档的链接。 .

要回答#3,我们需要查看您的代码。也许是 C++ 中的 UB,或者您的汇编是错误的。

关于c++ - x86-64 调用约定中的返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40741395/

相关文章:

程序集 x86 NULL 终止符 (TASM)

c - 如何在程序集中访问 C 结构值?

c++ - 消除可变类层次结构中无参数函数调用的歧义

linux - 在文件夹中具有读/写/执行权限但无法 cd 进入的组中

c++ - 使用 C++ 进行 Linux 编程

linux - Bash 脚本捕获信号但之后等待进程终止

c++ - 在 C++ 或程序集 (FASM) 中将原始字节转换为十六进制

c++ - 用新 vector 中的对应值替换 vector 中的所有奇数值

c++ - 使用 IwGxFontDrawText 显示西里尔字体

c++ - C++ 中的数据处理