Arm shift操作是否在thumb ISA中的独立指令中运行?

Arm shift操作是否在thumb ISA中的独立指令中运行?,arm,Arm,ARM指令可以在其第二个源操作数中使用桶形移位器(请参见下面列出的汇编),它是数据处理指令的一部分,所以保存一条指令以进行移位。我想知道拇指指令能否利用DP指令中的桶移位?还是应该将移位操作分离为独立指令?我这样问是因为thumb指令中可能没有足够的空间来编码桶移位器 mov r0, r1, LSL #1 这个例子并不好,因为它是规范的lslr0,r1,#1的另一种形式,它有16位Thumb编码(尽管有标记设置限制) 另一种ARM指令,如addr0、r0、r1、lsl#1实际上必须作为两个拇指

ARM指令可以在其第二个源操作数中使用桶形移位器(请参见下面列出的汇编),它是数据处理指令的一部分,所以保存一条指令以进行移位。我想知道拇指指令能否利用DP指令中的桶移位?还是应该将移位操作分离为独立指令?我这样问是因为thumb指令中可能没有足够的空间来编码桶移位器

mov r0, r1, LSL #1

这个例子并不好,因为它是规范的
lslr0,r1,#1
的另一种形式,它有16位Thumb编码(尽管有标记设置限制)

另一种ARM指令,如
addr0、r0、r1、lsl#1
实际上必须作为两个拇指指令来执行,因为正如您所说,没有空间将两个操作压缩为16位(因此也就是为什么您被限制为r0-r7,所以寄存器可以以3位而不是4位进行编码)

另一方面,Thumb-2通常有32位编码用于操作数的即时移位,因此在ARMv6T2和更高版本的体系结构上,您可以将
添加r0、r0、r1、lsl#1
作为单个指令进行编码

然而,寄存器移位寄存器形式(例如,
添加r0、r0、r1、lsl r2
)即使在Thumb-2中也不可用-您必须在2个Thumb指令中这样做:

lsl r1, r2
add r0, r1

请注意,与ARM指令不同,此序列会更改r1中的值-如果您想同时保留该值,则需要一个中间寄存器和一个额外的
mov
指令(或一个Thumb-2 3寄存器
lsl
)-否则,最后的办法是
bx
到ARM代码,因为它是规范的
lslr0,r1,#1
的另一种形式,它有16位Thumb编码(尽管有标志设置限制)

另一种ARM指令,如
addr0、r0、r1、lsl#1
实际上必须作为两个拇指指令来执行,因为正如您所说,没有空间将两个操作压缩为16位(因此也就是为什么您被限制为r0-r7,所以寄存器可以以3位而不是4位进行编码)

另一方面,Thumb-2通常有32位编码用于操作数的即时移位,因此在ARMv6T2和更高版本的体系结构上,您可以将
添加r0、r0、r1、lsl#1
作为单个指令进行编码

然而,寄存器移位寄存器形式(例如,
添加r0、r0、r1、lsl r2
)即使在Thumb-2中也不可用-您必须在2个Thumb指令中这样做:

lsl r1, r2
add r0, r1

请注意,与ARM指令不同,此序列会更改r1中的值-如果您想保留该值,则需要一个中间寄存器和一个额外的
mov
指令(或一个Thumb-2 3寄存器
lsl
)-否则,最后的办法将是
bx
到ARM代码。

感谢您给出了明确的答案。对于上一个在thumb-2中不可用的寄存器移位寄存器形式,由于ARM和thumb-2共享相同的UAL语法,汇编程序是否支持将写入(单个指令)拆分为2条指令?@Thomson汇编程序不会自动为您执行此操作,但是你可以手工做同样的事情——我已经添加了一个例子。谢谢你的明确回答。对于上一个在thumb-2中不可用的寄存器移位寄存器形式,由于ARM和thumb-2共享相同的UAL语法,汇编程序是否支持将该写入(单个指令)拆分为2条指令?@Thomson汇编程序不会自动为您执行此操作,但您可以手动执行等效操作-我添加了一个示例。