【发布时间】:2014-03-02 15:39:37
【问题描述】:
ARM 指令可以在其第二个源操作数中使用桶形移位器(参见下面列出的汇编程序),它是数据处理指令的一部分,因此请保存一条指令来进行移位。我想知道拇指指令是否可以在 DP 指令中使用桶形移位?还是应该将移位操作分成独立的指令?我问这个是因为拇指在指令中可能没有足够的空间来编码桶形移位器。
mov r0, r1, LSL #1
【问题讨论】:
标签: arm
ARM 指令可以在其第二个源操作数中使用桶形移位器(参见下面列出的汇编程序),它是数据处理指令的一部分,因此请保存一条指令来进行移位。我想知道拇指指令是否可以在 DP 指令中使用桶形移位?还是应该将移位操作分成独立的指令?我问这个是因为拇指在指令中可能没有足够的空间来编码桶形移位器。
mov r0, r1, LSL #1
【问题讨论】:
标签: arm
这个例子不是很好,因为它是规范 lsl r0, r1, #1 的另一种形式,确实具有 16 位 Thumb 编码(尽管有标志设置限制)。
诸如add r0, r0, r1, lsl #1 之类的替代 ARM 指令确实必须作为两个 Thumb 指令来完成,因为正如您所说,没有空间将这两个操作压缩为 16 位(这也是为什么您仅限于 r0- r7 所以寄存器可以用 3 位而不是 4 位编码。
另一方面,Thumb-2 通常确实具有用于操作数立即移位的 32 位编码,因此在 ARMv6T2 和更高版本的架构上,您可以将 add r0, r0, r1, lsl #1 编码为一条指令。
但是,即使在 Thumb-2 中,寄存器移位寄存器形式(例如 add r0, r0, r1, lsl r2)也不可用 - 您必须像这样在 2 个 Thumb 指令中执行此操作:
lsl r1, r2
add r0, r1
请注意,与 ARM 指令不同,此序列会更改 r1 中的值 - 如果您还想保留它,则需要一个中间寄存器和一个额外的 mov 指令(或 Thumb-2 3 寄存器 @987654327 @) - 如果最后的手段是 bx 到 ARM 代码失败。
【讨论】: