现在的ARMv8中存在两种形式的汇编指令集,一种为兼容32系统架构的UAL汇编(UAL是对之前A32及T32汇编指令集的一种归一化),另外一种是在64位系统架构中使用的A64汇编。
备注:在ARMv8中使用的UAL与ARMv7相比并没有变化。
A64汇编的一般的句法格式和操作数顺序和UAL汇编相比并没有什么变化,但是还是存在一些不同,下面对主要的一些不同进行说明:
- 指令长度
A64的指令长度是固定的32位的,而UAL支持16位和32位的,并支持通过.W和 .N 的宽度说明符来指示汇编器去生成编码长度是16位/32位的T32指令(比如:B.W label
)。 - 通用寄存器长度选择
A64可以通过别名把64位的通用寄存器当32位的来用,只用到32位长度用W0-W30,用到64位的长度用X0-X30,而UAL只有32位的 R0-R15 - SP, LR, PC的差异
在A64是不能通过寄存器名字/编号来访问PC的,可以访问LR(与X30同义),而SP只在某些上下文中有意义(SP依赖以编号31的寄存器,但寄存器编号为31的寄存器在不同的上下文中可表示为SP,WZR/XZR,需要注意的是A64中是不存在 W31/X31这个命名的),但UAL中你即可以访问R13,R14,R15 也可以用SP,LR,PC来代替。 - 条件执行的表示方式
A64中要进行条件执行,指令助记符和条件码之间要有分隔符(用点"."表示),比如B.EQ label
,而UAL是没有分隔符的BEQ label
。 - 无条件执行中条件码作为操作数
A64提供了几种把条件码当作操作数的无条件执行指令(比如:CSEL w1,w2,w3,EQ
,这边的最后一个位置是条件码),而UAL中只有IT支持把条件码当做操作数。 - 扩展运算符
A64在多个指令中可支持控制第二个源寄存器的值进行部分符号/零扩展(比如:ADD X1, X2, W3, UXTB #2
,其中UXTB是扩展类型表示零扩展),UAL中没有类似的扩展运算符。
参考资料
【1】DUI0801I_armasm_user_guide
网友评论