EAX在32位平台上用于存储函数的返回值,我想知道如果函数的返回值的大小大于4个字节,eax如何处理?在这种情况下,操作系统可以将返回值保存在堆栈上,并将堆栈地址存储在EAX中,但是操作系统如何判断EAX中存储的值是返回值的地址还是实际上是返回值本身呢?
调用者和被调用者必须就寄存器和堆栈包含的内容达成一致。这被称为调用约定 http://en.wikipedia.org/wiki/X86_calling_conventions,这是一个更大概念的一部分,称为应用程序二进制接口 (ABI) http://en.wikipedia.org/wiki/Application_Binary_Interface。被调用者定义它想要如何被调用(ie.参数是否需要位于堆栈上、寄存器中等),并且编译器确保它生成的代码符合调用约定。
至于你的具体问题,这取决于ABI。有时如果返回值大于4字节但不大于8字节,可以分为EAX和EDX。但大多数时候,调用函数只会分配一些内存(通常在堆栈上)并将指向该区域的指针传递给被调用函数。
另请注意,操作系统的作用并不像您想象的那么重要。具有不同调用约定的二进制文件可以共存于同一系统上,并且二进制文件甚至可以在内部使用不同的调用约定。仅当二进制文件调用其系统库时,操作系统的 ABI 才重要。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)