単純に1づつ増加するデータをパラレル出力するというだけなのですがここのところずっと嵌ってます。同じ動作をするはずのプログラムをいくつか書いてみました。
1は現状の書き方。+1のクイック加算でインクリメントしています。
2は通常の加算命令でソースを+1のイミディエイトとしています。実際にはソースを-8~+7の即値にするとアセンブラが勝手に最適化してADDQ命令のコードを生成してしまうので手打ちで直しています
3はソースを+1を代入したレジスタR1にしたものです
これらのどれもがR0がインクリメントせずに0x55と0xABを交互に出力するという謎の動きになってしまいます。増分kを1~7に変えて出力結果をみてみると、
と算術的に増加してほしいところが
と2つの値しかとりません。これはロジック的にみると
という論理演算をしていることになります。(XORでマスクが掛けられているので交互に変化する)加算ADD命令のところを減算SUB命令に置き換えてみると今度は
となりこれは
という演算をしていることになります。
CPUがフェッチしているコードは間違いはないのでこれはもうCPUの算術演算ユニットがイカレているかマイクロコードがバグっているのか・・・ ALUでの加減算がダメだとアドレス計算も影響あるわけで相対アドレスジャンプがおかしいのもそのせいかもしれません