2019年7月4日木曜日

Z8001のアセンブリ言語 その2

また誰の役にも立たないと思いますが、Z8001のアセンブリ言語でコードを書いているときに気づいたことを書き留めておきます。

レジスタの値がゼロか正負かを調べるには TEST より OR 

レジスタの値がゼロかどうか調べたり、正か負を調べる場合に、TESTを使うと7クロックですが、同じレジスタ同士でORを使うと4クロックですみます。TESTは、レジスタではなくメモリの値を調べる場合に使ったほうが、メモリから一度レジスタに読み出す必要がないのと、レジスタを破壊しなくてすむので有利になります。またTESTは32bit値が使えますが、ORでは使えません。

レジスタのゼロクリアには CLR より XOR

レジスタの値をゼロにしたい場合、CLRを使うと7クロックですが、同じレジスタ同士でXORを使うと4クロックですみます。ただし、CLRではフラグは変化しませんが、XORではZフラグが変化してしまいます。これもメモリの値をゼロにしたい場合には、CLRをつかった方が有利になります。

OR Rx, Rx でキャリーフラグはリセットされない

Z80では、Cフラグをリセットするために、ORANDが使われていましたが、Z8000では、フラグがリセットされません。リセットには、RESFLG C を使います。


INC, DEC はキャリーフラグが変化しない

Z80もそうだったような気がしますが、実行結果によってZフラグやSフラグは変化するのに、Cフラグには影響しません。INCDECは、1から16まで増減量を指定できるので便利なのですが、Z80には無かったので、コードを書くときに指定を忘れがちです。

また、何か気づいたら書いていきます。

0 件のコメント:

コメントを投稿