在汇编程序中,在0x08048000
处加载.text
段;.data
和.bss
部分在此之后。
如果我不在.text
段中放置exit
系统调用,会发生什么情况?它会导致.data
和.bss
段被解释为导致“不可预测”行为的代码吗?程序何时终止--可能在执行完每条“指令”之后?
不用exit
系统调用,我也可以轻松地编写程序,但是测试.data
和.bss
是否得到执行是我不知道的事情,因为我想我必须知道幕后生成的真实的机器代码才能理解这一点。
我认为这个问题更多的是关于“操作系统和CPU如何处理这样的场景?”而不是汇编语言,但它仍然是有趣的汇编程序员等。
1条答案
按热度按时间bvpmtnay1#
处理器并不知道代码在哪里结束,它忠实地执行一条又一条指令,直到执行被重定向到其他地方(例如跳转、调用、中断、系统调用或类似的操作)。
如果代码没有跳转到其他地方就结束了,那么处理器会继续执行内存中代码之后的任何内容。具体会发生什么是相当不可预测的,但最终,代码通常会崩溃,因为它试图执行无效指令或试图访问不允许访问的内存。(通常在
.text
部分之后的填充中达到00 00
字节,在32位x86上解码为add [eax], al
。在64位模式下解码为add [rax], al
。)如果两者都没有发生,也没有发生跳转,最终处理器会尝试将未Map的内存或标记为“不可执行”的内存作为代码执行,从而导致分段冲突。在Linux上,这会引发
SIGSEGV
或SIGBUS
。如果未处理,这些会终止进程,并有选择地生成核心转储。如果您感兴趣,可以在调试器下运行并查看出错指令的反汇编。
有关在Linux或Windows的32位或64位x86代码中进行退出系统调用的正确方法,请参见 Nasm segmentation fault on RET in _start。