退出程序x86

时间:2015-09-05 16:32:19

标签: assembly x86 stack exit pop

我正在学习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指令是程序的结束?

2 个答案:

答案 0 :(得分:2)

从正常的C运行时初始化函数调用

main()。用任何语言(包括asm)编写main与编写任何其他函数没有什么不同。

执行从_start开始。如果您编写自己的_start,则无需返回,因此您需要进行exit(2)系统调用。 (或段错误。)

这个问题来自不同角度的问题,但my answer对另一个最近的问题进行了详细介绍。

与往常一样,单步使用调试器是查看正在发生的事情并测试您的理解的好方法。

答案 1 :(得分:1)

该过程被操作系统终止。如果你看到一个返回指令,那么在你的函数之前会有一个(&#34; hidden&#34;)函数,然后再执行它。

在Linux(32位)环境中终止进程的一种方法是调用特定的系统调用:sys_exit

flexbox

这可能是你的功能之前的功能。上面的代码指针返回操作系统,然后退出您的进程。