所以我的练习是改变位的顺序,所以:
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
UPDATE 我在练习中读到我们应该翻转位5 4 3 2然后使用shift和rotate来获得该顺序,所以这里是我的代码
ldi r16,$0F
ldi r17,$3C
eor r16,r17
lsl r16
lsl r16
所以r16是0000 1111
r17是0011 1100
然后我使用XOR门进入r16 0011 0011
然后我想用lsl向左移动两次所以我得到{{1但是在我完成第二班后,我得到:0110 0110
而不是0011 0001
而且我不确定为什么会发生这种情况。
更新2之前的代码不起作用,因为程序在执行最后一个函数后不知道该怎么做,所以它回到开始给我不好的结果,解决方案是
1100 1100
迫使程序一遍又一遍无限地跳到这条线上
end: rjmp end
答案 0 :(得分:3)
使用T
标志的较短版本可以是:
;Input: r16
;Output: r16
ror r16 ;r16 = 0 7 6 5 4 3 2 1
ror r16 ;r16 = 1 0 7 6 5 4 3 2
mov r17, r16 ;r17 = 1 0 7 6 5 4 3 2
ror r16 ;r16 = 2 1 0 7 6 5 4 3
ror r16 ;r16 = 3 2 1 0 7 6 5 4
bst r17, 7 ;T = 1
bld r17, 3 ;r17 = 1 0 7 6 1 4 3 2
bst r17, 6 ;T = 0
bld r17, 2 ;r17 = 1 0 7 6 1 0 3 2
andi r17, $3c ;r17 = - - 7 6 1 0 - -
andi r16, $c3 ;r16 = 3 2 - - - - 5 4
or r16, r17 ;r16 = 3 2 7 6 1 0 5 4
Nota Bene
您尝试解决此练习表明您还没有真正理解(低级)编程
我建议你花一些时间来内化你正在研究的概念。
答案 1 :(得分:0)
我会用暴力来做:
ldi r16, $0F (or any number, your input)
eor r18, r18
mov r17, r16
andi r17, $C0
lsr r17
lsr r17
or r18, r17
mov r17, r16
andi r17, $30
lsr r17
lsr r17
lsr r17
lsr r17
or r18, r17
mov r17, r16
andi r17, $0C
lsl r17
lsl r17
lsl r17
lsl r17
or r18, r17
mov r17, r16
andi r17, $03
lsl r17
lsl r17
or r18, r17 (the output is `r18`)
答案 2 :(得分:0)
伪装配(存储在r1
中的字节):
mov r2, r1
mov r3, r2
mov r4, r3
shr r1, 4
shl r2, 2
shr r3, 2
shl r4, 4
and r1, 0x03
and r2, 0x0C
and r3, 0x30
and r4, 0xC0
xor r4, r3
xor r3, r2
xor r2, r1