【发布时间】:2018-09-15 08:59:00
【问题描述】:
在汇编程序中,.text 部分在0x08048000 处加载; .data 和 .bss 部分紧随其后。
如果我不在.text 部分中放置exit 系统调用会怎样?它会导致.data 和.bss 部分被解释为导致“不可预测”行为的代码吗?程序什么时候终止——可能是在每个“指令”执行之后?
我可以在没有exit 系统调用的情况下轻松编写程序,但测试.data 和.bss 是否被执行是我不知道的,因为我想我必须知道生成的真实机器代码了解这一点。
我认为这个问题更多的是关于“操作系统和 CPU 将如何处理这种情况?”比汇编语言,但对于汇编程序员等来说,了解它仍然很有趣。
【问题讨论】:
-
执行将继续到您的代码之后的任何内容,是的。这可能迟早会遇到无效指令,或者您将遇到未映射的内存。如果你非常幸运,你可能会遇到一个无害的无限循环,在这种情况下你的程序不会终止。
-
@Jester 我会说赢得彩票的机会比陷入无休止的循环要多。
-
@TonyTannous 我确实说过“非常幸运”:D 但是,您可以使用 2 个字节在 x86 中进行无限循环,并假设随机内存内容已经比我知道的任何彩票都好。不幸的是,您可能会遇到一些零字节而不是随机的,那就是 x86 上的
add al, [eax],这可能会出错。 -
作为记录,
00 00解码为add [eax], al:内存 destination,而不是内存源,因此 EAX(或 64 位代码中的 RAX)必须指向在可写内存中,但重复执行不会改变地址的低字节。
标签: linux assembly operating-system termination