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(或可接受的别名,如 sppc 等)。

我不确定它是否曾在任何地方被特别调用过,但有一个通用模式 "d" 表示目的地,"t" 表示目标,"n" 表示第一个操作数或基址寄存器,"m" 表示第二个操作数,有时 "a" 表示累加器。因此,为什么您可能会发现诸如 <Rdn>(在破坏性的 two-operand 指令中)或 <Rt>, <Rt2>(其中 64 位值保存在一对 GP 寄存器中)之类的名称。这在其他类型的寄存器中也是一致的,例如VADD.F32 <Sd>, <Sn>, <Sm>.

基础知识:

  • Rd 是目的地,RnRm 是来源。它们都是 general-purpose 整数寄存器; FP 将使用 Sd / Sn / SmDd / 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 中常见的添加和存储到内存).

  • t1t2:这些用于一次 load/store 两个值的内存指令,例如ARMv8 LDP/STP:

    LDP <Xt1>, <Xt2>, [<Xn|SP>], #<imm>
    STP <Xt1>, <Xt2>, [<Xn|SP>, #<imm>]!
    
  • nm只是数学中常用的整数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 指令描述”可能是一个很好的信息位置,但它不在那里