1

我想知道使用 gcc 为 x86 平台编译的 C 程序中的函数调用从头到尾需要多少条指令。

4

4 回答 4

3
  • 写一些代码。
  • 编译它。
  • 拆机看看。
  • 计算指令。

当您改变参数的数量和类型、调用约定等时,答案会有所不同。

于 2011-03-25T16:05:44.437 回答
1

我希望至少有一个

CALL Function

当然,除非它是内联的。

于 2011-03-25T18:24:05.850 回答
1

这是一个非常棘手的问题,很难回答,而且可能会有所不同。

首先在调用者中需要传递参数,这取决于类型,这会有所不同,在大多数情况下,每个参数都有一个推送指令。

然后,在被调用的过程中,第一条指令将是为局部变量进行分配。这通常在 3 个操作中完成:

PUSH EBP
MOV EBP, ESP
SUB ESP, xxx

之后您将获得该函数的汇编代码。

在代码之后但在返回之前,ebp 和 esp 将被恢复:

MOV ESP, EBP
POP EBP

最后,您将有一个ret指令,根据调用约定将释放堆栈的参数,或者将其留给调用者。您可以分别确定RET是使用数字作为参数还是参数为 0。如果参数为 0,您将在CALL指令之后在调用者中使用POP指令。

于 2011-03-25T16:16:39.250 回答
1

如果您使用-mno-accumulate-outgoing-argsand -Os(或-mpreferred-stack-boundary=2,或 64 位上的 3),那么开销正好是push每个参数字大小的参数一个,一个call,一个add用于在返回后调整堆栈指针。

没有-mno-accumulate-outgoing-args和使用默认的 16 字节堆栈对齐,gcc 生成的代码速度大致相同,但对于函数调用来说大约是 5 倍大,没有充分的理由。

于 2011-03-25T18:59:13.340 回答