为什么会出现分段错误?它应该退出

时间:2010-09-25 21:43:33

标签: linux assembly

我正在努力学习低级开发。通过在ebx中放置0,在eax中放置1(对于exit()syscall)并调用int 0x80,它应该退出程序。 我有一个运行正常的简单c程序,但当我粘贴它,而不是按预期退出时,我得到一个segmantation错误。为什么会这样?

谢谢!

 __asm__ ("xor %ebx, %ebx;"
                 "mov %al, 1;"
                "int $80;"
);

编辑:感谢您的建议,但仍然只有seg故障。 这是我做过的修改:

  __asm__ ("xor %ebx, %ebx;"
           "xor %eax, %eax;"
                "mov $1, %eax;"
                "int $80;"
);

编辑:从http://www.ibiblio.org/gferg/ldp/GCC-Inline-Assembly-HOWTO.html

修改此示例后
asm("movl $1,%%eax;         /* SYS_exit is 1 */
             xorl %%ebx,%%ebx;      /* Argument is in ebx, it is 0 */
             int  $0x80"            /* Enter kernel mode */
             );

这最终对我有用:

asm("   movl $1,%eax;
        xorl %ebx,%ebx;
        int  $0x80
"
        );

感谢您寻求建议。

2 个答案:

答案 0 :(得分:2)

您确定eax的其余部分已清除吗?尝试将1移至eax而不仅仅是al或至少先将其清除。

__asm__ ("xor %ebx, %ebx;"
         "mov $1, %eax;"
         "int $0x80;"
);

编辑:如果AndiDog对AT& T语法是正确的。

编辑:因为我使用了气体已经有一段时间但是80 16 $0x80$80是80 10 。这应该修复它的最后一个。

答案 1 :(得分:1)

这看起来像AT& T汇编语法,因此操作的顺序是“操作源,目标”,而不是更常见的英特尔语法中的“操作目标,源”。

知道了这一点,mov %al, 1;尝试将al寄存器的内容写入内存位置1.将其更改为mov 1, %al;,它应该适用于IMO。请注意,我从未使用过AT& T语法,所以我不确定我是否正确解释了它。

编辑:并且Jeff M是正确的,系统调用号必须存储在eax寄存器中,因此请确保它已被清除。