7

cmp組み立て説明書についての質問です。SFおよびOFフラグ に関する私の本がどのように推論するか理解できません。

 cmp vleft, vright

私の本によると: 符号付き整数の場合、重要な 3 つのフラグがあります: ゼロ(ZF)フラグ、オーバーフロー(OF)フラグ、および符号(SF)フラグです。オーバーフロー フラグは、演算の結果がオーバーフロー (またはアンダーフロー) した場合に設定されます。演算の結果が負の場合、符号フラグが設定されます。の場合vleft = vrightZFが設定されます (符号なし整数の場合と同様)。が設定されていない場合vleft > vright、. が設定されていない場合、. だけでなく、他の命令も FLAGS レジスタを変更できることを忘れないでください。ZFSF = OFvleft < vrightZFSF != OFCMP

まず、vleft > vrightケースを考えてみましょう。私の本には次のように書かれています。

vleft > vright の場合、なぜ SF = OF になるのですか? オーバーフローがない場合、差は正しい値になり、負ではない必要があります。したがって、SF = OF = 0 です。ただし、オーバーフローが発生すると、差は正しい値になりません (実際には負になります)。したがって、SF = OF = 1 です。

最初の部分はそれを理解していSF = OF = 0ます。たとえば、次のようになります。

0111 - 0101 = 0111 + 1010 + 1 = 10010 = 7 - 5 = 2

これはOForSFフラグを設定しません。

次のような場合もあります。

1100 - 0101 = 1100 + 1010 + 1 = 10111 = -4 - 5 = 7 (-9 if we had more bits)

これはSFフラグを設定しませんが (答えは正の 7 であるため)、 を設定OF = 1しますSF != OF。これは明らかに、彼らは平等であるべきだという私の本の説明に反しています。

ここで何が欠けていますか?

ありがとうございました!

4

2 に答える 2

6

あなたは壁に頭をぶつけるつもりです、それについて申し訳ありません:)

あなたの例では、-4は5以下です!そうです、そうOFなるでしょう、1そしてそうSFなるでしょう0、そしてそれらは等しくないでしょう、そしてそれは-4が5未満であることを意味します、そしてそれは正しいです。

SF = OF = 1大文字と小文字を逆にする場合を説明するには、次のように5 > -4します。

5 - (-4) = 5 + 4 = 1001b = -7

于 2013-01-04T13:05:36.350 に答える
2

両方のオペランドが同じ符号を持つ場合、あなたの本は OF== (SF!=CF) について正しいです。オペランドの符号が異なる場合、OF は指定できません。

ただし、RTL レベルでは、OF フラグは、ほとんどの場合、符号ビットで計算された Carry_in != Carry_out の差として計算されます。

i.e. for 1100-0101 = 1100+1010+1
bit position 0:  c_in=c_0= 1, a_0 = 0, b_0 = 0;  result=1, c_out=0
             1:  c_in=c_1= 0, a_1 = 0, b_1 = 1;  result=1, c_out=0
             2:  c_in=c_2= 0, a_2 = 1, b_2 = 0;  result=1, c_out=0
             3:  c_in=c_3= 0, a_3 = 1, b_3 = 1;  result=0, c_out=1

ここで c_in_3 != c_out_3 で、オーバーフローを意味します。

于 2013-01-04T10:43:35.863 に答える