5

私は現在、分解を元に戻していますが、理解できない一連の指示に遭遇しました。

でオブジェクトポインタを指定しesiます。

.text:00C20263                 cmp     dword ptr [esi+80h], 0
.text:00C2026A                 jnz     short loc_C2027D

+0x80メンバーが0でない(メンバーが整数である)かどうかを確認できるように、コードは次のようにジャンプし00C2027Dます。

.text:00C2027D                 add     dword ptr [esi+80h], 0FFFFFFFFh
.text:00C20284                 jnz     short loc_C20291

これらの2つの指示は、私が本当に理解していないものです。まず、メンバーは0xFFFFFFFFずつインクリメントされます。しかし、メンバーは0ではないので、これは32ビット整数の最大値を超えませんか?そして、jnz命令はいつジャンプしますか?

これらの2つの指示の目的が何であるかを指摘できるでしょうか。

4

1 に答える 1

16

符号付き変数の場合、0FFFFFFFFhは-1と同じであるため、値から1を減算し、それがゼロになったかどうかを確認します。コンパイラは、サブ命令ではなく「負の値を加算」することがよくあります。これは、おそらく、加算と減算の両方でコンパイラロジックを再利用できるためです。

于 2012-07-09T18:12:49.710 に答える