【发布时间】:2013-01-10 00:02:44
【问题描述】:
我写了一个内联汇编程序来解除/home/httpd中的"grades.txt"的链接,代码如下:
void main()
{
__asm__(
"jmp L\n"\
"sub1:\n"\
"movl 0x4(%esp), %ebx\n"\
"movb $0xa, %al\n"\
"int $0x80\n"\
"L:\n"\
"call sub1\n"\
".string \"//home//httpd//grades.txt\" "
);
}
我认为代码应该做我想做的事,取消链接“/home/httpd”中的grades.txt,但是当我执行它时,出现了段错误。
而我用gdb解决了这个故障,我发现它无法执行“jmp L”行,程序会在第5行时停止[“__asm__(”],直到我输入“ctrl + c”到打断它。
如果我添加“exit(0)”的程序集让程序干净地退出,并继续执行它,程序将直接退出而不做任何事情。
所以这很令人困惑,为什么程序不执行jmp指令?有什么错误吗?
非常感谢您的帮助!
【问题讨论】:
-
call sub1是call subl的错字还是代码中的错误? -
对不起,我在网页上输入代码时出错,在我的机器上都是
call sub1。我会修改它。 -
不是
jmp L导致 SIGSEGV。这是movl 0x4(%esp), %ebx。目标是 x86 还是 x64?我怀疑你的目标是 x64。如果是这种情况,那么您应该使用 rsp 而不是 esp。 -
感谢您的回复,但我的目标是x86。:(