eax存储返回值的大小如何大于4个字节?

wan*_*jie 7 assembly return-value cpu-registers

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

sam*_*var 12

调用者和被调用者必须就寄存器和堆栈包含的内容达成一致.这称为调用约定,它是称为应用程序二进制接口(ABI)的更大概念的一部分.被调用者定义了它是如何被调用的(,参数是否需要在堆栈上,寄存器中等),并且编译器确保它生成的代码符合调用约定.

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

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