哪里是主要的ret指令

时间:2017-11-16 17:49:10

标签: c assembly x86 return

我在本书中学习了汇编(x86)全局如何工作:"从头开始编程"。 在本书中,每个程序都会以退出的中断调用结束。

然而,在C编译程序中,我发现程序以ret结束。这假设有一个要弹出的地址,这将导致程序结束。

所以我的问题是: 这是什么地址? (那里的代码是什么?)

2 个答案:

答案 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