assembly - 如果结构体太大而无法放入寄存器,那么就汇编语言而言,该结构体如何按值返回?

标签 assembly x86-64 calling-convention abi return-by-value

在 C++ 中,您可以按值返回用户定义的类型。在x86-64 ASM中,按值返回是通过将返回值移至RAX并将RIP先前存储的值弹出到RIP中以返回给调用者来实现的。如何按值返回大于 RAX 的结构体或任何类型的数组?

最佳答案

SYSV x86_64 调用约定(除 Microsoft 之外的所有人都使用)允许在 RAX/RDX 寄存器对中返回最多 16 字节和 INTEGER 分类的结构,而在XMM0/XMM1 寄存器对。

结构体的分类取决于结构体中字段的类型,但基本上整数和指针类型为 INTEGER,而 float 和 double 为 SSE。

较大的结构将获得 MEMORY 分类,因此需要一个额外的隐藏参数(在 RDI 中传递,因此添加到现有参数之前)指定一个指向将写入返回值的内存的指针。该指针将在 RAX 中返回。

这在 SYSV x86_64 ABI doc 中有详细说明。

关于assembly - 如果结构体太大而无法放入寄存器,那么就汇编语言而言,该结构体如何按值返回?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73032181/

相关文章:

macos - macOS 上的 NASM 间接寻址程序集不正确

c - C 是否标准化了链接器符号命名?

c++ - 为什么 gcc 在按值传递微不足道的结构时会发出不需要的内存访问?

assembly - movzbl(%rdi, %rcx, 1), %ecx 在 x86-64 汇编中是什么意思?

iphone - 如何在 iPhone 上进行内联汇编?

c - 通过 16 位移位实现 32 位乘法

assembly - MASM内联函数

x86 - x86_64 CPU 能否在流水线的同一阶段执行两个相同的操作?

c - 为什么我可以通过带有太多参数的指针来调用函数?

调用约定和语言绑定(bind)