我试图理解程序如何使用汇编x86代码进行函数调用(使用C语义)。任何帮助将不胜感激。
我找不到任何来源专门回答这个问题。
答案 0 :(得分:3)
在x86中,有一个名为call
和ret
的指令可以执行此操作。 call
将当前地址存储在堆栈上,将jmp存储为作为参数传递的标签。并且名为ret
的指令会弹出此地址,并在向该地址添加一个字节后跳转到该地址。
代码示例:
<强> C 强>
int sum(int a, int b)
{
return a + b;
}
void f(void)
{
sum(2, 2);
g();
}
编译器可能会生成(x86-assembly-like example):
f:
push 2
push 2
call sum
call g
ret
sum:
pop eax
pop ebx
add eax, ebx
ret
我希望它有所帮助
答案 1 :(得分:0)
过去,我对以下资源运气不错。
如果您正在寻找如何将函数调用转换为汇编,请在上面的链接中查找__cdecl
调用约定。基本上,不同的调用约定指定了通过操纵堆栈来传递参数的不同(并且不总是标准化)方式,而__cdecl
只是其中一种方式 - &#34; C&#34;召集会议。
如果您想知道如何从汇编代码中调用C函数,那么最后两个链接非常好。
我可以给出的另一个建议是,如果你有一个要从C调用的汇编函数,请在C中的函数声明中指定调用约定。例如,我曾经在{{{{{{{ 1}}调用约定而不是__stdcall
,所以在函数签名中我明确指定了__cdecl
约定。