3

addl命令を使用して 、C 式 "t=a+b" と同等の処理を実行するとします。ここで、a、b、t は int型の変数であり、条件コードは次の C 式に従って設定されます。

CF: (符号なし t) < (符号なし a) 符号なしオーバーフロー

ZF: (t==0) ゼロ

SF: (t<0) ネガティブ

OF: (a<0 == b<0) && (t<0 != a<0) 符号付きオーバーフロー

コンピュータシステムの教科書から引用。

  • CF はキャリーフラグです。
  • ZF はゼロフラグです。
  • SFはサインフラグです。
  • OF はオーバーフロー フラグです。

これらの C 式が上記の効果を持つ理由がわかりません。たとえば、式 (t<0) が SF フラグを設定するのはなぜですか?? t<0 は true または false のいずれかです (教科書ではこれらの変数の型しか説明されていないため)。しかし、なぜ符号フラグが設定されているのでしょうか?私は本当に混乱しています。助けてください..ありがとう!

4

4 に答える 4

1

CPUは、算術演算を実行した後にこれらのフラグを設定します。「C式」と呼ばれるものは、実際にはさまざまなCPUフラグが設定される条件の説明です。たとえば、結果が0の場合、ゼロフラグが設定されます。

または、特定の質問に対処するには、次のようにします。

SF:(t <0)負

算術演算の結果が負の場合、CPUがSFフラグを設定することを意味します。't <0'はC式ではなく、フラグが設定されたときに説明するだけです。

フラグは、フラグの値に応じて条件付きで分岐する命令を使用して、後で制御フローに使用できます。

于 2009-04-26T00:22:01.100 に答える
1

CF、ZF、SF、およびOFは、CC(条件コード)レジスタ内の特異ビットです。他の条件下で設定される他のビットもあります。CPUは、特定の命令(addおよびを含むsub)を実行するたびに、演算の結果に従ってそれらのビットを設定します。命令cmpと関数は、結果を完全に破棄し、唯一の出力が条件フラグであることを除いて、それぞれと命令とtest同じように機能します。suband

次のCコードがあるとします。

int a, b;
...
a -= b;
if(a < 0)
{
    // stuff...
}

ナイーブなコンパイラはこれを次のようにコンパイルするかもしれません:

    ; Suppose a is in the eax register and b is in the edx register
    sub %eax, %edx  ; subtract b from a, store result in a
    cmp $0, %eax    ; compare a to 0
    jl end_of_stuff ; if a < 0, goto end_of_stuff
    ; code for stuff goes here
end_of_stuff:
    ; code after if block goes here

ただし、よりスマートなコンパイラは、sub命令がすでに条件コードを設定していることを認識しているため、次のようにコンパイルできます。

    sub %eax, %edx
    jl end_of_stuff   ; if a < 0, goto end_of_stuff
    ; code for stuff goes here
end_of_stuff:
    ; code after if block goes here

jl命令(より小さい場合はジャンプ)は、SF≠OFの場合にのみジャンプすることに注意してください。つまり、結果が負でオーバーフローが発生しなかった場合、または結果が正でオーバーフローが発生した場合にジャンプします。これは、差がオーバーフローしたときに正しい結果が得られるようにするために必要です(たとえば、との比較INT_MININT_MAX

于 2009-04-26T06:08:33.280 に答える
0

まだ明確な質問ではありませんが、ここに私が集めたものがあります。「t=a+b しかやっていないのに、サイン フラグ (SF) が設定されるのはなぜですか?」と知りたいと思います。私はそれに答えます。

簡単な答えは、'int' C 型は署名されているということです。署名されていないバージョンを取得するには、'unsigned int' と言う必要があります。したがって、t=a+b の状況では、これらの変数はすべて符号付きです。フラグを設定できる理由については、次のとおりです。

let a = 5, b = -10
t = a+b
t = 5 - 10
t = -5 (SF will be set because of the negative)

let a = 5, b = 10
t = a+b
t = 5 + 10
t = 15 (SF will not be set because of the positive)

C で表示される数字の符号について詳しく知りたい場合は、1 の補数と 2 の補数を参照することをお勧めします。

それが質問に答えることを願っています。

于 2009-04-26T00:03:53.327 に答える
0

それは逆です。C で t < 0 と記述すると、これは S フラグを条件とする分岐にコンパイルされます (Negative の N とも呼ばれます)。プロセッサでは、S フラグは結果の最上位ビットからコピーされます。

于 2009-04-26T05:25:57.140 に答える