我正在尝试组装以下程序:
.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。
请帮忙。
答案 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工具问题。