函数调用和汇编

时间:2014-09-30 19:56:32

标签: c assembly call function-calls function-call

我试图理解程序如何使用汇编x86代码进行函数调用(使用C语义)。任何帮助将不胜感激。

我找不到任何来源专门回答这个问题。

2 个答案:

答案 0 :(得分:3)

在x86中,有一个名为callret的指令可以执行此操作。 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约定。