在 ARM 汇编中,立即数由 8 位旋转值编码,这意味着我们只能编码
(0-256)^2n.
现在我的问题是我想清除 r0 的高 16 位并将其替换为存储的半字 r1。但是由于我必须做的即时范围有限: -
bic r0, r0, #0xff000000
bic r0, r0, #0x00ff0000
add r0, r0, r1, LSL #16
是否可以用一条指令替换两条 bic 指令? 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
关于assembly - 清除 1 条 ARM 指令中的高 16 位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/294217/