c - 为什么 `main` 以 `ret` 而不是 `ret 4` 结尾?

标签 c disassembly calling-convention

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

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

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

最佳答案

大多数编译器选择让调用者从堆栈中清除参数;一种可以追溯到早期 C 编译器和处理参数数量的传统。在调用点,编译器知道它压入了多少,因此调整堆栈对它来说是微不足道的。

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

关于c - 为什么 `main` 以 `ret` 而不是 `ret 4` 结尾?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47000454/

相关文章:

r - 如何在 C 中使用 Rmath.h 中的多项式函数

python - 如何查看 Python 文件的汇编代码?

c# - 反编译.Net代码: lambda expressions

c - __stdcall 名称修饰的语法是什么?

assembly - Linux 上的 x86 32 位汇编中的函数调用如何工作?

c++ - cmake多库场景

c - 具有多个定义的不透明结构

c++ - 为什么要在 C++ 函数中最后添加默认参数?

c - C 中退出 while 循环

c - MIPS 可执行文件/目标文件格式