【问题标题】:Bitwise operation changing order of bits按位运算改变位的顺序
【发布时间】: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


【解决方案1】:

使用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 表示最短序列,并向 OP 展示如何正确注释代码以跟踪数据移动。并利用有用的架构特性。这不是我所知道的架构,所以看看非 x86 CPU 可以做什么技巧是很好的。
【解决方案2】:

我会用蛮力来做:

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`)

【讨论】:

    【解决方案3】:

    伪汇编(字节存储在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
    

    【讨论】:

    • 我认为这计算 5 4 7 6 1 0 3 2 并且 xor 可能只是一个或,我错了吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-27
    • 1970-01-01
    • 2013-01-25
    • 2013-08-08
    • 1970-01-01
    • 2011-02-04
    相关资源
    最近更新 更多