GAS:jmp标签导致错误跳转?

时间:2011-07-31 15:35:53

标签: assembly x86 x86-64 gas

我正在尝试组装以下程序:

    .text
.globl _search2
_search2:
    pushq   %rbp
    movq    %rsp, %rbp
    movq    %rax, -8(%rbp)
go_again:
    cmpl    $0x90909090, (%rax)
    je  go_out
    addq    $0x8, %rax
    jmp     go_again
go_out: 
    leave
    ret

通过这样做:“gcc -o test test.s main.c”,我得到了这个:

otool -v -t test

_search2:
0000000100000d0c    pushq   %rbp
0000000100000d0d    movq    %rsp,%rbp
0000000100000d10    movq    %rax,0xf8(%rbp)
go_again:
0000000100000d14    cmpl    $0x90909090,(%rax)
0000000100000d1a    je  0x100000d29
0000000100000d20    addq    $0x08,%rax
0000000100000d24    jmp 0x200000d14
go_out:
0000000100000d29    leave
0000000100000d2a    ret

jmp试图跳转到地址0x200000d14,这是完全错误的,而不是标记为go_out标签的0x100000d29。

请帮忙。

1 个答案:

答案 0 :(得分:2)

尝试objdump -D测试> test.list

00000000004004c4 <_search2>:
  4004c4:   55                      push   %rbp
  4004c5:   48 89 e5                mov    %rsp,%rbp
  4004c8:   48 89 45 f8             mov    %rax,-0x8(%rbp)

00000000004004cc <go_again>:
  4004cc:   81 38 90 90 90 90       cmpl   $0x90909090,(%rax)
  4004d2:   74 06                   je     4004da <go_out>
  4004d4:   48 83 c0 08             add    $0x8,%rax
  4004d8:   eb f2                   jmp    4004cc <go_again>

00000000004004da <go_out>:
  4004da:   c9                      leaveq 
  4004db:   c3                      retq   

查看您使用的工具是否可以显示说明,如果说明(有点)相同,则相对地址是正确的,您可以忽略工具显示的地址,或者只是不使用该工具。< / p>

如果分支是直接的并且与目标不匹配,则存在gcc / gnu工具问题。