此问题在此处已有答案:
C++ on x86-64: when are structs/classes passed and returned in registers?(2个答案)
How does System V amd64 handle very long return values?(1个答案)
How are C structs returned [duplicate](1个答案)
How are oversized struct returned on the stack?(2个答案)
how C compiler treats a struct return value from a function, in ASM(2个答案)
四个月前关门了。
在C++中,你可以通过值返回一个用户定义的类型。在x86-64中,ASM通过值返回是通过将返回值移动到RAX并将RIP的先前存储的值弹出到RIP中返回给调用者来实现的。如何通过值返回一个结构体或任何比RAX更大的数组类型?
1条答案
按热度按时间krugob8w1#
SYSV x86_64调用约定(除Microsoft外,所有人都使用)允许在RAX/RDX寄存器对中返回最多16字节的结构和INTEGER分类,而在XMM 0/XMM 1寄存器对中返回SSE分类和最多32字节的结构。
结构体的分类取决于结构体中字段的类型,但基本上整型和指针类型是INTEGER,而浮点型和双精度型是SSE。
更大的结构体将获得MEMORY分类,因此将需要额外的隐藏参数(在RDI中传递,因此在现有参数之前),指定指向返回值将写入的内存的指针。该指针将在RAX中返回。
SYSV x86_64 ABI doc中对此进行了详细说明