与JMP指令混淆

时间:2013-01-10 00:02:45

标签: assembly inline-assembly

我在 / 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指令?有错误吗?

我非常感谢你的帮助!

1 个答案:

答案 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"
   );
}