今回はFレジスタ(フラグレジスタ)です。
レジスタなんですが、ちょっと変わったレジスタだそうです。
(いつものとおり、MSX マシン語入門講座という本で勉強します)
データをロードしたり、他のレジスタとの間で
演算をすることは出来ないそうです。
名前のとおりで、
Aレジスタが0になったりとか、引き算の結果が負になったり
そういう時にフラグを立てるみたいです。
Fレジスタは8ビットなのですが、
各ビットごとに違う意味があるそうです。
フラグが立つということは、0が1になるということかな?
フラグレジスタの構造:
-----|------|------|------|------|---------|------|--------
S | Z | x | H | x | P/V | N | CY
-----|------|------|------|------|---------|------|--------
S, Z, x, H, x, P/V, N, CY
です。
S: サイン(符号)フラグ
Z: ゼロフラグ
H: ハーフキャリーフラグ
P/V: パリティ/ オーバーフローフラグ
CY: キャリーフラグ
N: 加減算フラグ
x: 未使用
フラグレジスタは8ビットなのですが、中身が
01000000
となっているとZ(ゼロフラグ)だけが、フラグが立っている訳です。
この中で、よく使われるのがCY、Z、S、P/V の4つだそうです。
少なくてよかった^^
なんでも、N、HフラグはCPUで使うものでユーザーには関係ないそうです。
Xの未使用は、0も1も関係ないとのこと。
それでは順番に説明のページを読んでいきます。
CYフラグ (キャリーフラグ)
CYフラグは、足し算や引き算命令が行われた時に、
一番上の桁で、
・繰り上がり
・繰り下がり
が起きたかどうかを示すそうです。
足し算
繰り上がりが起きた時:1
起きなかった時:0
引き算
引き算した結果がマイナスになる時:1
ただし、INC / DEC 命令は、CYフラグに影響を与えないそうです。
(INCといったら+1、DECといったら-1をする命令でした。)
また、論理演算( AND ,OR ,XOR )をすると、CYフラグは必ず
0になるそうです。
論理演算はまだやっていませんでしたね。
そのうちやります。
Zフラグ ( ゼロフラグ )
Zフラグは、AレジスタやHLレジスタが0のときに、1
となり、
それ以外の場合は、0
となります。
0の時というのは、8ビットなので、
00000000
というすべてのビットが0になったときですね。
このときフラグが立ちます( Z=1 )
なお、INC / DEC 命令で、16ビットの場合は影響を受けないとのことです。
うーん、具体例が書いてないのでよくわかりませんが、
INC / DECの時には、少し気をつけておけばいいでしょう。うん。
Sフラグ ( サインフラグ )
演算した時、
AレジスタやHLレジスタに残った値が、
正 (プラス) は、0
負(マイナス)は、1
となります。
プラスの時は0というのがポイントですね。
普通は逆のような気がしてしまいます。
(補数と同じで、先頭ビットが1ならマイナスなのです。
補数もそのうちやります;)
P/V フラグ ( パリティ / オーバーフローフラグ )
2つのフラグが1つのところに入っているそうです。
パリティフラグ:
これはまだやっていない、論理演算の時に関係します。
AND , ORをやったとき、
Aレジスタの8ビットのうち1となっているビットの数が
偶数個のとき:1
奇数個のとき:0
だそうです。
ふーんという程度にみておきます^^
まあ、よく使うわけでもないようなので。
もうひとつの、
オーバーフローフラグ:
算術演算命令のときに、演算の結果、Aレジスタが
-128 〜 +127 の範囲をでてしまったとき:1
そうでないとき:0
だそうです。
マイナスの数字はどうやって表すの?と疑問に思われると
思います。
それは、補数というのを使います。
これも、ループ処理などの勉強を終えたら書きたいと思います。
まとめ:
Fレジスタの何ビット目がどうであるか?ということは
知らなくてもいいそうです。
一番よく使われるのが、
Zフラグ( 0 かどうか知るフラグ)、
CYフラグ ( 繰り上がり・繰り下がりを知るフラグ)の
2つだそうです。
結構覚えることがありました。
次回はどうしましょうか。
本のとおりにいくと、2バイトと2バイトの足し算となっていますが、
マシン語の計算は飛ばしてしまったので、
今後、計算の勉強をするときに2バイトの足し算もやります。
とにかくループの説明がしたい!
それをしないと、BASICゲームに使ったマシン語の説明が
出来ない!!
説明しないと気持ちが悪いのです^^
次は比較命令をやります。
それでは〜。
スポンサーリンク
MSX BASIC + マシン語などの情報はこちらへ