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

最佳答案

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

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

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

关于assembly - eax如何存储大小大于4个字节的返回值?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9784820/

10-15 12:54