假设我写以下内容:
asm("ldp x0, x0 [x0, #0]!");
由于寄存器和立即数都是0,我们可以很容易地看到操作码编码:Godbolt将其呈现为
0xa9c00000
。
64 位预索引 LDP
指令的 ARM
文档似乎表明它是
0x6dc00000
。在链接的文档中,它显示了。
opc
,因此也是 0b01
。0b10110111
。imm7
、Rt2
、Rn
和 Rt
全部为零。0b 01 10110111 0000000 00000 00000 00000
-> 0x6dc00000
。如果“opc”字段由于某种原因是 BIG ENDIAN,那么我会得到
0xadc00000
,现在只有一位了......
我就是不明白...?
我怎么误读了ARM文档?
您看错了
ldp
。您链接的文档适用于 SIMD/NEON 寄存器。您将加载 d0
,而不是 x0
。您需要查看通用寄存器版本。
事实上,如果您将
ldp d0, d0, [x0, #0]!
喂入 godbolt,那么您就会得到 0x6dc00000
,正如您所期望的那样。