0

(GDB を使用して) アセンブリ コードをデバッグしようとしましたが、非常に奇妙な動作をします。このコードの高水準言語は if ステートメントですよね?eax の内容が rbx と等しい場合、指定されたアドレスにジャンプします。それ以外の場合は、その下のステートメントを実行します。コードは次のとおりです。

       0x000000000040108b <+25>:    lea    0x4(%rsp),%rbx
       0x0000000000401090 <+30>:    mov    $0x1,%ebp
       0x0000000000401095 <+35>:    mov    %ebp,%eax
       0x0000000000401097 <+37>:    add    -0x4(%rbx),%eax
       0x000000000040109a <+40>:    cmp    %eax,(%rbx)
 =>    0x000000000040109c <+42>:    je     0x4010a3 <phase_2+49>

私の理解では、%eax が %rbx と等しい場合、ステートメント je はコードをアドレス 0x4010a3 にジャンプしますよね? ただし、次を使用して両方のレジスタの内容を表示しようとすると:

print/c $eax
print/c $rbx

両方のレジスタの内容は 116 です。ただし、0x4010a3 にジャンプする代わりに、je ステートメントの下のステートメントを実行するだけです。私は何か間違ったことをしていますか?さらに、次の違いは何だろうと思います。

cmp    %eax, %rbx

cmp    $eax, (%rbx)

どうも

4

1 に答える 1

2
CMP    %eax, (%rbx)

EAX の値をRBXが指す値と比較します。に似ていif (x == *y)ます。

サイズが異なるため(32ビットと64ビット)、EAXとRBXを比較することさえできません。

于 2013-04-20T20:42:20.513 に答える