如何在 ARM-64 中使用逻辑移位为 #2 的 LDR?
How to use LDR with logical shift of #2 in ARM-64?
我正在用 ARM 汇编编写一些程序。
我想写这样的等价物:
int array_test(int index)
{
...
arr[0] = 3;
arr[1] = 9;
arr[2] = 6;
return arr[index];
}
我想在其中设置索引 0-2 的数组值和 return 给定索引处的数组值。
在我的程序中,我使用
x4 = 索引; SP, SP#4, SP#8 = arr[0], arr[1], arr[2]; x0 = return 值
为了得到索引给出的数组元素,我想将索引乘以 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 和 #2 的 LSL?只有#0 或#3 似乎是有效的。
感谢您的帮助!
您使用了 LDR 指令和 64 位目标寄存器而不是 32 位。
64 位变体将八个字节加载到目标寄存器 Xn 并允许索引移位 #0 或 # 3
32 位变体将四个字节加载到目标寄存器 Wn 并允许索引移位 #0 或 # 2。寄存器 Wn 零扩展到寄存器 Xn
你应该使用LDR w0, [SP, x4, LSL#2]
我正在用 ARM 汇编编写一些程序。 我想写这样的等价物:
int array_test(int index)
{
...
arr[0] = 3;
arr[1] = 9;
arr[2] = 6;
return arr[index];
}
我想在其中设置索引 0-2 的数组值和 return 给定索引处的数组值。
在我的程序中,我使用
x4 = 索引; SP, SP#4, SP#8 = arr[0], arr[1], arr[2]; x0 = return 值
为了得到索引给出的数组元素,我想将索引乘以 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 和 #2 的 LSL?只有#0 或#3 似乎是有效的。
感谢您的帮助!
您使用了 LDR 指令和 64 位目标寄存器而不是 32 位。
64 位变体将八个字节加载到目标寄存器 Xn 并允许索引移位 #0 或 # 3
32 位变体将四个字节加载到目标寄存器 Wn 并允许索引移位 #0 或 # 2。寄存器 Wn 零扩展到寄存器 Xn
你应该使用LDR w0, [SP, x4, LSL#2]