如何在 ARM-64 中使用逻辑移位为 #2 的 LDR?

MG4*_*G47 1 assembly arm64

我正在用 ARM 汇编编写一些程序。我想写这样的等价物:

int array_test(int index)
{
    ...
    arr[0] = 3;
    arr[1] = 9;
    arr[2] = 6;
    return arr[index];
}
Run Code Online (Sandbox Code Playgroud)

我想为索引 0-2 设置数组值并在给定索引处返回数组值。

在我的程序中,我使用

x4 = 索引;SP, SP#4, SP#8 = arr[0], arr[1], arr[2]; x0 = 返回值

要获得由索引给出的数组元素,我想将索引乘以 4(对于整数大小)并添加到 SP。但是,当我使用

LDR x0, [SP, x4, LSL#2]     // Load to x0, (arr[index]) for return;
Run Code Online (Sandbox Code Playgroud)

但是我在使用 aarch64-linux-android-gcc 时遇到了这个错误:

error: expected 'lsl' or 'sxtx' with optional shift of #0 or #3
Run Code Online (Sandbox Code Playgroud)

但是,我可以通过 LSL 和 LDR 获得相同的结果:

LSL x4, x4, #2      // multiply index by 4 for 32-bit int
LDR x0, [SP, x4]    // Load to x0, (arr[index]) for return;
Run Code Online (Sandbox Code Playgroud)

为什么我不能用LDRLSL#2?只有#0 或#3 似乎是有效的。

谢谢您的帮助!

小智 5

您使用了带有 64 位目标寄存器而不是 32 位的LDR指令。

64 位变体将 8 个字节加载到目标寄存器Xn并允许#0#3 的索引移位

32 位变体将四个字节加载到目标寄存器Wn并允许#0#2 的索引移位。寄存器Wn零扩展到寄存器Xn

你应该使用 LDR w0, [SP, x4, LSL#2]