Arm 什么';thumb-2指令中W后缀的含义是什么?

Arm 什么';thumb-2指令中W后缀的含义是什么?,arm,thumb,Arm,Thumb,thumb-2指令有一个w后缀,如下所示,如果没有它,它如何改变指令的语义?搜索结果非常嘈杂,我没有得到答案 addw r0,r1,#0我在表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. 这一点也在本文中提到 添加宽T2添加Rd、Rn、# 看起来

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

addw r0,r1,#0

我在表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.
这一点也在本文中提到

添加宽T2添加Rd、Rn、#

看起来汇编程序会识别立即常数,指令的不同编码应该具有不同的语法,因此当您反汇编二进制文件时,您应该注意使用了哪种编码。这也有助于当你组装一个反汇编的二进制文件时,得到的二进制文件应该是你开始使用的那个

在您的情况下,使用
addw
而不是
add
不会改变指令的语义,因为它是一个add操作。然而,它肯定会迫使汇编程序产生
编码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
intf1(inti){
asm volatile(“加上r0,#0”);
asm挥发性(“添加r0,#257”);
}
00000000 :
0:f100 0000加上。w r0,r0,#0
4:f200 1001增补r0,r0,#257;0x101
8:4770 bx lr
a:bf00不
简单地说,W表示“宽”。它是指令的32位版本,而大多数Thumb指令的宽度为16位。宽指令通常具有更大的立即数或可以寻址更多寄存器

编辑:一些评论似乎混淆了
addw
add.w
之间的区别。唯一的本质区别是立即数的编码方式

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

它可以帮助汇编人员在thumb2可以做什么和thumb2不能做什么之间进行选择。可能不是这种情况,但您可能有一条指令可以被编码为thumb或thumb2,通过使用类似的东西,您基本上可以要求某种编码。一个简短的回答是“试试看”,用相同的代码编写一行代码,不用汇编,然后反汇编。为了理解这一点,历史上的16位thumb add/sub仅支持8位常量。ARM模式始终支持12位。根据dwelch,这将是一个32位thumb2操作代码。您不想在
添加r0,r0,#1
中使用它,但在
添加r0,r0,#257
中需要它。我认为这是为了当您有一个超出传统thumb范围的常数时,unified assembler可以自动选择正确的编码而添加的。我的20美分。顺便说一句,我觉得拇指2让人困惑。它不是一种模式,但更像是一组附加的thumb指令,如armv6、armv7扩展常规ARM的操作码。@artlessnoise您可以使用
addr0、#257
。汇编程序只需创建编码T4。所以你不需要使用它,除非你想明确地指定你出于某种原因想要它。ARM也以这种方式讲述了这个故事。@auselen我的观点是,
addw
32位编码只对大于255的常量有意义。我知道汇编程序会自动选择;其他用途是人们试图理解
objdump
或反汇编源代码。这些程序通常是明确的。所以,对于汇编程序,您应该只使用
add
(我没有问这个问题…);我怀疑常数小于256的
addw
可能会在某些时候被弃用以扩展指令范围。这些信息可能只对查看反汇编程序输出有用。。。对于这个用例,这是一个很好的问题。现在继续解释add.w和addwAs@auselen之间的区别,你是在解释.w,而不是w后缀。如果你知道ARM,那么“T[1-4]”编码是有意义的,但我不知道是否每个人都知道T1-T4编码。有四种编码;cc set带有
添加rx,ry,#imm3
添加rx,#imm8
设置cc,
添加.w rx,ry,#特殊
(条件是或否),最后是
添加rx,ry,#imm12
,您可以不设置条件。此外,如果在
IT
块中,您会得到不同的编码。对大多数人来说,除了设定的条件外,他们都做同样的事情。尝试添加r0,#0xabababab了解T3有多奇怪。有多种方法可以进行添加,这就是为什么反汇编程序会显示额外的内容。
add.w:  imm32 = ThumbExpandImm(i:imm3:imm8);
addw:   imm32 = ZeroExtend(i:imm3:imm8, 32);