12

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

C代码:

int dummy() {  
    return 5;  
}  

(N)ASM 代码:

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

有任何想法吗?

4

3 回答 3

17

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

返回浮点值、值或结构的事情变得有点复杂long long,所以问问你是否需要它,有人(也许是我)会帮助你。

于 2011-05-29T23:50:17.757 回答
10

尽管答案足以回答 OP 的问题,但为了完整起见,这里是DJPP 手册页中涵盖大多数情况的摘录:

返回值

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

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

于 2014-09-13T14:37:53.370 回答
2

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

于 2011-05-29T23:51:16.117 回答