微控制器上的按位逻辑
Bitwise Logic on a Microcontroller
给出下面的简短示例,有什么方法可以减少 [x1] 和 [x2] 之间的代码中使用的寄存器数量吗?
我从 PINA 读取输入并根据某种逻辑为 PORTB 生成输出 table。
这是对我来说最直接的方法,但它似乎有点迂回。有没有我不知道的更优雅的方式?
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
请注意,我对性能(space、速度)的兴趣不如对减少掩码和移位操作的数量感兴趣,这些操作很容易在更大范围内引入(草率/讨厌的)错误。
另请注意,我不确定 Codereview.Stackechange 是否更适合这个问题。
我认为您不能减少在这种特殊情况下使用的寄存器数量,因为看起来您想保持 r16
的内容原始。
如果您不需要这样做,您可以使用 andi
指令将位掩码作为即时数据加载。
给出下面的简短示例,有什么方法可以减少 [x1] 和 [x2] 之间的代码中使用的寄存器数量吗?
我从 PINA 读取输入并根据某种逻辑为 PORTB 生成输出 table。 这是对我来说最直接的方法,但它似乎有点迂回。有没有我不知道的更优雅的方式?
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
请注意,我对性能(space、速度)的兴趣不如对减少掩码和移位操作的数量感兴趣,这些操作很容易在更大范围内引入(草率/讨厌的)错误。
另请注意,我不确定 Codereview.Stackechange 是否更适合这个问题。
我认为您不能减少在这种特殊情况下使用的寄存器数量,因为看起来您想保持 r16
的内容原始。
如果您不需要这样做,您可以使用 andi
指令将位掩码作为即时数据加载。