linux - 不中断 assembly 时出现段错误

标签 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)

最佳答案

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

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

关于linux - 不中断 assembly 时出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21148523/

相关文章:

c - 一些由clang生成的程序集不能在实模式下工作(.COM,微小内存模型)

python - 使用 Python 在 Linux 和 Windows 中查找文件的最快方法是什么?

linux - 编写linux脚本将1970年1月1日之前的时间戳转换为1970年2月2日

Android Studio 未知键码 - 键映射不适用于字母

linux - 如何将端口 8081 定向到子文件夹

C 代码表示为汇编代码 - 如何解释?

c++ - 使用 C++ 进行目录导航

c - TI-84 : call a function from the catalog with z88dk

assembly - x86 cmpl 和 jne

performance - 条件指令(cmov)和跳转指令之间的区别