ARM指令集中的缩写(Rn,Road,...)是什么意思?
What do the abbriviations (Rn, Rd, ...) in the instruction set of ARM mean?
最近我检查了 ARM Cortex-M3 处理器的指令集。
例如:
ADD <Rd>, <Rn>, <Rm>
这些缩写的确切含义是什么?
我猜他们指的是不同类型的地址,比如直接寻址、相对寻址等等。
但具体是什么?
谢谢!
它们只是用来定义寄存器的,小写字母只是用来分隔它们以便于解释。 Rd 是目的地,但 Rn、Rm 等只是您可以使用的任何寄存器。例如,在解释 "Rd equals Rn bitwise anded with Rm" 时,这是区分哪个是哪个的唯一方法,因为您不能使用数字。
它们可能是 Rx、Ry 等,也可能是 Ra、Rb...。
<Rx>
形式的操作数指的是 general-purpose 寄存器,即 r0-r15
(或可接受的别名,如 sp
、pc
等)。
我不确定它是否曾在任何地方被特别调用过,但有一个通用模式 "d" 表示目的地,"t" 表示目标,"n" 表示第一个操作数或基址寄存器,"m" 表示第二个操作数,有时 "a" 表示累加器。因此,为什么您可能会发现诸如 <Rdn>
(在破坏性的 two-operand 指令中)或 <Rt>, <Rt2>
(其中 64 位值保存在一对 GP 寄存器中)之类的名称。这在其他类型的寄存器中也是一致的,例如VADD.F32 <Sd>, <Sn>, <Sm>
.
基础知识:
Rd
是目的地,Rn
和 Rm
是来源。它们都是 general-purpose 整数寄存器; FP 将使用 Sd
/ Sn
/ Sm
或 Dd
/ Dn
/ Dm
表示单人或双人。
ARM 语法将目标放在左侧,read-only 源操作数之前。
有关更多信息,请参阅 Notlikethat 的回答。一些小的补充:
t
:在this post中,一位ARM员工评论说“t”可能意味着“转移”而不是“目标”。
由于t
一般出现在LDR、STR等内存指令中,我理解是“转移to/from内存”的意思,例如在 ARMARMv8-fa 上:
LDR <Xt>, [<Xn|SP>, (<Wm>|<Xm>){, <extend> {<amount>}}]
STR <Xt>, [<Xn|SP>, (<Wm>|<Xm>){, <extend> {<amount>}}]
其中t
是内存读写的source/destination。
这在STR和LDXR指令寄存器的描述中也进一步提出:
<Xt>
Is the 64-bit name of the general-purpose register to be transferred, encoded in the "Rt" field.
然而,LDR 指令显示“已加载”:
<Xt>
Is the 64-bit name of the general-purpose register to be loaded, encoded in the "Rt" field.
这个术语特别有意义,因为 ARM 是 RISC-y,因此执行内存 IO 的指令相对较少,而且它们倾向于这样做(不像 x86 中常见的添加和存储到内存).
t1
和 t2
:这些用于一次 load/store 两个值的内存指令,例如ARMv8 LDP/STP:
LDP <Xt1>, <Xt2>, [<Xn|SP>], #<imm>
STP <Xt1>, <Xt2>, [<Xn|SP>, #<imm>]!
n
和m
只是数学中常用的整数variable/index名字
s
:
STXR 指令从 Xt
存储到内存(与 STR 一样),但它也得到第二个 return 值(写入是否成功)到 Ws
:
STXR <Ws>, <Xt>, [<Xn|SP>{,#0}]
所以大概选择了 s
,因为它出现在 t
之前,就像 m
出现在 n
之前一样。
一些 ARMv7/aarch32 指令可以在寄存器中进行移位,Rs
是该寄存器的名称,例如:
ORR{<c>}{<q>} {<Rd>,} <Rn>, <Rm>, <shift> <Rs>
我不容易找到 aarch64 的。
如果它被记录在案,“第 C2 章关于 A64 指令描述”可能是一个很好的信息位置,但它不在那里
最近我检查了 ARM Cortex-M3 处理器的指令集。 例如:
ADD <Rd>, <Rn>, <Rm>
这些缩写的确切含义是什么? 我猜他们指的是不同类型的地址,比如直接寻址、相对寻址等等。 但具体是什么?
谢谢!
它们只是用来定义寄存器的,小写字母只是用来分隔它们以便于解释。 Rd 是目的地,但 Rn、Rm 等只是您可以使用的任何寄存器。例如,在解释 "Rd equals Rn bitwise anded with Rm" 时,这是区分哪个是哪个的唯一方法,因为您不能使用数字。
它们可能是 Rx、Ry 等,也可能是 Ra、Rb...。
<Rx>
形式的操作数指的是 general-purpose 寄存器,即 r0-r15
(或可接受的别名,如 sp
、pc
等)。
我不确定它是否曾在任何地方被特别调用过,但有一个通用模式 "d" 表示目的地,"t" 表示目标,"n" 表示第一个操作数或基址寄存器,"m" 表示第二个操作数,有时 "a" 表示累加器。因此,为什么您可能会发现诸如 <Rdn>
(在破坏性的 two-operand 指令中)或 <Rt>, <Rt2>
(其中 64 位值保存在一对 GP 寄存器中)之类的名称。这在其他类型的寄存器中也是一致的,例如VADD.F32 <Sd>, <Sn>, <Sm>
.
基础知识:
Rd
是目的地,Rn
和Rm
是来源。它们都是 general-purpose 整数寄存器; FP 将使用Sd
/Sn
/Sm
或Dd
/Dn
/Dm
表示单人或双人。
ARM 语法将目标放在左侧,read-only 源操作数之前。
有关更多信息,请参阅 Notlikethat 的回答。一些小的补充:
t
:在this post中,一位ARM员工评论说“t”可能意味着“转移”而不是“目标”。由于
t
一般出现在LDR、STR等内存指令中,我理解是“转移to/from内存”的意思,例如在 ARMARMv8-fa 上:LDR <Xt>, [<Xn|SP>, (<Wm>|<Xm>){, <extend> {<amount>}}] STR <Xt>, [<Xn|SP>, (<Wm>|<Xm>){, <extend> {<amount>}}]
其中
t
是内存读写的source/destination。这在STR和LDXR指令寄存器的描述中也进一步提出:
<Xt>
Is the 64-bit name of the general-purpose register to be transferred, encoded in the "Rt" field.然而,LDR 指令显示“已加载”:
<Xt>
Is the 64-bit name of the general-purpose register to be loaded, encoded in the "Rt" field.这个术语特别有意义,因为 ARM 是 RISC-y,因此执行内存 IO 的指令相对较少,而且它们倾向于这样做(不像 x86 中常见的添加和存储到内存).
t1
和t2
:这些用于一次 load/store 两个值的内存指令,例如ARMv8 LDP/STP:LDP <Xt1>, <Xt2>, [<Xn|SP>], #<imm> STP <Xt1>, <Xt2>, [<Xn|SP>, #<imm>]!
n
和m
只是数学中常用的整数variable/index名字s
:STXR 指令从
Xt
存储到内存(与 STR 一样),但它也得到第二个 return 值(写入是否成功)到Ws
:STXR <Ws>, <Xt>, [<Xn|SP>{,#0}]
所以大概选择了
s
,因为它出现在t
之前,就像m
出现在n
之前一样。一些 ARMv7/aarch32 指令可以在寄存器中进行移位,
Rs
是该寄存器的名称,例如:ORR{<c>}{<q>} {<Rd>,} <Rn>, <Rm>, <shift> <Rs>
我不容易找到 aarch64 的。
如果它被记录在案,“第 C2 章关于 A64 指令描述”可能是一个很好的信息位置,但它不在那里