Assembly 气体:jmp标记错误跳转的结果?

Assembly 气体:jmp标记错误跳转的结果?,assembly,x86,x86-64,gnu-assembler,Assembly,X86,X86 64,Gnu Assembler,我正在尝试组装以下程序: .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 通过这样做

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

    .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.s main.c”,我得到了:

耳石-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标签标记的0x10000D29


请提供帮助。

尝试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   
0000000000 4004C4:
4004c4:55%推送rbp
4004c5:48 89 e5 mov%rsp,%rbp
4004c8:488945F8MOV%rax,-0x8(%rbp)
0000000000 4004CC:
4004cc:81 38 90 cmpl$0x9090,(%rax)
4004d2:74 06 je 4004da
4004d4:48 83 c0 08添加$0x8,%rax
4004d8:eb f2 jmp 4004cc
0000000000 4004DA:
4004da:c9-Q
4004db:c3 retq
查看您使用的工具是否可以显示指令,如果指令相同(有些相同),则相对地址正确,您可以忽略工具显示的地址,或者干脆不使用该工具


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

@Mat No,
jmp go_再次
应该是
jmp 0x10000D14
。它在某处获得额外的0x100000000`@用户476173,您可以在反汇编过程中提供原始目标代码吗?
jmp
再次转到
go\u
=
00000000000d14
je
转到
go\u-out
=
00000000000d29
。问题是什么?@phoxis,
jmp
将进入
0x200000d14
,而不是
0x100000d14
(2,不是1)。作为search2.s-o search2.o otool-v-t search2.o search2.o:(u文本,uu文本)部分u search2:0000000000 pushq%rbp 00000000000000001 movq%rsp,%rbp 00000000004 movq%rax,0xf8(%rbp)再次执行:0000000000000008 cmpl$0x90909090,(%rax)000000000000000e je 0x00000014 00000000000000 14 addq$0x08,%rax 00000000000000 18 jmp 0x10000008执行:00000000000000 1D看起来像je和jmp的绝对和相对寻址。如何指定正确的一个?