从u-boot移植了一些代码,在编译时GNU汇编器报告了一些错误:
Error: bad instruction `movsne r3,r3,lsr#4' Error: bad instruction `subsge r2,r2,#4' Error: bad instruction `movsne r2,r2,lsr#4' Error: bad instruction `subsge r2,r2,#4'错误本身并不难懂,说的是汇编器不认识上述指令。然而,让人不解的是,上述的几条指令完全是合法的ARM指令,汇编器怎么不认识呢?折腾了好一会儿才知道这和GNU汇编器的.syntax命令有关,下文就简单介绍一下这个命令。
.syntax命令是ARM架构独有的命令,用法很简单.syntax [unified | divided]。作用是在汇编ARM汇编源时,指定按照怎样的语法规则进行汇编。如果在编写汇编语言时不使用该命令指定语法规则,那么默认采用.syntax divided,此时使用旧的汇编风格,ARM和THUMB指令有着各自的语法。正是在这种情况下,汇编器报了第1节中所说的错误,可能是指令采用了新的汇编风格,和旧的不兼容。
使用.syntax unified时,ARM和THUMB指令使用统一的语法,有着以下的主要特性:
立即数不需要#前缀可能会出现IT指令,如果出现,则根据后面的条件码进行验证。在ARM模式下,它不会生成机器码,而在THUMB模式下则会生成机器码对于ARM指令,条件码总是出现在指令的最后;对于THUMB指令,条件码可以被使用,但仅限于IT指令的范围内V6T2架构(及更高版本)的所有新指令都可用(这些指令中,divided语法仅支持少部分)支持.N和.W后缀在添加了.syntax unified后,汇编器不再报错。
[1] GNU的官方文档