我在本书中学习了汇编(x86)全局如何工作:"从头开始编程"。 在本书中,每个程序都会以退出的中断调用结束。
然而,在C编译程序中,我发现程序以ret结束。这假设有一个要弹出的地址,这将导致程序结束。
所以我的问题是: 这是什么地址? (那里的代码是什么?)
答案 0 :(得分:4)
您可以通过要求操作系统将控制权转移到程序的开始或 _start 功能来启动程序,方法是跳转到该标签你的代码。在C程序中, start 函数来自C库,并且(正如其他人之前已经说过的那样)执行一些特定于平台的环境初始化。然后启动功能调用 main ,控件就是你的。从主返回后,它会将控制权传递回正确终止程序的C库,并执行特定于平台的系统调用以将控制权返还给 OS 即可。
因此地址主要pop是来自C库的标签。如果你想检查它,它应该在 stdlib.h (cstdlib)中,你会看到它调用退出进行清理。
它的功能是在程序终止或线程终止时破坏静态对象(当然是C ++)(C ++ 11)。在C情况下,它只关闭流,刷新缓冲区,调用atexit函数并执行系统调用。
我希望这是你寻求的答案。
答案 1 :(得分:2)
这是特定于实施的。
在Linux上,crt0调用main
,_start
入口点分析内核设置的初始call stack,解释execve(2)系统调用你的可执行程序。从main
返回时,crt0的结尾部分正在处理atexit(3)个已注册的函数并刷新 stdio 。
FWIW,crt0
由您的GCC编译器提供,也许是您的C标准库。所有这些(使用Linux内核)都是Linux发行版上的免费软件。
每个程序都以中断调用结束退出。
不是真的。它是system call(其列表请参见syscalls(2)),而不是interrupt。另请参阅this。