1 从一个汇编错误说起
从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
命令有关,下文就简单介绍一下这个命令。
2 .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的官方文档