在 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/