(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)
どうも