我正在尝试从 ASM 中调用一个函数。我知道如何调用它,但我无法找到如何获取此函数的返回值。一个例子如下:
C代码:
int dummy() {
return 5;
}
(N)ASM 代码:
dummyFunction:
call dummy
;grab return into eax
inc eax ; eax should be 6 now
ret
有任何想法吗?
返回值在eax
. 如果你从 asm 调用了一个 C 函数,你可以从eax
. 如果您尝试从 asm 函数返回到 C,请将预期的返回值存储在eax
.
返回浮点值、值或结构的事情变得有点复杂long long
,所以问问你是否需要它,有人(也许是我)会帮助你。
尽管答案足以回答 OP 的问题,但为了完整起见,这里是DJPP 手册页中涵盖大多数情况的摘录:
返回值
- 整数(大小不超过 32 位)和指针在
%eax
寄存器中返回。- 浮点值在 387 栈顶寄存器中返回,
st(0)
.- 返回类型
long long int
的返回值%edx:%eax
(中最重要的单词%edx
和最不重要的单词%eax
)。- 返回一个结构很复杂而且很少有用;尽量避免它。(请注意,这与返回指向结构的指针不同。)
如果您的函数返回
void
(例如没有值),则不使用这些寄存器的内容。
这取决于平台和调用约定,但通常,eax
如果它是原始类型或指针,则返回值应该已经返回,如果它是浮点类型,则返回值应该已经返回到浮点寄存器中st(0)
,我认为。