ARM文档翻译(三)----指令篇(一)

A64常用指令

介绍A64常用指令

A64指令的寄存器限制

在A64指令中,通用寄存器对于32位寄存器是W0-W30,对于64位寄存器是X0-X30。

不能通过数字来引用31寄存器,在一些指令说明中,可以使用以下名称来引用它:

WSP

​ 当前的栈指针(32bit)

SP

​ 当前的栈指针(64bit)

WZR

​ 零寄存器(32bit)

XZR

​ 零寄存器(64bit)

在指令语法中,只能使用这些名字中的一个来引用它。

您不能通过名称或数字显式地引用程序计数器(PC)。

ADC

带进位的加法。

语法
1
2
ADC	Wd,Wn,Wm	;32 bit
ADC Xd,Xb,Xm ;64 bit
注解:

Wd

​ 32位目标通用寄存器

Wn

​ 32位第一个源通用寄存器

Wm

​ 32位第二个源通用寄存器

Xd

​ 64位目标通用寄存器

Xn

​ 64位第一个源通用寄存器

Xm

​ 64位第二个源通用寄存器

运算

带进位的加法,将两个寄存器的值和C标志位的值相加,并将结果写入目标寄存器。

1
Rd = Rn + Rm + C	(R代表 W 或者 X)。	
ADCS

带进位加法,且影响标志位。

语法
1
2
3
ADCS	Wd,Wn,Wm	;32 位

ADCS Xd,Xn,Xm ;64位
注释

Wd

32位目标通用寄存器

Wn

32位第一个源通用寄存器

Wm

32位第二个源通用寄存器

Xd

64位目标通用寄存器

Xn

64位第一个源通用寄存器

Xm

64位第二个源通用寄存器

运算

带标志位加法运算,并且结果影响标志位。将两个源寄存器的值和C标志位的值相加,并将结果写入目标寄存器。结果会更新(如果发生进位)条件标志位。

1
Rd = Rn + Rm + C (R代表 W 或 X)。
ADD(带寄存器扩展运算)

带有寄存器扩展操作的加法运算。

语法
1
2
3
ADD	Wd|WSP,	Wn|WSP,	Wm{,	extend{#amount}}	;32位

ADD Xd|SP, Xn|SP, Rm{, extend{amount}} ;64位
注解

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
2
ADD	Wd|WSP,	Wn|WSP,	#imm{,	shift}	;32位
ADD Xd|SP, Xn|Sp, #imm{, shift} ;64位

注释:

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
2
ADD	Wd,	Wn,	Wm{,	shitf	#amount}	;32位
ADD Xd, Xn, Xm{, shift #amount} ;64位
注释

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
2
ADDS	Wd,	Wn|WSP	Wm{,	extend{#amount}}	;32位
ADDS Xd, Xn|SP, Rm{, extend{#amount}} ;64位
注释

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
2
ADDS	Wd,	Wn|WSP,	#imm{,	shift}	;32位
ADDS Xd, Xd|SP, #imm{, shift} ;64位
注释

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
2
3
ADDS	Wd,	Wn,	Wm{,	shift	#amount}	;32位

ADDS Xd, Xn, Xm{, shift #amount} ;64位
注释

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	。