2014-01-15 59 views
0

我对某些东西感到困惑,我是新手,在GNU/Linux上学习程序集,如果你使用了指令并且没有中断(终止)程序,它会触发一个分段错误错误。
为了澄清,我为此制作的程序唯一的作用是通过系统调用退出。当在程序集中不中断时出现分段错误

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

编辑:我没有试图做这个事情,这是出了结果混淆的问题,但这里是代码:

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) 
+0

请包括一些代码给我们你想要做的事情的背景。 – Michael

+0

我不想做任何事情,但我会包含代码 –

回答

2

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

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

+0

现在我明白了,所以这是因为CPU没有任何东西在程序计数器中(内存中没有任何内容),就像试图访问一些不存在的东西。 –

+0

这是大概的想法;但是,CPU在程序计数器中仍然有一个地址,但它不是一个有效的地址。 – Michael