五、汇编语言和指令集

ARMv7是32位的CPU架构,绝大多数的处理器都支持ARM指令集和THUMB指令集。但是仍有一些处理器不支持ARM指令集,比如CORTEX-M3系列的处理器,只支持THUMB指令集(注意,虽然M3系列的处理器支持THUMB-2技术,可以将指令扩展到32位,但是仍然属于THUMB指令集)。

ARM指令是32位的,追求高性能;THUMB指令是16位的,追求高密度。对于支持THUMB-2技术的处理器,由于将THUMB指令扩展到了32位,使得16位和32位的指令可以混合使用,因而可以兼顾性能和代码密度(在CPU支持THUMB-2的情况下,编译器会优先采用)。

再说汇编语言,在ARM开发领域,会用到两种汇编语言——GNU汇编和ARM汇编,不同的汇编语言语法都不尽相同。GNU汇编是GNU编译工具链使用的汇编语言,ARM汇编是ARM官方编译工具链使用的汇编语言。由于GNU工具链开源,各种不同架构的处理器都有对应的GNU工具链可以使用,所以GNU汇编用得更普遍。

那么,我们该怎么区分一段汇编代码是GNU汇编还是ARM汇编呢?可以从以下几点区分它们:

1)从汇编命令的声明格式区分
GNU汇编声明中的LABEL带冒号,注释通常使用@符号,格式如下所示:

label: instruction @ comment

ARM汇编声明中的LABEL不带冒号,注释通常使用分号,格式如下所示:

label instruction ; comment

注意,无论是GNU汇编还是ARM汇编,都可以使用C风格的/**/注释。

2)GNU汇编的汇编命令(Directives)前都有一个点号".",比如.section, .align等等。

之前说了ARMv7架构的处理器支持ARM和THUMB两种指令集,以前在使用汇编语言编程的时候,因为ARM指令和THUMB指令不相同,使用ARM指令写的汇编语言不能编译成THUMB指令集,使用THUMB指令写的汇编语言也不能被编译成ARM指令集。后来,为了在汇编语言语法层面统一ARM指令和THUMB指令,ARM推出了UAL(统一汇编语言),并且开始在自己的开发工具中使用。这样,开发人员使用UAL指令编写的汇编代码,只需要在编译的时候通过参数指定要是用ARM指令集还是THUMB指令集就可以了;或者在代码里面通过.arm或.thumb指定接下来的一段代码应该使用ARM指令集还是THUMB指令集;对于THUMB-2指令,也可以手动在每条指令后面加上.W或.N的后缀来指定使用16位指令还是32位指令。对于没有指定后缀的,会优先生成16位的指令来减小代码体积。不能用16位指令生成的,则生成32位的指令。如果通过.N强制声明为生成16位指令,但是实际无法生成的时候,则会报错。要注意的是,有的GNU工具链也已经开始支持UAL语法了。

综上,我们便可以区分普通的GNU汇编,普通的ARM汇编;UAL的GNU汇编,UAL的ARM汇编。但是有时候,我们还需要区分汇编代码使用的指令集是ARM还是THUMB,或者是支持THUMB-2技术的THUMB,可以按照如下一些原则来判断:
1)代码中的.thumb或者.code 16表示接下来的指令是THUMB指令。.arm或者.code 32表示接下来的指令是ARM指令。
2)代码中的 .thumb_func表示函数使用THUMB指令生成。
3)传统的32位ARM指令通常带有3个,甚至4个操作数;或者非分跳转的条件执行指令,比如 ADDNE R0, R0, #1
4)THUMB-2技术引入了If-Then指令,用于支持指令的条件执行。

对于支持THUMB-2技术的CPU,编译器会优先使用THUMB-2指令。当代码里面混合使用了ARM指令和THUMB指令时,需要切换处理器状态。当从ARM指令跳转到THUMB指令执行时,应将处理器由ARM状态切换到THUMB状态,反之亦然。跳转并切换状态可以使用BX或BLX指令,使用目标地址的最低位来表示是否要切换到THUMB状态(因为ARM指令和THUMB指令都不会用到目标地址的最低位,故其可以被用来标识目标状态)。如果最低位为1,表示切换到THUMB状态,为0表示切换到ARM状态。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值