微控制器上的按位逻辑

时间:2016-04-06 13:06:10

标签: assembly avr

鉴于下面的简短示例,有没有办法减少[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是否适合此问题。

1 个答案:

答案 0 :(得分:0)

我不认为你可以减少在这种特殊情况下使用的寄存器数量,因为看起来你想要保持r16 pristine的内容。

如果您不需要这样做,可以使用andi指令将位掩码加载为立即数据。