拇指2指令的W后缀是什么意思?

Tho*_*son 4 arm thumb

如下所示,thumb-2 指令有 aw 后缀,如果没有它,它如何改变指令的语义?搜索结果非常嘈杂,我没有得到答案。

addw r0, r1, #0

Var*_*der 5

很简单,W 的意思是“宽”。它是指令的 32 位版本,而大多数 Thumb 指令是 16 位宽。宽指令通常具有更大的立即数或可以寻址更多寄存器。

编辑:一些评论似乎感到困惑之间的差异addwadd.w。唯一的本质区别是立即数的编码方式。

add.w:  imm32 = ThumbExpandImm(i:imm3:imm8);
addw:   imm32 = ZeroExtend(i:imm3:imm8, 32);
Run Code Online (Sandbox Code Playgroud)


小智 3

我在Cortex-M3 TRM表 2-5中看到 ADDW

Data operations with large immediate
ADDW and SUBW have a 12-bit immediate. This means they can replace many from memory literal loads.
Run Code Online (Sandbox Code Playgroud)

快速参考中也提到了

add wide T2 ADD Rd, Rn, #<imm12>
Run Code Online (Sandbox Code Playgroud)

看起来汇编器会识别立即常量 <= 12 位,并执行需要的操作。

在您看到它的上下文中,它是一个普通的“添加”。

  • 为了理解这一点,历史上的 16 位拇指加/减仅支持 8 位常量。ARM模式始终支持12位。根据 dwelch 的说法,这将是一个 32 位拇指 2 操作码。您不想将其用于“addw r0,r0,#1”,但需要将其用于“addw r0,r0,#257”。我认为添加这个是为了当你有一个超出传统拇指范围的常量时,*统一*汇编器可以自动选择正确的编码。我的2美分。顺便说一句,我发现 *thumb2* 令人困惑。它不是一种模式,而更像是一堆附加的 *thumb* 指令,如 armv6、armv7 扩展了常规 ARM 的操作码。 (2认同)