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的绝对和相对寻址。如何指定正确的一个?