不中断装配时的分段故障

时间:2014-01-15 21:23:46

标签: linux assembly

我对某些事感到困惑,我是新手并且在GNU / Linux上学习汇编,如果你使用movl指令并且没有中断(终止)程序,它将触发分段错误错误。
为了澄清,我为此做的唯一一件事是通过系统调用退出。

为什么这样做?我的意思是,为什么当有中断时,它不被视为“访问不允许访问的内存”?

编辑:我不是想做任何事情,这是一个混淆结果的问题,但这里是代码:

movl $1, %eax
movl $2, %ebx
#int $0x80 (if you remove the comment, it won't trigger a segmentation fault error, even though now we are using registers normally)

1 个答案:

答案 0 :(得分:2)

我认为您所看到的是由于程序没有正确退出而导致的分段错误。

一旦开始执行,CPU就不知道程序有多长,需要hlt或系统调用来改变控制流并实际退出程序。因此,当您删除syscall指令(并因此退出程序)时,CPU继续执行。问题是,你没有指定将要执行的内容,而是正在执行的内存中的内容。从那里,你有两个可能的结果:一个段错误(就像你看到的那样),因为CPU增加超过有效内存的某个点,或者是非法指令,因为某些内存组合实际上会转换为无效的操作码。