代码之家  ›  专栏  ›  技术社区  ›  Tarski

清除1 ARM指令中的上16位

  •  3
  • Tarski  · 技术社区  · 17 年前

    ARM组件中的即时数据由8位旋转值编码,这意味着我们只能进行编码

    (0-256)^2n.
    

    现在我的问题是,我想清除r0的上16位,并用存储的半个字r1替换它。但由于即时性的范围有限,我必须:-

    bic r0, r0, #0xff000000
    bic r0, r0, #0x00ff0000
    add r0, r0, r1, LSL #16
    

    谢谢

    编辑:对不起,我忘了说r1的前16位是空的,我使用的是ARM7TDMI

    7 回复  |  直到 17 年前
        1
  •  5
  •   bobince    17 年前

    如果您有一个足够新的ARM内核,那么问题很简单:

    movt    r0, #0
    orr     r0, r0, r1,lsl#16
    

    看见 http://www.keil.com/support/man/docs/armasm/armasm_cjagdjbf.htm

    pkhbt   r0, r0, r1,lsl#16
    

    看见 http://www.keil.com/support/man/docs/armasm/armasm_cihjedjg.htm

        2
  •  4
  •   Martin Willers Martin Willers    17 年前

    怎么样:

    orr r0,r1,r0,lsl #16
    mov r0,r0,ror #16
    

    (这假设r1的上半字是空的,就像参考代码一样。) 根据具体情况,您可以通过将最后一个mov与稍后的代码合并来省略它。

        3
  •  2
  •   moonshadow    17 年前

    “将其替换为存储的半个字r1”-这是否意味着您可以假定r1的前16位为零?如果是,,

    add r0, r1, r0 lsl #16
    mov r0, r0 ror #16
    

        4
  •  1
  •   Martin v. Löwis    17 年前

    在ARMv6(例如MPCore)上,您可以说

        uxth    r1, r1
        orr     r0, r1, r0, asl #16
    
        5
  •  0
  •   warren    17 年前

    xor 这是它自己。

    如果需要保留下半部分,是否可以将寄存器左移8位并返回?不过,这可能是相同数量的指令。

        6
  •  0
  •   Martin v. Löwis    17 年前

    对于C代码

     (a<<16)|((short)b)
    

    gcc生成

        mov     r1, r1, asl #16
        mov     r1, r1, asr #16
        orr     r0, r1, r0, asl #16
    

    它不使用任何即时信息,但它仍然是两个指令。

        7
  •  0
  •   user435739 user435739    12 年前

    您可以使用BFC指令。位字段清除。此指令从m位清除n位