为了更好地支持Thumb-2,ARM汇编器引了一个“统一汇编语言(UAL)”语法机制。对于16位指令和32位指令均能实现的一些操作(常见于数据处理操作)。有时虽然指令的实际操作数不同,或者对立即数的长度有不同的限制,但是汇编器允许开发者统一使用32位Thumb-2指令的语法格式书写(很多Thumb-2指令的用法也与32位ARM指令相同),并且由汇编器来决定是使用16位指令,还是使用32位指令。以前,Thumb的语法和ARM的语法不同,在有了UAL之后,两者的书写格式就统一了。
虽然引入了UAL,但是仍然允许使用传统的Thumb语法。不过有一项必须注意:如果使用传统的Thumb语法,即使你没有加上S后缀,有些指令也会默认更新APSR。如果使用UAL语法,则必须指定S后缀才会更新。例如:
在Thumb-2指令集中,有些操作既可以由16位指令完成,也可以由32位指令完成。例如,R0=R0+1这样的操作,16位的与32位的指令都提供了助记符为“ADD”的指令。在UAL下,汇编器能主动决定用哪个,也可以手工指定是用16位的还是32位的:
.W(Wide)后缀指定32位指令。如果没有给出后缀,汇编器会先试着用16位指令给代码瘦身,如果不行再使用32位指令。因此,使用“.N”其实是多此一举,不过汇编器可能仍然允许这样的语法。这是ARM公司汇编器的语法,其他汇编器可能略有区别,但如果没有给出后缀,汇编器就总是会尽量选择更短的指令。(www.xing528.com)
其实在绝大多数情况下,应用程序是用C写的,C编译器也会尽可能地使用短指令。然而,当立即数超出一定范围时,或者32位指令能更好地适合某个操作时,将使用32位指令。
32位Thumb-2指令也可以按半字对齐(以前ARM 32位指令都必须按字对齐),因此下例是允许的:
绝大多数16位指令只能访问R0—R7;32位Thumb-2指令则可以随意访问R0—R15。不过,把R15(PC)作为目的寄存器很容易有意想不到的妙处,出错时则会使程序跑飞。通常只有系统软件才会不惜冒险地做此高危行为,因此还需慎用。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。