現在 gdb でいくつかのコードを実行していますが、これら 2 つの命令が実際に何をするのかわかりません。誰かが私を助けてくれたら、本当に感謝しています。
add -0x2c(%ebp, %ebx, 4), %eax
cmp %eax, -0x28(%ebp, %ebx, 4)
現在 gdb でいくつかのコードを実行していますが、これら 2 つの命令が実際に何をするのかわかりません。誰かが私を助けてくれたら、本当に感謝しています。
add -0x2c(%ebp, %ebx, 4), %eax
cmp %eax, -0x28(%ebp, %ebx, 4)
通常、x86 アセンブリは、AT&T 構文ではなく Intel 構文で記述すると、はるかに理解しやすくなります。
Intel 構文では、次のようになります。
add eax,[ebp+4*ebx-0x2C]
cmp [ebp+4*ebx-0x28],eax
最初の命令 ( add
) は、メモリ アドレス[ebp+4*ebx-0x2C]
に格納されている word の値を の値にeax
加算し、合計を に格納しeax
ます。
2 番目の命令 ( )は、メモリ アドレス に格納されているワードの値から の値を引いてcmp
比較eax
し、それに応じてフラグ ( 、、、、) を設定しますが、結果をどこにも保存しません。は とまったく同じです。唯一の違いは、結果が保存され、保存されないことです。[ebp+4*ebx-0x28]
eax
[ebp+4*ebx-0x28]
OF
SF
ZF
AF
PF
CF
cmp
sub
sub
cmp
比較のタイプは、通常、条件付きジャンプの形式で作成されます。x86 アセンブリには多くの条件付きジャンプがあり、それらが分岐するかどうかはフラグの値に依存します。
それが AT&T アセンブリ構文です。これらのアドレッシング モードは少し奇妙に見えますが、擬似コードでは次のことを意味します。
eax = *(ebp + ebx*4 - 0x2c)
と
compare eax to *(ebp + ebx*4 - 0x28)
ここに完全な説明のリンクがあります。