【问题标题】:How can eax store return value of which size is bigger than 4 bytes?eax如何存储大于4字节的返回值?
【发布时间】:2012-04-04 19:16:30
【问题描述】:

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

【问题讨论】:

标签: assembly return-value cpu-registers


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2016-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-10
    • 2021-05-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多