我正试着把起始寄存器的位移到八个连续的寄存器中。我刚开始用汇编语言写,所以我真的不知道该怎么做。
我尝试使用rol和lsr指令。但是我的循环只是反转了位。我可以在循环中间将注册表从r18改为r19吗?
.equ sequen = 0x10001011
ldi r17
ldi r16, 0x8
next: lsr r17
rol r18
;is there a way to move
;to next register, not
; inc its value?
dec r16
brbc 1, next
rjmp pc
3条答案
按热度按时间t98cgbkg1#
就像彼得·科德斯说的,这是可能的。比如说
3vpjnl9f2#
我正在尝试将起始寄存器中的位移动到八个连续的寄存器中。
只需展开该循环:
$
是GNU汇编程序支持的行分隔符。或者,您可以将相应的位存储在T标志中,然后将其加载到目标寄存器。
还有另一种方式是根据r17的值跳过,这也是每位消耗3条指令:
GNU汇编器允许将其编写为扩展到24条指令的重复:
因此可能需要检查您的汇编程序是否支持此类快捷方式。
是否可以在循环中将注册表从r18更改为r19?
不。"经典" AVR可以间接寻址通用寄存器,因为它们被Map到内存地址0x0..0x1f,但我强烈反对这样的黑客行为。
kxkpmulp3#
我在伪代码中使用的模式如下。
从寄存器V开始,寄存器V保存8位值,例如0xe4 1110 0100
将寄存器B设置为位模式0x01,结果进入R0至R7
这可能是一个循环,你左移初始位模式,然后右移结果的位移值,然后你把结果移动到内存位置偏移的位移值。
在循环结束时,incr shiftValue和与结束值的比较(或减去)有条件地跳转到循环开始。