为什么`main`以`ret`而不是`ret 4'结束?

时间:2017-10-29 13:00:28

标签: c disassembly calling-convention

考虑以下空C程序(标准保证编译器执行隐式return 0):

int main(int argc, char* argv[]) {}

您可以在此函数中添加任何逻辑来操作argcargv。然而,当main完成时,其汇编代码只会执行一个简单的ret而不是ret 4。我期待看到ret 4,因为在我看来main是其他函数的被调用者,因此必须从堆栈中清除它的两个参数:int和指向char数组的指针。为什么不这样做?

1 个答案:

答案 0 :(得分:0)

大多数编译器选择让调用者清理堆栈中的参数;一个传统,可以追溯到早期的C编译器和处理多个参数。在调用站点,编译器知道它推送了多少,因此调整堆栈是微不足道的。

另外,请注意,历史上可以使用0-3(arge)参数指定main。同样,调用者(例如_start)可以只提供3并让实现者选择。