我想知道从开始到结束使用gcc为x86平台编译的C程序中函数调用需要多少指令。
答案 0 :(得分:3)
当你改变参数的数量和类型,调用约定等时,答案会有所不同。
答案 1 :(得分:1)
这是一个非常棘手的问题,很难回答,而且可能会有所不同。
首先,在调用者中需要传递参数,具体取决于类型的变化,在大多数情况下,每个参数都有一个 push 指令。
然后,在被调用的过程中,第一条指令将是为局部变量进行分配。这通常在3个操作中完成:
PUSH EBP
MOV EBP, ESP
SUB ESP, xxx
之后您将拥有该功能的汇编代码。
在代码之后但返回之前,将恢复ebp和esp:
MOV ESP, EBP
POP EBP
最后,您将有一个 ret 指令,根据调用约定,它将处理堆栈的参数,或者将其留给调用者。如果 RET 分别带有数字作为参数或参数为0,则可以确定此项。如果参数为0,则在 CALL 指令后,您将在调用者中有 POP 指令。
答案 2 :(得分:1)
我希望至少有一个
CALL Function
当然,除非内联。
答案 3 :(得分:1)
如果您使用-mno-accumulate-outgoing-args
和-Os
(或-mpreferred-stack-boundary=2
或者64位上的3),则每个参数字大小的参数的开销正好是push
,一个call
和一个add
在返回后调整堆栈指针。
没有-mno-accumulate-outgoing-args
并且默认的16字节堆栈对齐,gcc生成的代码速度大致相同,但大约是函数调用的五倍,这是没有充分理由的。