ドリップリバースノート(6.フラグレジスタ)

1つ。

1.プシャド

上の 2 つの図を比較すると、pushad の機能は 8 つの汎用レジスタの値を上部のメモリ ユニットに順番に格納することに相当し、スタックの最下位に対応するメモリ番号は変更されず、スタックの先頭に相当するメモリ番号も元の 7c から 5c に変更されます。

これについて何を言えばいいのか分からないので、2 つの写真を比較して要約します。

2.ポパッド

ここのレジスタに対応するメモリ番号も少し変更されています。次にその効果を見てみましょう。

ここでは、pushad が実行される前に 8 つのレジスタに対応するメモリ番号が復元されましたが、関連するメモリ ユニットに格納された値は変更されていないことがわかります。

2. (注: mov 命令はフラグ レジスタには影響しません)

1. キャリーフラグ CF: 演算結果の最上位ビットがキャリーまたはボローを生成した場合、その値は 1、それ以外の場合、その値は 0

ここに al を追加します。1 はまだ実行されていません。現在は c0 です。

ここで実行すると、この時点でc0がc1になります

このときのeaxは11120100ではなく11120000です。ここで先生が出した答えは、入った人はc0に入ったということです。

2. パリティフラグ PF: パリティフラグ PF は、演算結果の「1」の個数のパリティを反映するために使用され、「1」の個数が偶数の場合、PF の値は 1、それ以外の場合は 0 になります。 (注: ここでの「1」の数は最下位バイト、つまり最後の 2 ビットです)

                                                                  

まず mov al,3 命令を実行し、次に add al,3 を実行します。

 このとき、p0がp1になっていることが分かり、2進数に変換すると0011は0110、「1」が2つ、偶数になりますので、この時点でp0はp1となり、add al,2を実行します。

 命令実行後、0110は1000になり、このとき「1」は1つだけとなり、p1はp0になります。

3. 補助キャリーフラグ AF: 以下の場合、補助キャリーフラグ AF は 1 に設定され、それ以外の場合は 0 になります。

(1) ワード演算時、下位バイトから上位バイトへのキャリーまたはボローが発生した場合。

(2) バイト動作時、下位 4 ビットから上位 4 ビットへのキャリーまたはボローが発生した場合。

mov ax,0x5efe 命令の実行が完了したところです。

add ax,2 を実行すると、A0 が A1 になることがわかります。

4. ゼロ フラグ: ゼロ フラグは、演算結果が 0 であるかどうかを反映するために使用されます。0 である場合、その値は 1 であり、それ以外の場合は 0 です。

次にsub eax, eaxを実行します

このとき演算結果は0となり、Z0はZ1となります。

5. 符号フラグ SF: SF は、演算結果の符号ビットを反映するために使用されます。これは、演算結果の最上位ビットと同じです。

mov al,7f の実行が完了したら、

 add ax,2 を実行すると、バイナリの観点からは 0111 1111 から 1000 0001 に変更され、S0 は S1 になりました。

6. オーバーフローフラグ OF: オーバーフローフラグは、符号付き数値の加算と減算の結果がオーバーフローしたかどうかを反映するために使用され、オーバーフローの結果が現在の桁数で表現できる範囲を超える場合、それをオーバーフローと呼び、値がオーバーフローします。 OF は 1 に設定され、それ以外の場合は 0 に設定されます。

最上位ビットのキャリーとオーバーフローの違い:

キャリーフラグは、符号なし演算結果が範囲外かどうかを示します。

オーバーフロー フラグは、符号付き数値演算結果が範囲外かどうかを示します。

符号なし数値:0~FF、

                                                     符号付き数値:正の数値0~7F、負の数値:80~FF

オーバーフローは主に署名付き操作に使用されます。署名付き操作には次のルールがあります。

正 + 正 = 正、結果が負の場合、オーバーフローが発生します。

負 + 負 = 負、結果が正の場合、オーバーフローが発生します。

ポジティブ + ネガティブは決してオーバーフローしない

(1) 符号なし数値も符号付き数値もオーバーフローした場合

現時点では、mov al,7 が実行されたばかりで、

add al,7 を実行すると、C0 と O0 が変更されていないことがわかります。

(2) 符号なし数値がオーバーフローし、符号付き数値がオーバーフローしない場合

mov al, 0xff の実行が完了したところです。

add al,2を実行すると、この時点でC0のみがC1となり、O0は変化しないことがわかります。

(3) 符号なしの数値はオーバーフローせず、符号付きの数値はオーバーフローします

現時点では、mov al,7f が実行されたばかりで、

 add al,2 を実行すると、C0 は変化せず、O0 は O1 になります。

(4) 符号付き数値と符号なし数値が両方ともオーバーフローした場合

mov al,0x80 の実行が完了したところです。

add al,81 を実行すると、C0 と O0 がそれぞれ C1 と O1 になっていることがわかります。

おすすめ

転載: blog.csdn.net/m0_51295934/article/details/122585169