为什么 `main` 以 `ret` 而不是 `ret 4` 结尾?
Why does `main` end with `ret` and not `ret 4`?
考虑以下空 C 程序(标准保证编译器执行隐式 return 0
):
int main(int argc, char* argv[]) {}
您可以将任何逻辑添加到此函数中以操纵 argc
和 argv
。然而,当 main
完成时,其汇编代码将只执行简单的 ret
而不是 ret 4
。我期待看到 ret 4
因为在我看来 main
是其他函数的调用者,因此必须从堆栈中清除它的两个参数:和 int 以及指向 char 数组的指针。为什么不这样做?
大多数编译器选择让调用者从堆栈中清除参数;一种可以追溯到早期 C 编译器和处理参数数量的传统。在调用点,编译器知道它压入了多少,因此调整堆栈是微不足道的。
另外,请注意,历史上 main 可以使用 0-3(arge)参数指定。同样,调用者(例如 _start)可以只提供 3 并让实施者选择。
考虑以下空 C 程序(标准保证编译器执行隐式 return 0
):
int main(int argc, char* argv[]) {}
您可以将任何逻辑添加到此函数中以操纵 argc
和 argv
。然而,当 main
完成时,其汇编代码将只执行简单的 ret
而不是 ret 4
。我期待看到 ret 4
因为在我看来 main
是其他函数的调用者,因此必须从堆栈中清除它的两个参数:和 int 以及指向 char 数组的指针。为什么不这样做?
大多数编译器选择让调用者从堆栈中清除参数;一种可以追溯到早期 C 编译器和处理参数数量的传统。在调用点,编译器知道它压入了多少,因此调整堆栈是微不足道的。
另外,请注意,历史上 main 可以使用 0-3(arge)参数指定。同样,调用者(例如 _start)可以只提供 3 并让实施者选择。