assembly - 清除 1 条 ARM 指令中的高 16 位

标签 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

是否可以用一条指令替换两条 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/

相关文章:

eclipse - 设置反汇编 View 颜色

performance - 为什么XOR比OR快得多?

c - ARM GCC 生成的函数序言

c - "&="C 操作错误

php - 如何将 PDO 预处理语句与 BIT(1) 列一起使用?

C - 更改 bmp 文件的像素颜色

assembly - MIPS:堆栈指针($sp)和堆栈的相关用途

assembly - nasm/ld "relocation truncated to fit: R_386_16"

linux - ARM 工具链在错误的库目录中查找

c - PF4 的中断配置?