如何是一个结构返回值,在汇编语言方面,如果该结构太大,不适合在寄存器?



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

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

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

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

这些都在SYSV x86_64 ABI文档

中有详细说明

相关内容

最新更新