32位平台用EAX来存储函数的返回值,我只是想知道一个函数的返回值的大小是否大于4个字节,eax是如何处理的?在这种情况下,操作系统可以将返回值保存在堆栈中并将堆栈地址存储在 EAX 中,但是操作系统如何判断存储在 EAX 中的值是返回值的地址还是实际上是返回值本身?
最佳答案
调用者和被调用者必须就寄存器和堆栈包含的内容达成一致。这称为 calling convention ,这是一个名为 application binary interface (ABI) 的更大概念的一部分。 .被调用者定义了它希望如何被调用(即参数是否需要在堆栈上、寄存器中等),编译器确保它生成的代码符合调用约定。
至于你的具体问题,这取决于 ABI。有时如果返回值大于4个字节但不大于8个字节,可以拆分为EAX和EDX。但大多数情况下,调用函数只会分配一些内存(通常在堆栈上)并将指向该区域的指针传递给被调用函数。
另请注意,操作系统的作用并不像您想象的那么重要。具有不同调用约定的二进制文件可能共存于同一个系统中,并且二进制文件甚至可以在内部使用不同的调用约定。操作系统的 ABI 仅在二进制文件调用其系统库时才重要。
关于assembly - eax 如何存储大于 4 个字节的返回值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9784820/