GNU汇编器——.syntax

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的官方文档

  • 5
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值