如果汇编程序中没有退出系统调用会发生什么?

时间:2018-04-05 13:49:06

标签: linux assembly operating-system termination

在装配程序中,.text已加载到0x08048000。之后是.data.bss部分。

如果我没有在exit部分放置.text系统调用,会发生什么?是否会导致.data.bss被解释为导致“不可预测”结果的代码?程序何时终止 - 可能在执行每条“指令”之后?

我可以轻松地编写一个没有exit系统调用的程序,但测试.data.bss是否会被执行是我仍然不知道的事情,因为我想我必须知道在引擎盖下生成的真实机器代码来模拟它。

我认为这个问题更多的是关于CPU和操作系统如何处理这种场景而不是汇编语言。

1 个答案:

答案 0 :(得分:8)

处理器不知道代码的结束位置。它忠实地执行一个接一个的指令,直到执行被重定向到其他地方(例如通过跳转,调用,中断,系统调用或类似操作)。如果您的代码在没有跳转的情况下结束,则处理器会继续执行代码后的内存中的任何内容。究竟发生了什么是相当不可预测的,但最终,您的代码通常会崩溃,因为它会尝试执行无效指令或尝试访问不允许访问的内存。如果两者都没有发生并且没有发生跳转,则最终处理器尝试执行未映射的内存或标记为“不可执行”的内存作为代码,从而导致分段违规。在Linux上,这会引发SIGSEGVSIGBUS。未处理时,这些会终止您的流程,并可选择生成核心转储。