2014-03-05 48 views
3

下面是thumb-2指令的w后缀,它如何在没有它的情况下更改指令的语义?搜索结果非常嘈杂,我没有得到答案。拇指2指令后缀W的含义是什么?

addw r0, r1, #0

+0

它可以帮助汇编程序选择thumb2可以做的那个拇指不能。也许不是这种情况,但是你可能有一条可以用thumb或者thumb2编码的指令,通过使用类似这样的东西,你可以基本上要求一定的编码。一个较短的答案是“试一试”,写下一行代码,然后进行汇编和反汇编。 –

回答

3

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

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> 

提到看起来像汇编器将识别立即数< = 12位,并做需要。

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

+2

为了解释这一点,历史的16位大拇指添加/子只支持8位常量。 ARM模式始终支持12位。根据dwelch,这将是一个32位的thumb2操作码。你不想为'addw r0,r0,#1'使用它,但是需要它用于'addw r0,r0,#257'。我认为这是因为* unified * assembler可以在你有一个不在传统的拇指范围内的常量时自动选择正确的编码。我的2cents。顺便说一句,我觉得* thumb2 *混淆。它不是一种模式,但更像是一堆额外的* thumb *指令,如armv6,armv7扩展了常规ARM的操作码。 –

+0

@artlessnoise您可以使用'add r0,#257'。汇编程序只会创建编码T4。所以你不需要使用它,除非你想明确地指定你出于某种原因需要它。 ARM ARM也以这种方式讲述了这个故事。 – auselen

+0

@auselen我的观点是'addw' 32位编码仅适用于大于255的常量。我知道汇编器会自动选择;其他用途是试图理解'objdump'或* disassembled * source的人。通常这些程序将是明确的。因此,对于汇编程序,您应该使用'add'(我没有问这个问题......);我怀疑常量小于256的'addw'可能会在某些时候被弃用来扩展指令范围。这些信息可能仅用于查看反汇编程序输出......对于该用例,这是一个**好**问题。 –

3

指令的不同编码应该有区别语法,所以当你反汇编一个二进制文件时,你应该注意到使用了哪种编码。这也有助于组装回反汇编的二进制文件,因此生成的二进制文件应该是您开始使用的二进制文件。

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

汇编汇总时只能使用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

如果你知道ARM ARM,那么'T [1-4]'编码是有道理的,但我不知道是否每个人都知道T1-T4编码。有四种编码; cc设置为'添加rx,ry,#imm3','添加rx,#imm8'设置cc,'add.w rx,ry,#special'(条件是或否),最后是'addw rx,ry,#imm12 '你可能没有设定条件。另外,如果在“IT”块中,你会得到不同的编码。对于大多数人来说,除了条件设定之外,他们都做同样的事情。尝试'添加r0,#0xabababab'以了解奇怪的T3是多少。有多种方法可以做一些补充,这就是反汇编器显示额外内容的原因。 –

2

简而言之,W表示“宽”。它是指令的32位版本,而大多数Thumb指令是16位宽。广泛的指令通常具有更大的立即数或可以处理更多的寄存器。

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

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

现在继续解释add.w和addw之间的区别 – auselen

+0

正如@auselen所提到的,您正在解释.w,而不是w后缀。 – Thomson