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

rur96b6h  于 2023-01-13  发布在  其他
关注(0)|答案(1)|浏览(134)

在汇编程序中,在0x08048000处加载.text段;.data.bss部分在此之后。
如果我.text段中放置exit系统调用,会发生什么情况?它会导致.data.bss段被解释为导致“不可预测”行为的代码吗?程序何时终止--可能在执行完每条“指令”之后?
不用exit系统调用,我也可以轻松地编写程序,但是测试.data.bss是否得到执行是我不知道的事情,因为我想我必须知道幕后生成的真实的机器代码才能理解这一点。
我认为这个问题更多的是关于“操作系统和CPU如何处理这样的场景?”而不是汇编语言,但它仍然是有趣的汇编程序员等。

bvpmtnay

bvpmtnay1#

处理器并不知道代码在哪里结束,它忠实地执行一条又一条指令,直到执行被重定向到其他地方(例如跳转、调用、中断、系统调用或类似的操作)。
如果代码没有跳转到其他地方就结束了,那么处理器会继续执行内存中代码之后的任何内容。具体会发生什么是相当不可预测的,但最终,代码通常会崩溃,因为它试图执行无效指令或试图访问不允许访问的内存。(通常在.text部分之后的填充中达到00 00字节,在32位x86上解码为add [eax], al。在64位模式下解码为add [rax], al。)
如果两者都没有发生,也没有发生跳转,最终处理器会尝试将未Map的内存或标记为“不可执行”的内存作为代码执行,从而导致分段冲突。在Linux上,这会引发SIGSEGVSIGBUS。如果未处理,这些会终止进程,并有选择地生成核心转储。
如果您感兴趣,可以在调试器下运行并查看出错指令的反汇编。
有关在Linux或Windows的32位或64位x86代码中进行退出系统调用的正确方法,请参见 Nasm segmentation fault on RET in _start

相关问题