我想知道使用 gcc 为 x86 平台编译的 C 程序中的函数调用从头到尾需要多少条指令。
问问题
1447 次
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-args
and -Os
(或-mpreferred-stack-boundary=2
,或 64 位上的 3),那么开销正好是push
每个参数字大小的参数一个,一个call
,一个add
用于在返回后调整堆栈指针。
没有-mno-accumulate-outgoing-args
和使用默认的 16 字节堆栈对齐,gcc 生成的代码速度大致相同,但对于函数调用来说大约是 5 倍大,没有充分的理由。
于 2011-03-25T18:59:13.340 回答