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
3add 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)