ARM数据处理指令汇编

引入

任何给定指令的操作数都是取决于正在执行的指令类型,数据处理指令总是先列出目标寄存器然后再列出指令的输入.

在A32/T32中目标寄存器为Rd,而在A64目标寄存器为Xd或Wd.
同样的在A32/T32中输入寄存器为Rm、Rn或Ra,而在A64则为Xn或Xm.

先看这汇编代码

1
add x0, x1, x2; x0=x1+x2

指令将ADD将两个64位源寄存器值x1和X2相加,并将64位结果存储在寄存器x0中。

在A64中有种指令角算术指令这些指令通常带有一个s后缀,它可以根据结果设置算术标志位。它对基本语法没有影响.

1
adds x0, x1, x2; x0=x1+x2 and set flags

有时候两条不同的指令可能具有相同的指令编码,其中一个会被视作另一个别名.

任何给定的指令都可以被编码位以不同的方式处理其寄存器.
例如A32指令使用以下源操作数形式:

  • 寄存器形式
  • 常量立即数形式
  • 移位寄存器形式
  • 寄存器-移位寄存器形式
  • 拓展寄存器形式

使用寄存器、常量立即数、移位寄存器的A64 ADD 三个指令寄存器

1
2
3
add x0, x0, x1
add x0, x0, #100
add x0, x1, x1, LSL #1

对于任何给定的指令,了解其不同的指令形式式非常重要的.

移位和循环移位

许多指令可以包含移位和循环移位(rotate)操作,也可以作为单独指令存在.
A64指令集支持四种基本类型的移位操作:

  • 逻辑左移(Logical Shift Left, LSL)
  • 逻辑右移(Logical Shift right, LSR)
  • 算术右移(Arithmetic Shift Right, ASR)
  • 循环右移(Rotate Right, ROR)

A32/T32指令集提供了第五种位移类型:待拓展的循环右移(Roate Right with Extend, RRX)