【问题标题】:confusing with JMP instruction与 JMP 指令混淆
【发布时间】: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 sub1call subl 的错字还是代码中的错误?
  • 对不起,我在网页上输入代码时出错,在我的机器上都是call sub1。我会修改它。
  • 不是jmp L 导致 SIGSEGV。这是movl 0x4(%esp), %ebx。目标是 x86 还是 x64?我怀疑你的目标是 x64。如果是这种情况,那么您应该使用 rsp 而不是 esp。
  • 感谢您的回复,但我的目标是x86。:(

标签: assembly inline-assembly


【解决方案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 不是 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"
   );
}

【讨论】:

  • 非常感谢!现在问题解决了!! :) 非常感谢!!
猜你喜欢
  • 2012-05-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-13
  • 1970-01-01
  • 2014-11-18
相关资源
最近更新 更多