我正在学习x86程序集。我想了解"退出计划"适用于x86。我们有一个代码:
// stringstream::str
#include <string> // std::string
#include <iostream> // std::cout
#include <sstream> // std::stringstream, std::stringbuf
#include <vector>
using namespace std;
int main ()
{
vector <string> V;
V.clear();
std::string str;
getline( std::cin, str );
std::stringstream ss;
ss<<str;
std::string s,s1;
while(ss>>s)
{
V.push_back(s);
}
return 0;
}
当处理器执行指令&#34; ret&#34; :
EIP将具有从堆栈中弹出的值,换句话说就是0。
所以处理器将转到0地址并尝试执行指令...它不包含程序代码/可执行代码。
那么,处理器究竟发生了什么?是否有条件检查,例如push ebp
mov ebp,esp
//Some stuff here
mov esp, ebp
pop ebp
ret
if EIP = 0 -> exit program?
`处理器如何理解此RET指令是程序的结束?
答案 0 :(得分:2)
main()
。用任何语言(包括asm)编写main
与编写任何其他函数没有什么不同。
执行从_start
开始。如果您编写自己的_start
,则无需返回,因此您需要进行exit(2)
系统调用。 (或段错误。)
这个问题来自不同角度的问题,但my answer对另一个最近的问题进行了详细介绍。
与往常一样,单步使用调试器是查看正在发生的事情并测试您的理解的好方法。
答案 1 :(得分:1)
该过程被操作系统终止。如果你看到一个返回指令,那么在你的函数之前会有一个(&#34; hidden&#34;)函数,然后再执行它。
在Linux(32位)环境中终止进程的一种方法是调用特定的系统调用:sys_exit
flexbox
这可能是你的功能之前的功能。上面的代码指针返回操作系统,然后退出您的进程。