【问题标题】:GAS: jmp to label results in wrong jump?GAS:jmp to label会导致错误跳转?
【发布时间】:2011-07-31 15:35:53
【问题描述】:

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

    .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 测试

_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。

请帮忙。

【问题讨论】:

  • @Mat 不,jmp go_again 应该是 jmp 0x100000d14。它在某处获得了额外的 0x100000000。 `@user476173,你能提供原始目标代码以及反汇编吗?
  • jmp 转到 go_again = 0000000100000d14je 转到 go_out = 0000000100000d29 。有什么问题?
  • @phoxis,jmp 将转到 0x200000d14 而不是 0x100000d14(2,而不是 1)。
  • as search2.s -o search2.o otool -v -t search2.o search2.o: (__TEXT,__text) section _search2: 0000000000000000 pushq %rbp 0000000000000001 movq %rsp,%rbp 0000000000000004 movq %rax,0xf8(%rbp)go_again:0000000000000000000018 000000000000000000000000000000
  • 看起来像是 je 和 jmp 的绝对寻址与相对寻址。如何指定正确的?

标签: assembly x86 x86-64 gnu-assembler


【解决方案1】:

试试 objdump -D test > 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   

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-26
    • 2022-06-23
    • 2011-02-23
    • 1970-01-01
    相关资源
    最近更新 更多