在汇编程序中,.text
部分加载到0x08048000
; .data
和 .bss
部分紧随其后。
如果我不在.text
部分放置一个exit
系统调用会发生什么?它会导致 .data
和 .bss
部分被解释为导致“不可预测”行为的代码吗?程序什么时候终止——可能是在每条“指令”执行完之后?
我可以在没有 exit
系统调用的情况下轻松编写程序,但是我不会测试 .data
和 .bss
是否被执行不知道,因为我想我必须知道在后台生成的真实机器代码才能理解这一点。
我认为这个问题更多的是关于“操作系统和 CPU 将如何处理这种情况?”比汇编语言,但对于汇编程序员等来说仍然很有趣。
最佳答案
处理器不知道您的代码在哪里结束。它忠实地执行一条又一条指令,直到执行被重定向到别处(例如通过跳转、调用、中断、系统调用或类似方式)。如果你的代码没有跳到别处就结束了,处理器会继续执行代码之后内存中的任何内容。究竟发生了什么是相当不可预测的,但最终,您的代码通常会崩溃,因为它试图执行无效指令或试图访问不允许访问的内存。如果两者都没有发生并且没有发生跳转,最终处理器会尝试将未映射的内存或标记为“不可执行”的内存作为代码执行,从而导致分段违规。在 Linux 上,这会引发 SIGSEGV
或 SIGBUS
。如果未处理,这些将终止您的进程并可选择生成核心转储。
关于linux - 如果汇编程序中没有退出系统调用会怎样?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49674026/