如何从 00000001 开始移位 111 汇编器
How to shift 111 starting with 00000001 Assembler
我需要循环移位寄存器的值。我需要从 00000001 -> 00000011 -> 00000111 -> 00001110 -> 00011100 -> 00111000 -> 01110000 -> 11100000 -> 01110000 -> 00111000-> 00011100-> 00001110-> 00000111 -> 00000011 -> 00000001 .
开始
我不知道如何在没有硬编码的情况下在循环中执行此操作,也许精通汇编程序的人可以建议如何优雅地执行此类移位。
提前致谢
看起来像一个微不足道的16位旋转,唯一复杂的是它需要在两端反转方向。这是我快速整理的内容:
rcall init
loop:
rcall next
rjmp loop
init:
ldi r16, 1 ; output
ldi r17, 0xc0 ; buffer
ldi r18, 0 ; direction
ret
next:
cpi r18, 0
brne right
left:
cpi r16, 0xe0
breq right ; go right if at the end
ldi r18, 0 ; direction is left
lsl r17 ; 16 bit rotate left
rol r16
ret
right:
cpi r16, 1
breq left
ldi r18, 1 ; direction is right
lsr r16 ; 16 bit rotate right
ror r17
ret
我需要循环移位寄存器的值。我需要从 00000001 -> 00000011 -> 00000111 -> 00001110 -> 00011100 -> 00111000 -> 01110000 -> 11100000 -> 01110000 -> 00111000-> 00011100-> 00001110-> 00000111 -> 00000011 -> 00000001 .
我不知道如何在没有硬编码的情况下在循环中执行此操作,也许精通汇编程序的人可以建议如何优雅地执行此类移位。
提前致谢
看起来像一个微不足道的16位旋转,唯一复杂的是它需要在两端反转方向。这是我快速整理的内容:
rcall init
loop:
rcall next
rjmp loop
init:
ldi r16, 1 ; output
ldi r17, 0xc0 ; buffer
ldi r18, 0 ; direction
ret
next:
cpi r18, 0
brne right
left:
cpi r16, 0xe0
breq right ; go right if at the end
ldi r18, 0 ; direction is left
lsl r17 ; 16 bit rotate left
rol r16
ret
right:
cpi r16, 1
breq left
ldi r18, 1 ; direction is right
lsr r16 ; 16 bit rotate right
ror r17
ret