ARM指令可以在其第二个源操作数(见下面的汇编列表)中使用桶形移位器,这是数据处理指令的一部分,因此保存一条指令进行移位。我想知道拇指指令可以利用DP指令中的桶移位吗?或者它应该将班次操作分成独立的指令?我问这个,因为拇指可能没有足够的空间用于编码桶形移位器的指令。
mov r0, r1, LSL #1
答案 0 :(得分:4)
该示例并不好,因为它是规范lsl r0, r1, #1
的替代形式, 具有16位Thumb编码(尽管有标志设置限制)。
另一个ARM指令,如add r0, r0, r1, lsl #1
,确实必须作为两个Thumb指令完成,因为正如你所说的那样,没有空间将两个操作都压缩成16位(因此你也限制为r0-r7所以寄存器可以用3位而不是4位编码。
add r0, r0, r1, lsl #1
编码为单个指令。
然而,寄存器移位寄存器形式(例如add r0, r0, r1, lsl r2
)即使在Thumb-2中也不可用 - 你必须在2个Thumb指令中这样做:
lsl r1, r2
add r0, r1
请注意,与ARM指令不同,此序列会更改r1中的值 - 如果您想保留该值,则需要一个中间寄存器和一个额外的mov
指令(或Thumb-2 3寄存器) lsl
) - 最后的办法是bx
到ARM代码。