ARM指令集中的abbriviations(Rn,Rd,...)是什么意思?

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>.


Sam*_*nen 5

它们只是用来定义寄存器,小写字母只是用来分隔它们以供解释。Rd 是目的地,但 Rn、Rm 等只是您可以使用的任何寄存器。例如,这是在解释“Rd 等于 Rn 按位并与 Rm 相加”时判断哪个是哪个的唯一方法,因为您不能使用数字。

它们也可以是 Rx、Ry 等,或 Ra、Rb...。


Cir*_*lli 4

基本:

  • Rd是目的地,Rn也是Rm来源。它们都是通用整数寄存器;FP 将使用Sd/ Sn/SmDd/ Dn/Dm表示单数或双数。
    ARM 语法将目标放在左侧、只读源操作数之前。

有关更多信息,请参阅 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 中常见的添加和存储到内存不同)。

  • t1t2:这些用于同时加载/存储两个值的内存指令,例如 ARMv8 LDP/STP:

    LDP <Xt1>, <Xt2>, [<Xn|SP>], #<imm>
    STP <Xt1>, <Xt2>, [<Xn|SP>, #<imm>]!
    
    Run Code Online (Sandbox Code Playgroud)
  • nm只是数学中常用的整数变量/索引名称

  • 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 指令描述”可能是获取该信息的好位置,但它不在那里