0

我编写了一个内联汇编程序来取消/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 指令?有没有错误?

我将非常感谢您的帮助!

4

1 回答 1

1

一些事情:

  • 您应该使用%eax而不是%al因为 3 个最重要的字节不能000000
  • movl 0x4(%esp), %ebx行应该是movl (%esp), %ebx因为%ebp没有被压入堆栈,因此返回地址位于%esp+0
  • 完成后int 80h,代码将失败并sub1一遍又一遍地调用,因此您需要额外的跳转:

    int80h
    add $4, %esp # pop the return address
    jmp exit     # jump over the call
    call sub1
    ....
    exit:
    
  • 无需使用\- 字符串将为您连接

  • void不是main()C 中的有效返回类型

总结以上tips:

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"
   );
}
于 2013-01-10T01:16:22.003 回答