回答
我看到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位,并做需要。
在您看到它的上下文中,它是一个普通的“添加”。
为了解释这一点,历史的16位大拇指添加/子只支持8位常量。 ARM模式始终支持12位。根据dwelch,这将是一个32位的thumb2操作码。你不想为'addw r0,r0,#1'使用它,但是需要它用于'addw r0,r0,#257'。我认为这是因为* unified * assembler可以在你有一个不在传统的拇指范围内的常量时自动选择正确的编码。我的2cents。顺便说一句,我觉得* thumb2 *混淆。它不是一种模式,但更像是一堆额外的* thumb *指令,如armv6,armv7扩展了常规ARM的操作码。 –
@artlessnoise您可以使用'add r0,#257'。汇编程序只会创建编码T4。所以你不需要使用它,除非你想明确地指定你出于某种原因需要它。 ARM ARM也以这种方式讲述了这个故事。 – auselen
@auselen我的观点是'addw' 32位编码仅适用于大于255的常量。我知道汇编器会自动选择;其他用途是试图理解'objdump'或* disassembled * source的人。通常这些程序将是明确的。因此,对于汇编程序,您应该使用'add'(我没有问这个问题......);我怀疑常量小于256的'addw'可能会在某些时候被弃用来扩展指令范围。这些信息可能仅用于查看反汇编程序输出......对于该用例,这是一个**好**问题。 –
指令的不同编码应该有区别语法,所以当你反汇编一个二进制文件时,你应该注意到使用了哪种编码。这也有助于组装回反汇编的二进制文件,因此生成的二进制文件应该是您开始使用的二进制文件。
在你的情况下,使用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
如果你知道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是多少。有多种方法可以做一些补充,这就是反汇编器显示额外内容的原因。 –
- 1. {$ C PRELOAD}指令的含义是什么?
- 2. 类指针*的含义是什么?
- 3. Ionic2 - 关于导入指令的At symbol @的含义是什么?
- 4. Linux内核中的指令{interrupt do_IRQ}的含义是什么?
- 5. 非法指令4在Docker-compose上的含义是什么?
- 6. freemarker @standalone指令在户外分享中的含义是什么?
- 7. Intel 8080指令...“DAD”字母的含义是什么?
- 8. A64指令结束时,感叹号的含义是什么?
- 9. Angular2 HTML指令中#的含义是什么
- 10. 这些ARM汇编指令的含义是什么?
- 11. 这条指令的含义是什么(subl $ 20,%esp)?
- 12. 为mov指令选择后缀(l-b-w)
- 13. x86指令含义
- 14. Angular 2自定义指令的工作原理是什么?
- 15. 运行lsof后,ESTABLISHED指示器的含义是什么
- 16. 自定义UISilder的拇指
- 17. 指针指针的意义是什么?
- 18. 拇指指令与arm指令集相比如何增加?
- 19. 为什么纳克级的指令被我的自定义指令后,编译
- 20. 什么是序言指令?
- 21. 这是什么指令?
- 22. 什么是JVM指令?
- 23. 什么是指令? dojo dstore
- 24. 这是什么movsbl指令?
- 25. 什么是ng-app指令
- 26. 什么是callq指令?
- 27. 什么是每秒指令?
- 28. 什么是特权指令?
- 29. 什么是版本指令?
- 30. 错误:无效的`cmpxchg'指令后缀
它可以帮助汇编程序选择thumb2可以做的那个拇指不能。也许不是这种情况,但是你可能有一条可以用thumb或者thumb2编码的指令,通过使用类似这样的东西,你可以基本上要求一定的编码。一个较短的答案是“试一试”,写下一行代码,然后进行汇编和反汇编。 –