在ARM程序集中,immediates由8位旋转值编码,这意味着我们只能编码
(0-256)^2n.
现在我的问题是我要清除r0的高16位并用半字存储的r1替换它.但由于我必须做的范围有限: -
bic r0, r0, #0xff000000 bic r0, r0, #0x00ff0000 add r0, r0, r1, LSL #16
是否可以用一条指令替换2双指令?0xffff0000是不可解码的.也许我应该使用另一个逻辑操作来清除高16位?
谢谢
编辑:对不起,我忘了说r1的前16位是空的,我正在使用ARM7TDMI
如果你有一个足够新的ARM内核问题很简单:
movt r0, #0 orr r0, r0, r1,lsl#16
见http://www.keil.com/support/man/docs/armasm/armasm_cjagdjbf.htm
但是,如果你有ARMv6 +,你可以一次性完成整个引用的例子:
pkhbt r0, r0, r1,lsl#16
见http://www.keil.com/support/man/docs/armasm/armasm_cihjedjg.htm