【发布时间】:2016-02-17 19:36:38
【问题描述】:
所以我的练习是改变位的顺序:
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)
rol r16 - 1100 0001
更新 我在练习中读到我们应该翻转 5 4 3 2 位,然后使用移位和旋转来获得该顺序,所以这是我的代码
ldi r16,$0F
ldi r17,$3C
eor r16,r17
lsl r16
lsl r16
所以 r16 是 0000 1111 r17 是 0011 1100 然后我使用 XOR 门进入 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
【问题讨论】:
-
这不仅仅是改变位的顺序......为什么数组不起作用?
-
@WhatsUp 这是改变位的顺序。阵列将是一个矫枉过正。我相信 OP 旨在用逻辑运算符解决这个问题。
-
@MargaretBloom 啊哈,我明白了,他希望
bit 7转到bit 5等等,对吗? -
@WhatsUp 是的,就是这样。但是,OP 没有指定任何架构供我们回答(程序集看起来像 AVR)。
-
是的,它是 AVR ATmega 8535,你能看看更新吗?
标签: assembly bit-manipulation avr atmega