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

时间:2014-03-05 16:39:40

标签: arm thumb

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

addw r0, r1, #0

3 个答案:

答案 0 :(得分: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.

Quick Reference

中也提到了这一点
add wide T2 ADD Rd, Rn, #<imm12>

看起来汇编程序会识别直接常量&lt; = 12位,并且需要它。

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

答案 1 :(得分:3)

指令的不同编码应具有区分语法,因此当您反汇编二进制文件时,您应该注意使用了哪种编码。当你回收一个反汇编的二进制文件时,这也有帮助,结果二进制文件应该是你开始使用的二进制文件。

在您使用addw而不是add的情况下,不会更改指令的语义,因为它是一个添加操作。但是它肯定会迫使汇编程序生成Encoding T4(32位)add指令,因为这是由规范规定的。

汇总时,你可以只使用add助记符,汇编器会选择正确的编码,你可以在对象转储中看到它。

int f1(int i) {
    asm volatile("add r0, #0");
    asm volatile("add r0, #257");
}

00000000 <f1>:
   0:   f100 0000   add.w   r0, r0, #0
   4:   f200 1001   addw    r0, r0, #257    ; 0x101
   8:   4770        bx  lr
   a:   bf00        nop

答案 2 :(得分:2)

简单地说,W意味着“宽”。它是32位版本的指令,而大多数Thumb指令是16位宽。宽泛的指令通常具有更大的立即数或可以处理更多的寄存器。

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

add.w:  imm32 = ThumbExpandImm(i:imm3:imm8);
addw:   imm32 = ZeroExtend(i:imm3:imm8, 32);