按位运算改变位的顺序

时间:2016-02-17 19:36:39

标签: assembly bit-manipulation avr atmega

所以我的练习是改变位的顺序,所以:

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

3 个答案:

答案 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