また誰の役にも立たないと思いますが、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フラグをリセットするために、ORやANDが使われていましたが、Z8000では、フラグがリセットされません。リセットには、RESFLG C を使います。
INC, DEC はキャリーフラグが変化しない
Z80もそうだったような気がしますが、実行結果によってZフラグやSフラグは変化するのに、Cフラグには影響しません。INCとDECは、1から16まで増減量を指定できるので便利なのですが、Z80には無かったので、コードを書くときに指定を忘れがちです。
また、何か気づいたら書いていきます。
0 件のコメント:
コメントを投稿