Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 清除1 ARM指令中的上16位_Assembly_Arm_Bit Manipulation - Fatal编程技术网

Assembly 清除1 ARM指令中的上16位

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

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的前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