ゼロフラグとキャリーフラグの違いは何ですか?
ゼロフラグの場合、
mov ax , 0FFFF ;
inc ax ; AX= 0 , ZF=1
キャリーフラグについては、
mov al , 0FFh
add al , 1 ; CF=1,AL=00
の値はAL
ゼロに等しいのに、なぜゼロフラグが1に設定されていないのですか?
念のため、フラグの意味/動作を理解しているようです。
ゼロ フラグは非常に単純です。演算の結果がゼロの場合、ゼロ フラグが設定されます。それ以外の場合はクリアされます。
キャリー フラグはさまざまな方法で使用されますが、この場合、加算操作では、キャリー アウト ビット、つまり符号なしオーバーフローが使用されます。
2 つの 10 進数 92 と 5 を足すと 97 になります。92 と 12 を足すと 104 になります。結果として数字の場合、答えは 104 ではなく 04 になります。何をしたいのかによっては、答えが間違っていると見なされる場合があります。あなたがその計算をしていたとき、2+2 = 4、次に 9 + 1 = 0 は 1 を運ぶと自分に言い聞かせていました。それは、キャリーがあなたから来て、それを次の列に運ぶところですが、プロセッサには限られた数の列があります。 .
加算ロジック (sub は加算を使用) は、符号付き (2 の補数) と符号なしの数値 (2 の補数の美しさ) を認識または気にしません。同じロジックにオペランドを入力すると、同じ答えが得られます。異なるのはオーバーフローで、符号なしオーバーフローはキャリーアウトビットです。プロセッサに符号付きオーバーフローがある場合 (私は一般的に 1 つのプロセッサに固有ではありません)、結果に回答を格納するのに十分な情報が含まれていないかどうかを検出します。たとえば、0x80 + 0x80 = 0x00 です。unsigned は 128 + 128 であり、符号付きオーバーフローが発生します。unsigned は -128 + -128 であり、結果は -256 です。2 つの負の数を追加しました。マイナス プラス マイナスはマイナスに等しくなりますが、正の数である 0x00 になり、オーバーフローしました。
フラグを使用している場合は、命令セットに関係なく、各命令の影響を受けるフラグを検索または記憶する必要があります (フラグを設定するために使用しています)。各命令セットには異なるフラグ規則があり、すべての alu 命令がすべてのフラグに影響を与えるわけではありません。など。設計者は、1 つはフラグに影響を与え、もう 1 つは影響しないようにします。特にこのような場合、同じレジスタ、EAX、AX、AH、AL、レジスタの小数部に対して操作を実行できる場所 レジスタの残りの部分がゼロでない場合でも、AH 操作をゼロと宣言しますか? 操作サイズに基づいた定義ですか、それとも操作した部分以外のレジスタ全体ですか? ここにいる誰もが答えを知っているかもしれませんが、最初に考えるべきだったこのプロセッサを学び始めたときにレジスタ定義を見たとたんに. 答えを調べて記憶するまでは、命令からフラグを取得するたびに調べる必要があります。設計者は、操作を実行するために必要な命令を節約するために、意図的にフラグをいじらないように操作を入れます。フラグが決定時に分岐の前に常に命令になるように強制しないものもあれば、分岐自体が alu 操作と決定 (フラグなし) である (mips) ものもあります。答えを調べて記憶するまでは、命令からフラグを取得するたびに調べる必要があります。設計者は、操作を実行するために必要な命令を節約するために、意図的にフラグをいじらないように操作を入れます。フラグが決定時に分岐の前に常に命令になるように強制しないものもあれば、分岐自体が alu 操作と決定 (フラグなし) である (mips) ものもあります。答えを調べて記憶するまでは、命令からフラグを取得するたびに調べる必要があります。設計者は、操作を実行するために必要な命令を節約するために、意図的にフラグをいじらないように操作を入れます。フラグが決定時に分岐の前に常に命令になるように強制しないものもあれば、分岐自体が alu 操作と決定 (フラグなし) である (mips) ものもあります。
あなたの質問への答えは、ドキュメントを調べて、調べる習慣を作ることです。すべての alu 操作がすべてのフラグに影響すると仮定しないでください。問題の命令とレジスタを調べてください。「なぜ」への答えは、それが彼らがやりたいと感じたことだからです。新しいプロセッサを設計するチームに属していない限り、プログラマーとして得たものを手に入れ、それで作業します...あなたの質問それ自体がさまざまな答えの期待につながります。16 ビットから 8 ビット操作に切り替え、add から inc に切り替えます。いずれかまたは両方が、設計者が定義を変更するのに完全に有効です。
いいえ、どちらの場合もゼロ フラグが設定されます。証拠はプリンにあります:
INC 命令はキャリーフラグに影響を与えません。x86 命令セットのちょっとした癖ですが、ADC で任意精度の加算を計算する際にポインターまたはインデックスをインクリメントできるようにするために意図的に行われていることはほぼ確実です。