2016-04-06 10 views
0

以下の短い例では、[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がこの質問のより適切な場所であるかどうかはわかりません。

+0

エラーが気になる場合は、コンパイラを使用しないでください。 – user3528438

+0

あなたはCコードを書いてgcc -Sを使っているのでしょうか? – Haini

+1

多分私は何かが不足しているかもしれませんが、 'Apply Masks and normalize'の後に、' r17'のように0または4が含まれ、 'r18'は0または16のいずれかになります。したがって、' xor r16、r18'では、 1つも共通しない2組のビットがあり、 'xor'が' or'になり、 'and'は無意味になります。 – Michael

答えて

0

r16の内容をpristineに保ちたいと思うので、この特定のケースで使用されるレジスタの数を減らすことはできません。

これを行う必要がない場合は、andi命令を使用して、ビットマスクを即時データとしてロードすることができます。

+0

sbrsとsbrcの操作は、より単純なマスキング状況にとって有益です将来の訪問者にこれを追加する。 – Haini