cmp
組み立て説明書についての質問です。SF
およびOF
フラグ に関する私の本がどのように推論するか理解できません。
cmp vleft, vright
私の本によると: 符号付き整数の場合、重要な 3 つのフラグがあります: ゼロ(ZF)
フラグ、オーバーフロー(OF)
フラグ、および符号(SF)
フラグです。オーバーフロー フラグは、演算の結果がオーバーフロー (またはアンダーフロー) した場合に設定されます。演算の結果が負の場合、符号フラグが設定されます。の場合vleft = vright
、ZF
が設定されます (符号なし整数の場合と同様)。が設定されていない場合vleft > vright
、. が設定されていない場合、. だけでなく、他の命令も FLAGS レジスタを変更できることを忘れないでください。ZF
SF = OF
vleft < vright
ZF
SF != OF
CMP
まず、vleft > vright
ケースを考えてみましょう。私の本には次のように書かれています。
vleft > vright の場合、なぜ SF = OF になるのですか? オーバーフローがない場合、差は正しい値になり、負ではない必要があります。したがって、SF = OF = 0 です。ただし、オーバーフローが発生すると、差は正しい値になりません (実際には負になります)。したがって、SF = OF = 1 です。
最初の部分はそれを理解していSF = OF = 0
ます。たとえば、次のようになります。
0111 - 0101 = 0111 + 1010 + 1 = 10010 = 7 - 5 = 2
これはOF
orSF
フラグを設定しません。
次のような場合もあります。
1100 - 0101 = 1100 + 1010 + 1 = 10111 = -4 - 5 = 7 (-9 if we had more bits)
これはSF
フラグを設定しませんが (答えは正の 7 であるため)、 を設定OF = 1
しますSF != OF
。これは明らかに、彼らは平等であるべきだという私の本の説明に反しています。
ここで何が欠けていますか?
ありがとうございました!