A64常用指令
介绍A64常用指令
A64指令的寄存器限制
在A64指令中,通用寄存器对于32位寄存器是W0-W30,对于64位寄存器是X0-X30。
不能通过数字来引用31寄存器,在一些指令说明中,可以使用以下名称来引用它:
WSP
当前的栈指针(32bit)
SP
当前的栈指针(64bit)
WZR
零寄存器(32bit)
XZR
零寄存器(64bit)
在指令语法中,只能使用这些名字中的一个来引用它。
您不能通过名称或数字显式地引用程序计数器(PC)。
ADC
带进位的加法。
语法
1 | ADC Wd,Wn,Wm ;32 bit |
注解:
Wd
32位目标通用寄存器
Wn
32位第一个源通用寄存器
Wm
32位第二个源通用寄存器
Xd
64位目标通用寄存器
Xn
64位第一个源通用寄存器
Xm
64位第二个源通用寄存器
运算
带进位的加法,将两个寄存器的值和C标志位的值相加,并将结果写入目标寄存器。
1 | Rd = Rn + Rm + C (R代表 W 或者 X)。 |
ADCS
带进位加法,且影响标志位。
语法
1 | ADCS Wd,Wn,Wm ;32 位 |
注释
Wd
32位目标通用寄存器
Wn
32位第一个源通用寄存器
Wm
32位第二个源通用寄存器
Xd
64位目标通用寄存器
Xn
64位第一个源通用寄存器
Xm
64位第二个源通用寄存器
运算
带标志位加法运算,并且结果影响标志位。将两个源寄存器的值和C标志位的值相加,并将结果写入目标寄存器。结果会更新(如果发生进位)条件标志位。
1 | Rd = Rn + Rm + C (R代表 W 或 X)。 |
ADD(带寄存器扩展运算)
带有寄存器扩展操作的加法运算。
语法
1 | ADD Wd|WSP, Wn|WSP, Wm{, extend{#amount}} ;32位 |
注解
Wd|WSP
32位目标寄存器或者栈指针
Wn|WSP
32位第一个源通用寄存器或者栈指针
Wm
32位第二个源通用寄存器
extend
应用在第二个源操作数(寄存器)的扩展:
- 32位通用寄存器
可以是UXTB、UXTH、LSL|UXTW、UXTX、SXTB、SXTH、SXTW、SXTX中的一个。
如果Rd或者Rn是WSP,那么LSL比UXTW更好,并且在amount
为0时可以忽略。在所有其他情况下,扩展是必须的,并且必须是UXTW而不是LSL。
- 64位通用寄存器
可以是UXTB、UXTH、UXTW、LSL|UXTX、SXTB、SXTH、SXTW、SXTX中的一个。
如果Rd或Rn是SP,那么LSL比UXTX更好,并且在数量为0时可以省略。在所有其他情况下,扩展是必需的,并且必须是UXTX而不是LSL。
Xd|SP
64位目标通用寄存器或者栈指针
Xn|SP
64位第一个源通用寄存器或者栈指针
R
宽度指示符,可以是 W 或者 X 。
m
是第二个源通用寄存器的编号【0-30】,或者ZR(31)
amount
在0到4的范围内扩展后要应用的左移量,默认为0,当extend
不存在时,amount
也是不存在的,当extend
是LSL时,它是必需的;当extend
存在但又不是LSL时,它是可选的。
运算
带扩展寄存器的加法运算,将一个通用寄存器中的值和另一个带有符号扩展运算或者无符号扩展运算的通用寄存器的值相加,然后把结果写入到目标寄存器。从Rm寄存器扩展的参数可以是字节、半字、字或者双字。
1 | Rd = Rn = LSL(extend(Rm),amount)(R代表 W 或者 X) |
用法
ADD
指令(64位寄存器)组合说明符
R | extend |
---|---|
W | SXTB |
W | SXTH |
W | SXTW |
W | UXTB |
W | UXTH |
W | UXTW |
X | LSL|UXTX |
X | SXTX |
ADD(立即数)
这个指令通常被用作MOV指令(从SP或者到SP)。
语法
1 | ADD Wd|WSP, Wn|WSP, #imm{, shift} ;32位 |
注释:
Wd|WSP
32位目标通用寄存器或者栈指针。
Wn|WSP
32位源通用寄存器或者栈指针。
Xd|SP
64位目标通用寄存器或栈指针。
imm
无符号立即数,范围:【0,4095】。
shift
被应用到立即数上的左移操作,默认是LSL #0
,可以是LSL #0
或者LSL #12
。
运算
将一个寄存器上的值和可选移位的立即数的值相加,再把结果写入到目标寄存器。
1 | Rd = Rn + shift( imm )(R代表 W 或者 X ) |
ADD(带寄存器移位操作)
语法
1 | ADD Wd, Wn, Wm{, shitf #amount} ;32位 |
注释
Wd
32位目标通用寄存器
Wn
32位第一个源通用寄存器
Wm
32位第二个源通用寄存器
amount
取决于指令:
- 32位通用寄存器
移位数,范围:【0,31】,默认是0。
- 64位通用寄存器
移位数,范围:【0,63】,默认是0。
Xd
64位目标通用寄存器
Xn
64位第一个源通用寄存器
Xm
64位第二个源通用寄存器
shift
第二个操作数的移位操作类型,默认是LSL,可以是LSL、LSR、ASR中的一个。
运算
将一个寄存器的值和另一个可选移位操作的寄存器的值相加,并将结果存入目标寄存器。
1 | Rd = Rn + shift(Rm, amount)(R代表 W 或者 X) |
ADDG
带标记的加法指令。
语法
1 | ADDG Xd|SP Xn|SP, #<uimm6>, #uimm4 |
注释
Xd|SP
64位目标通用寄存器或者栈指针。
Xn|SP
64位源通用寄存器或者栈指针。
<uimm6>
无符号立即数,0~1008之间的16的倍数。
<uimm4>
无符号立即数,0~15之间。
架构支持
支持Armv8.5及更高版本。
使用
向源寄存器中的地址添加由标记颗粒缩放的即时值,使用即时值修改地址的逻辑地址标记,并将结果写入目标寄存器。在GCR_EL1中指定的标记。当修改逻辑地址标记时,从可能的输出中排除Exclude。
ADDS(带寄存器扩展)
带扩展寄存器的加法指令,影响标志位。
这个指令通常被用作CMN(带扩展寄存器)。
语法
1 | ADDS Wd, Wn|WSP Wm{, extend{#amount}} ;32位 |
注释
Wd
32位目标通用寄存器。
Wn|WSP
32位第一个源通用寄存器或者栈指针。
Wm
第二个源通用寄存器。
extend
应用于第二个源操作数的扩展:
- 32位通用寄存器
可以是UXTB, UXTH, LSL|UXTW, UXTX, SXTB, SXTH, SXTW或SXTX。
如果Rn是WSP,那么LSL是首选而不是UXTW,并且当amount
为0时可以省略。在所有其他情况下,extend
是必需的,并且必须是UXTW而不是LSL。
- 64位通用寄存器
可以是UXTB, UXTH, UXTW, LSL|UXTX, SXTB, SXTH, SXTW或SXTX。
如果Rn是SP,那么LSL比UXTX更好,并且当amount
为0时可以省略。在所有其他情况下,extend
是必需的,并且必须是UXTX而不是LSL。
Xd
64位目标通用寄存器。
Xn|SP
64位第一个源通用寄存器或者栈指针。
R
宽度指示符,可以是W或X。
m
是第二个通用源寄存器的编号[0-30]或名称ZR(31)。
amount
在0到4的范围内扩展后要应用的左移量,默认为0。当extend
不在时,它必须是空的;当extend
是LSL时,它是必需的;当extend
不是LSL时,它是可选的。
运算
加法指令(带扩展寄存器),设置标志,一个寄存器的值和一个符号或零扩展寄存器的值相加,后面跟着一个可选的左移位量,将结果写入目标寄存器。从Rm寄存器扩展的参数可以是字节、半字、字或双字。它根据结果更新条件标志。
1 | Rd = Rn + LSL(extend(Rm), amount) ;R代表W 或者 X |
ADDS指令(64位通用寄存器)说明符组合
R | Extend |
---|---|
W | SXTB |
W | SXTH |
W | SXTW |
W | UXTB |
W | UXTH |
W | UXTW |
X | LSL|UXTX |
X | SXTX |
ADDS(立即数)
加法指令(立即数),设置标志位。
这个指令通常被用作CMN(立即数)
语法
1 | ADDS Wd, Wn|WSP, #imm{, shift} ;32位 |
注释
Wd
32位目标通用寄存器。
Wn|WSP
32位源通用寄存器或者栈指针。
Xd
64位目标通用寄存器。
Xn|SP
64位源通用寄存器或者栈指针。
imm
无符号立即数,范围:0~4095。
shift
附加在立即数上的左移操作,默认是LSL #0
,可以是LSL #0
或者LSL #12
。
运算
加法指令(立即数),设置标志位,将一个寄存器的值和一个带左移操作的立即数的值相加,结果写入目标寄存器。并基于结果更新条件标志位。
1 | Rd = Rn + shift(imm) ;R代表 W 或者 X。 |
ADDS(移位寄存器)
ADD指令(带寄存器移位),设置标志位。
这个指令通常被用作CMN(寄存器移位)
。
语法
1 | ADDS Wd, Wn, Wm{, shift #amount} ;32位 |
注释
Wd
32位目标通用寄存器。
Wn
32位第一个源通用寄存器。
Wm
32位第二个源通用寄存器。
amount
取决于指令变量:
- 32位通用寄存器
移位量,在0~31之间,默认是0。
- 64位通用寄存器
移位量,在0~63之间,默认是0。
Xd
64位目标通用寄存器。
Xn
64位第一个源通用寄存器。
Xm
64位第二个源通用寄存器。
shift
是要应用于第二个源操作数的可选移位类型,默认是LSL,可以是LSL、LSR或者ASR。
运算
Add指令(寄存器移位),设置标志位,将一个寄存器的值,和另一个可选移位操作的寄存器的值相加,然后将结果写入到目标寄存器中。且在结果的基础上更新标志位。
1 | Rd = Rn + shift(Rm, amount) ;R代表 W 或者 X 。 |