3

次のプログラムを組み立てようとしています:

    .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 は、go_out ラベルでマークされた 0x100000d29 ではなく、完全に間違ったアドレス 0x200000d14 にジャンプしようとしています。

助けてください。

4

1 に答える 1

2

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 ツールの問題があります。

于 2011-07-31T18:10:49.157 に答える