2012-03-20 30 views
7

EAX用于在32位平台中存储函数的返回值,我只是想知道函数返回值的大小是否大于4字节,eax如何处理它?在这种情况下,OS可以将返回值保存在堆栈中,并将堆栈的地址存储在EAX中,但OS如何判断存储在EAX中的值是返回值的地址还是实际上是返回值本身?eax存储返回值大于4字节的返回值如何?

+0

请参阅此问题的答案:http://stackoverflow.com/questions/2155730/how-do-c-compilers-implement-functions-that-return-large-structures – 2012-03-20 10:21:42

回答

12

调用者和被调用者必须就寄存器和堆栈包含的内容达成一致。这被称为calling convention,这是一个更大的概念称为application binary interface (ABI)的一部分。被调用者定义了它的调用方式(参数是否需要在堆栈中,寄存器等中),编译器确保它生成的代码符合调用约定。

至于你的具体问题,它取决于ABI。有时如果返回值大于4字节但不大于8字节,则可以将其分割为EAX和EDX。但大多数时候调用函数只会分配一些内存(通常在堆栈上)并将指向该区域的指针传递给被调用的函数。

请注意,操作系统的作用并不像您想象的那么重要。具有不同调用约定的二进制文件可以共存于同一个系统上,并且二进制文件甚至可以在内部使用不同的调用约定。操作系统的ABI只有在二进制调用其系统库时才是重要的。