Bil*_*mba 3 assembly arm thumb
最近我检查了ARM Cortex-M3处理器的指令集.例如:
ADD <Rd>, <Rn>, <Rm>
Run Code Online (Sandbox Code Playgroud)
这些abbriviations究竟意味着什么?我猜他们的意思是不同类型的地址,如直接解决,相对解决等等.但到底是什么?
谢谢!
Not*_*hat 10
形式的操作数<Rx>
是指通用寄存器,即r0-r15
(或接受别名等sp
,pc
等).
我不确定它是否曾在任何地方被特别指出,但是有一个"d"表示目的地的一般模式,"t"表示目标,"n"表示第一个操作数或基址寄存器,"m"表示第二个操作数,偶尔"a"表示累加器.因此,为什么你可能会发现像<Rdn>
(在破坏性的双操作数指令中)或<Rt>, <Rt2>
(在一对GP寄存器中保持64位值)的指定.这在其他类型的寄存器中也是一致的,例如VADD.F32 <Sd>, <Sn>, <Sm>
.
它们只是用来定义寄存器,小写字母只是用来分隔它们以供解释。Rd 是目的地,但 Rn、Rm 等只是您可以使用的任何寄存器。例如,这是在解释“Rd 等于 Rn 按位并与 Rm 相加”时判断哪个是哪个的唯一方法,因为您不能使用数字。
它们也可以是 Rx、Ry 等,或 Ra、Rb...。
基本:
Rd
是目的地,Rn
也是Rm
来源。它们都是通用整数寄存器;FP 将使用Sd
/ Sn
/Sm
或Dd
/ Dn
/Dm
表示单数或双数。有关更多信息,请参阅 Notlikethat 的答案。一些小的补充:
t
:在这篇文章中,一位 ARM 员工评论说“t”可能意味着“转移”而不是“目标”。
由于t
通常出现在 LDR 和 STR 等内存指令中,我理解这意味着“传输到内存/从内存传输”,例如在 ARMARMv8-fa 上:
LDR <Xt>, [<Xn|SP>, (<Wm>|<Xm>){, <extend> {<amount>}}]
STR <Xt>, [<Xn|SP>, (<Wm>|<Xm>){, <extend> {<amount>}}]
Run Code Online (Sandbox Code Playgroud)
其中t
是内存读取和写入的源/目标。
STR 和 LDXR 指令寄存器的描述中也进一步建议了这一点:
<Xt>
是要传输的通用寄存器的 64 位名称,编码在“Rt”字段中。
然而,LDR 指令表示“已加载”:
<Xt>
是要加载的通用寄存器的 64 位名称,编码在“Rt”字段中。
这个术语特别有意义,因为 ARM 是 RISC-y,因此执行内存 IO 的指令相对较少,而且它们往往就是这样做的(与 x86 中常见的添加和存储到内存不同)。
t1
和t2
:这些用于同时加载/存储两个值的内存指令,例如 ARMv8 LDP/STP:
LDP <Xt1>, <Xt2>, [<Xn|SP>], #<imm>
STP <Xt1>, <Xt2>, [<Xn|SP>, #<imm>]!
Run Code Online (Sandbox Code Playgroud)
n
和m
只是数学中常用的整数变量/索引名称
s
:
STXR 指令将数据存储到内存Xt
(如 STR),但它还会获得第二个返回值(写入是否成功)Ws
:
STXR <Ws>, <Xt>, [<Xn|SP>{,#0}]
Run Code Online (Sandbox Code Playgroud)
所以大概s
被选中是因为它出现在之前,t
就像m
出现在之前一样n
。
某些 ARMv7/aarch32 指令可能会在寄存器中进行移位,这Rs
是该寄存器的名称,例如:
ORR{<c>}{<q>} {<Rd>,} <Rn>, <Rm>, <shift> <Rs>
Run Code Online (Sandbox Code Playgroud)
我无法轻松找到 aarch64 的。
如果有记录,“C2 章关于 A64 指令描述”可能是获取该信息的好位置,但它不在那里