A64汇编 VS UAL汇编的差异

现在的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

你可能感兴趣的:(A64汇编 VS UAL汇编的差异)