2

現在 gdb でいくつかのコードを実行していますが、これら 2 つの命令が実際に何をするのかわかりません。誰かが私を助けてくれたら、本当に感謝しています。

add  -0x2c(%ebp, %ebx, 4), %eax
cmp  %eax, -0x28(%ebp, %ebx, 4)
4

2 に答える 2

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]OFSFZFAFPFCFcmpsubsubcmp

比較のタイプは、通常、条件付きジャンプの形式で作成されます。x86 アセンブリには多くの条件付きジャンプがあり、それらが分岐するかどうかはフラグの値に依存します。

于 2012-09-08T02:03:49.317 に答える
1

それが AT&T アセンブリ構文です。これらのアドレッシング モードは少し奇妙に見えますが、擬似コードでは次のことを意味します。

eax = *(ebp + ebx*4 - 0x2c)

compare eax to *(ebp + ebx*4 - 0x28)

ここに完全な説明のリンクがあります。

于 2012-09-08T02:03:29.933 に答える