我正在用ARM汇编编写一些程序。 我想写这个等价物:
int array_test(int index)
{
...
arr[0] = 3;
arr[1] = 9;
arr[2] = 6;
return arr[index];
}
我想为索引 0-2 设置数组值并在给定索引处返回数组值。
在我的程序中,我使用
x4 = 索引;SP, SP#4, SP#8 = arr[0], arr[1], arr[2];x0 = 返回值
要获取索引给出的数组元素,我想将索引乘以 4(对于 int 大小(并添加到 SP。但是,当我使用
LDR x0, [SP, x4, LSL#2] // Load to x0, (arr[index]) for return;
但是我在aarch64-linux-android-gcc上收到此错误:
error: expected 'lsl' or 'sxtx' with optional shift of #0 or #3
但是,我能够得到相同的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;
为什么我不能将LDR与LSL 一起使用 #2?似乎只有 #0 或 #3 有效。
感谢您的帮助!
您使用了具有 64 位目标寄存器的LDR指令,而不是 32 位。
64 位变体将 8 个字节加载到目标寄存器Xn,并允许 #0或#3的索引移位
32 位变体将四个字节加载到目标寄存器Wn,并允许 #0或#2的索引移位。寄存器Wn为零扩展以寄存器Xn
你应该使用LDR w0, [SP, x4, LSL#2]