我在 / 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指令?有错误吗?
我非常感谢你的帮助!
答案 0 :(得分:1)
少数事情:
%eax
代替%al
,因为3个最重要的字节可能不是000000
movl 0x4(%esp), %ebx
行应为movl (%esp), %ebx
,因为%ebp
未被压入堆栈,因此返回地址位于%esp+0
在doinig int 80h
之后,代码将会一遍又一遍地调用sub1
,因此您需要额外的跳转:
int80h
add $4, %esp # pop the return address
jmp exit # jump over the call
call sub1
....
exit:
无需使用\
- 字符串将为您连接
void
不是C main()
的有效返回类型
总结以上提示:
int main()
{
__asm__(
"jmp L\n"
"sub1:\n"
"movl (%esp), %ebx\n"
"movl $0xa, %eax\n"
"int $0x80\n"
"add $4, %esp\n"
"jmp exit\n"
"L:\n"
"call sub1\n"
".string \"//home//httpd//grades.txt\"\n"
"exit:\n"
);
}