【问题标题】:How to shift 111 starting with 00000001 Assembler如何从 00000001 汇编程序开始移位 111
【发布时间】:2015-02-08 13:23:49
【问题描述】:
我需要循环移位寄存器的值。我需要从00000001 -> 00000011 -> 00000111 -> 00001110 -> 00011100 -> 00111000 -> 01110000 -> 11100000 -> 01110000 -> 00111000-> 00011100-> 00001110-> 00000111 -> 00000011 -> 00000001 . 开始
我不知道如何在没有硬编码的情况下在循环中执行此操作,也许擅长汇编的人可以建议如何优雅地执行这种转换。
提前谢谢
【问题讨论】:
标签:
assembly
byte
bit
avr
shift
【解决方案1】:
看起来像一个微不足道的 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