Assembly 清除1 ARM指令中的上16位
ARM组件中的即时数据由8位旋转值编码,这意味着我们只能进行编码Assembly 清除1 ARM指令中的上16位,assembly,arm,bit-manipulation,Assembly,Arm,Bit Manipulation,ARM组件中的即时数据由8位旋转值编码,这意味着我们只能进行编码 (0-256)^2n. 现在我的问题是,我想清除r0的上16位,并用存储的半个字r1替换它。但由于即时性的范围有限,我必须:- bic r0, r0, #0xff000000 bic r0, r0, #0x00ff0000 add r0, r0, r1, LSL #16 是否可以用一条指令替换2条bic指令?0xffff0000是不可编码的。也许我应该使用另一个逻辑操作来清除上面的16位 谢谢 编辑:对不起,我忘了说r1的前1
(0-256)^2n.
现在我的问题是,我想清除r0的上16位,并用存储的半个字r1替换它。但由于即时性的范围有限,我必须:-
bic r0, r0, #0xff000000
bic r0, r0, #0x00ff0000
add r0, r0, r1, LSL #16
是否可以用一条指令替换2条bic指令?0xffff0000是不可编码的。也许我应该使用另一个逻辑操作来清除上面的16位
谢谢
编辑:对不起,我忘了说r1的前16位是空的,我正在使用ARM7TDMI如果你能清除全部内容,你可以用它本身来进行异或 如果需要保留下半部分,是否可以将寄存器左移8位并返回?但是,对于C代码,这可能是相同数量的指令。
(a<<16)|((short)b)
它不使用任何即时指令,但仍然有两条指令。在ARMv6(例如MPCore)上,您可以这样说
uxth r1, r1
orr r0, r1, r0, asl #16
“将其替换为存储的半个字r1”-这是否意味着您可以假定r1的前16位为零?如果是,
add r0, r1, r0 lsl #16
mov r0, r0 ror #16
将mov视为一个占位符,因为您有希望将ror移动到下一个将r0作为输入的位置,并在同一周期内实际执行有用的工作。如何:
orr r0,r1,r0,lsl #16
mov r0,r0,ror #16
(这假设r1的上半字是空的,就像参考代码一样。)
根据具体情况,您可以通过将最后一个mov与稍后的代码合并来省略它。如果您有一个足够新的ARM内核,那么问题很简单:
movt r0, #0
orr r0, r0, r1,lsl#16
看
但是,如果您有ARMv6+的话,您实际上可以一次性完成整个引用的示例:
pkhbt r0, r0, r1,lsl#16
请参见您可以使用BFC指令。位字段清除。此指令从m位清除n位是的,我认为这是等效的(r0和r1相反)。但是正如warren所说,我必须做一个左右移位,这仍然是相同数量的指令。你忘记的是让编译器知道
b
的高16位是干净的。如果你尝试intmerge(inta,short b){return(一个Keil声称它们可以作为ARM指令和Thumb使用。我个人从来没有理由愤怒地使用ARMv4之外的任何东西,但我相信它们应该可以工作。编辑:“我正在使用ARM7TDMI” — ARM7TDMI是ARMv4,或者可能是ARMv5……遗憾的是,无论哪种方式,都不够新,无法以“movt”或“pkh”为特征。
pkhbt r0, r0, r1,lsl#16