CF:キャリーフラグ
ZF:ゼロフラグ
私は現在、AT&T構文を使用したLinuxプラットフォームでのIntel x86アセンブリに関する本を読んでいます。この本によると、setbeDの効果は次のようになります。
D ← CF&〜ZF
私はそれを理解しました、しかしそれは単に次のように書くことができます:
D← CF | ZF
これは、CF / ZFが1/1または1/0のいずれかである場合の〜ZF&CFとのみ異なります。どちらがより正確ですか?
CF:キャリーフラグ
ZF:ゼロフラグ
私は現在、AT&T構文を使用したLinuxプラットフォームでのIntel x86アセンブリに関する本を読んでいます。この本によると、setbeDの効果は次のようになります。
D ← CF&〜ZF
私はそれを理解しました、しかしそれは単に次のように書くことができます:
D← CF | ZF
これは、CF / ZFが1/1または1/0のいずれかである場合の〜ZF&CFとのみ異なります。どちらがより正確ですか?
真理値表について考えてください。
| CF | ZF | CF &~ZF | CF|ZF |
+---------------------------+
0 0 0 0
0 1 0 1
1 0 1 1
1 1 0 1
真理値表は異なるので、いいえ、同じではありません。
setbe
の場合、結果を1に設定します(ZF=1) or (CF=1)
。あなたが読んでいるドキュメンテーションがそれがそれを設定すると言っているなら、それは(ZF=0) and (CF=1)
間違っています。80386プログラマーズリファレンスマニュアルを参照してください。以下は詳細な分析です。
setbe
前の比較の結果が符号なし整数として比較されたときに以下の場合、結果を1に設定します(符号付き整数に相当するのは、以下のsetle
場合です)。
命令が実行されるとcmp
、デスティネーションオペランドがソースオペランドから減算され、結果は破棄されます。唯一の出力は、条件フラグの設定です。2つの数値を減算するとA-B
、実際にA+(~B)+1
は2の補数が加算されることに注意してください。ここ~B
で、は1の補数ですB
(つまり、すべてのビットが反転します)。
6つのケースを見てみましょう:
ケース0:1を0と比較 0-1 = 0 +〜1 + 1 = 0x00000000 + 0xfffffffe + 1 = 0xffffffff≠0、キャリーなし ==> ZF = 0、CF = 0 ケース1:0と0を比較する 0-0 = 0 +〜0 + 1 = 0x00000000 + 0xffffffff + 1 = 0x00000000 = 0、キャリー付き ==> ZF = 1、CF = 0 ケース2:0と1を比較する 1-0 = 1 +〜0 + 1 = 0x00000001 + 0xffffffff + 1 = 0x00000001≠0、キャリーあり ==> ZF = 0、CF = 1 ケース3:UINT_MAXを0と比較する 0-4294967295 = 0 +〜4294967295 + 1 = 0x00000000 + 0x00000000 + 1 = 0x00000001≠0、キャリーなし ==> ZF = 0、CF = 0 ケース4:0をUINT_MAXと比較する 4294967295-0 = 4294967295 +〜0 + 1 = 0xffffffff + 0xffffffff + 1 = 0xffffffff≠0、キャリーあり ==> ZF = 0、CF = 1 ケース5:UINT_MAXをUINT_MAXと比較する 4294967295-4294967295 = 4294967295 +〜4294967295 + 1 = 0xffffffff + 0x00000000 + 1 = 0x00000000 = 0、キャリー付き ==> ZF = 1、CF = 1
最初の引数が2番目の引数以下である場合は、ケース1、2、4、および5です。これらはすべて、を満たし(ZF=1) or (CF=1)
、比較が偽である残りのケースは、反対の条件を満たし(ZF=0) and (CF=0)
ます。CFとZFの可能なすべての組み合わせも列挙していることに注意してください。setbe
したがって、の正しい動作はに設定することであると結論付け(ZF=1) or (CF=1)
ます。
SETBEが以下(CF=1またはZF=1)であるCFと〜ZFが正しいことを確認しますか?命令はSETBまたはSETLでしょうか?