如何在表中查找值?

问题描述

在 arm64 上的 Go 汇编中,我创建了一个值表

DATA table<>+0(SB)/4,0x00000001
DATA table<>+4(SB)/4,0x00000002
DATA table<>+8(SB)/4,0x00000003
DATA table<>+12(SB)/4,0x00000004

但是我想要做的是从这个表中加载一个值到一个寄存器中,但是基于一个变量。

如果我有一个常数,我可以做到

MOVD table<>+4(SB),R1

所以 R1=0x00000002

但是我怎么能用变量来做呢?像……

MOVD $4,R0
MOVD table<>+R0(SB),R1

或者更好的是,我可以获取地址并直接加载向量吗?

我猜正常情况下的答案是 ADR,但是当我在 go 中尝试时

ADR table<>(SB),R0

我刚好

asm: illegal combination: 00280 [...] ADR table<>(SB),R9 ADDR NONE NONE REG,3 7

这可能是我见过的最没用的错误消息。

好的,所以如果我使用 PC 相对寻址,ADR 可以工作,但这显然不对。

解决方法

事实证明这真的很简单,你只需在变量前加一个 $

MOVD $table<>+0(SB),R0