【发布时间】: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=0000000100000d14和je转到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