以下の短い例では、[x1]と[x2]の間のコードで使用されるレジスタの量を減らす方法はありますか?マイクロコントローラでのビット単位の論理
私はPINAからの入力を読み、ロジックテーブルに従ってPORTBの出力を生成します。 これは私のためにこれを行う最も簡単な方法ですが、それはちょっと丸見えです。私が気づいていないよりエレガントな方法がありますか?私はマスクの量を減らすことでできるだけ多くの興味もパフォーマンス(スペース、スピード)ではないですし、より大きな規模で簡単に(ずさん/厄介な)エラーを導入事業をシフト
loop:
;Set Masks for Inputpins [x1]
ldi r17, 0b00000010
ldi r18, 0b00000100
;Read Input from PINA
in r16, PINA
;Apply Masks and normalize
and r17, r16
lsl r17
and r18, r16
lsl r18
lsl r18
;Start with actual bitwise operations e.g [x2]
mov r16, r17
xor r16, r18
and r16, r17
...
...
out PORTB, r16
rjmp loop
注意。
また、Codereview.Stackechangeがこの質問のより適切な場所であるかどうかはわかりません。
エラーが気になる場合は、コンパイラを使用しないでください。 – user3528438
あなたはCコードを書いてgcc -Sを使っているのでしょうか? – Haini
多分私は何かが不足しているかもしれませんが、 'Apply Masks and normalize'の後に、' r17'のように0または4が含まれ、 'r18'は0または16のいずれかになります。したがって、' xor r16、r18'では、 1つも共通しない2組のビットがあり、 'xor'が' or'になり、 'and'は無意味になります。 – Michael