如下所示,thumb-2指令有一个w后缀,如果没有它,它如何改变指令的语义?搜索结果非常嘈杂,我没有得到答案。
addw r0, r1, #0
答案 0 :(得分:3)
我在Cortex-M3 TRM表2-5
中看到了ADDWData operations with large immediate
ADDW and SUBW have a 12-bit immediate. This means they can replace many from memory literal loads.
中也提到了这一点
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位宽。宽泛的指令通常具有更大的立即数或可以处理更多的寄存器。
编辑:有些评论似乎对addw
和add.w
之间的区别感到困惑。唯一的本质区别是立即编码的方式。
add.w: imm32 = ThumbExpandImm(i:imm3:imm8);
addw: imm32 = ZeroExtend(i:imm3:imm8, 32);