所以我的练习是改变位的顺序,所以:
7 6 5 4 3 2 1 0
字符串
将
3 2 7 6 1 0 5 4
型
我正在努力弄清楚这一点。我试图使用rol
方法来旋转它们,这样我就可以得到3 2 1 0 7 6 5 4
,这至少会更接近一点。但是超出范围的第一位不会通过第二位进行,我使用的示例是0000 1111
代码:
ldi r16,$0F - 0000 1111
rol r16 - 0001 1110
rol r16 - 0011 1100
rol r16 - 0111 1000
rol r16 - 1111 0000
rol r16 - 1110 000(0 - should be 1) - C was 0, now 1
rol r16 - 1100 0001
型
AVR的rol
通过进位旋转;它是adc r16,r16
的别名。(Online manual,或PDF)
更新我在练习中读到,我们应该翻转位5,4,3,2,然后使用移位和旋转来获得该顺序,因此这是我的代码
ldi r16,$0F
ldi r17,$3C
eor r16,r17
lsl r16
lsl r16
型
所以r16是0000 1111
r17是0011 1100
然后我用异或门得到r16 0011 0011
,然后我想用lsl向左移位两次,所以我得到0110 0110
,但是在我做第二次移位后,我得到:0011 0001
而不是1100 1100
,我不知道为什么会发生这种情况。
更新2前面的代码不工作,因为程序不知道在执行最后一个函数后该做什么,所以它回到了开始,给了我糟糕的结果,解决方案是end: rjmp end
,它迫使程序一遍又一遍地无限跳转到这一行
ldi r16,$0F
ldi r17,$3C
eor r16,r17
lsl r16
lsl r16
end: rjmp end
型
5条答案
按热度按时间kmb7vmvb1#
使用
T
标志的较短版本可以是:字符串
诺塔贝内酒店
你试图解决这个问题表明你还没有真正理解(低级)编程。
我建议你花一些时间来内化你正在学习的概念。
huwehgph2#
这个问题很老了,但我会做以下事情(在
R16
中输入和返回):字符串
kh212irz3#
我们可以作弊看看avr-gcc会产生什么
字符串
生成的程序集为:
型
所以编译器在10条指令中完成它,而不需要上层寄存器。它需要一个临时寄存器R 0。当输入与输出不重叠时,不需要临时寄存器,但它仍然需要10条指令。
有关文档,请参阅
__bultin_avr_insert_bits
的the GCC documentation。mqkwyuun4#
伪程序集(字节存储在
r1
中):字符串
u1ehiz5o5#
我会用蛮力
字符串