【问题标题】:Return value of a C function to ASM将 C 函数的值返回给 ASM
【发布时间】:2011-09-04 11:56:25
【问题描述】:

我正在尝试从 ASM 中调用一个函数。我知道如何调用它,但我无法找到如何获取此函数的返回值。一个例子如下:

C 代码:

int dummy() {  
    return 5;  
}  

(N)ASM 代码:

dummyFunction:
    call dummy
    ;grab return into eax
    inc eax ; eax should be 6 now
    ret  

有什么想法吗?

【问题讨论】:

  • 你遇到了什么“麻烦”?
  • 确实,告诉我们出了什么问题...
  • @R.. 我认为他的问题只是,他不知道 eax 已经正确设置。

标签: c assembly nasm osdev


【解决方案1】:

返回值在eax。如果你从 asm 调用了一个 C 函数,你可以从 eax 读取返回值。如果您尝试从 asm 函数返回到 C,请将预期的返回值存储在 eax 中。

返回浮点值、long long 值或结构的情况会稍微复杂一些,因此请询问您是否需要,有人(也许是我)会帮助您。

【讨论】:

    【解决方案2】:

    尽管答案足以回答 OP 的问题,但为了完整起见,这里有一个涵盖大多数情况的摘录来自 DJPP's manpage

    返回值

    • %eax 寄存器中返回整数(大小不超过 32 位)和指针。
    • 在 387 栈顶寄存器 st(0) 中返回浮点值。
    • long long int 类型的返回值在 %edx:%eax 中返回(%edx 中的最高有效字和%eax 中的最低有效字)。
    • 返回结构很复杂而且很少有用;尽量避免它。 (请注意,这与返回指向结构的指针不同。)

    如果您的函数返回void(例如没有值),则不会使用这些寄存器的内容。

    【讨论】:

      【解决方案3】:

      这取决于平台和调用约定,但通常情况下,如果是原始类型或指针,返回值应该已经在eax中返回,如果是浮点类型,则返回值应该在浮点寄存器st(0)中,我想。

      【讨论】:

      • +1 是的,如果是浮点类型,则通过st(0)返回;看我的回答。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-09-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多