我正在努力学习低级开发。通过在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
"
);
感谢您寻求建议。
答案 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
寄存器中,因此请确保它已被清除。