arm64 ldp指令编码

问题描述 投票:0回答:1

假设我写以下内容:

asm("ldp x0, x0 [x0, #0]!");

由于寄存器和立即数都是0,我们可以很容易地看到操作码编码:Godbolt将其呈现为

0xa9c00000

64 位预索引 LDP 指令的 ARM

文档
似乎表明它是
0x6dc00000
。在链接的文档中,它显示了。

  • 第 31-30 位是
    opc
    ,因此也是
    0b01
  • 第 29-22 位是
    0b10110111
  • 位 21-0 全部为零,因为
    imm7
    Rt2
    Rn
    Rt
    全部为零。
  • 在一起就形成了
    0b 01 10110111 0000000 00000 00000 00000
    ->
    0x6dc00000

如果“opc”字段由于某种原因是 BIG ENDIAN,那么我会得到

0xadc00000
,现在只有一位了......

我就是不明白...?

我怎么误读了ARM文档?

assembly arm64
1个回答
0
投票

您看错了

ldp
。您链接的文档适用于 SIMD/NEON 寄存器。您将加载
d0
,而不是
x0
。您需要查看通用寄存器版本

事实上,如果您将

ldp d0, d0, [x0, #0]!
喂入 godbolt,那么您就会得到
0x6dc00000
,正如您所期望的那样。

© www.soinside.com 2019 - 2024. All rights reserved.