2

私はこのx86アセンブリコードを持っています:

mov     [ebp+var_8], 0

mov     eax, Str_len

cmp     [ebp+var_8], eax

jnb     short loc_4018C4

Str_len が常に 0 と異なる場合、この JNB は何を実行しますか? 私の推論は、Str_len 変数が 0 未満にならない場合、ジャンプは決して実行されないということですよね?

ところで、 x86 のバイナリ表現でレジスタがゼロ未満の値を持つにはどうすればよいですか?

4

2 に答える 2

5

jnbキャリー フラグがゼロの場合、命令はジャンプします。この命令は、オペランドからオペランドをcmp減算した結果に従って、フラグを更新します。オペランドは Intel 表記の最初のオペランドであるため、フラグは の結果に従って更新されます。0 に等しいため、0 の場合はキャリー フラグがクリアされ、それ以外の場合はセットされます。要約すると、がゼロに等しい場合に分岐が発生します。srcdstdst[ebp+var_8]-eax[ebp+var_8]eaxeax

于 2013-02-24T15:11:22.393 に答える
3

jnb(実際には のエイリアスjnc) は「符号なし述語」の 1 つを使用するため、 に関してはjnb、値がゼロ未満になることはありません。

しかし、ゼロは比較の最初の引数であるため、実際には計算が行われ 0 - eax(その後、結果ではなくフラグのみが保持されます)、キャリーがない場合はジャンプします。Str_lenつまり、次のようになります。ゼロの場合はジャンプします。

于 2013-02-24T15:11:15.167 に答える