【发布时间】:2014-09-04 15:30:20
【问题描述】:
说到C函数的返回值,返回值存放在EAX寄存器中。假设我们谈论的是 32 位寄存器,欢迎使用整数,但是当我们返回这些类型时会发生什么:
long long,long double,大于 32 位的 struct/union。
【问题讨论】:
-
哪个 ABI ? Linux,Windows,其他? 32位还是64位?
-
对于
struct返回类型,典型的解决方案是调用者 为对象提供空间,例如,在EBX 中传递一个指向该空间的指针,或者有约定,该空间在函数调用之前位于堆栈的末尾,等等。然后被调用者将返回值写入该空间。 -
如果返回值的大小不小(例如大于 4 字节的 32 位机器),则编译器可以在参数列表中添加“额外”参数并通过指针返回值。或者使用堆栈,这取决于实现。
-
@Medals:调用者在调用范围内分配一个缓冲区,并将指向该缓冲区的指针作为参数传递给被调用者。
-
返回值存储在 x86 中的 eax 或 edx:eax 和 x86_64 中的 rax 或 rdx:rax 中,而不是 ebx
标签: c function assembly x86 return