assembly - 如何在 ARM-64 中使用逻辑移位为 #2 的 LDR?
问题描述
我正在用 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与#2的LSL一起使用?只有#0 或#3 似乎是有效的。
谢谢您的帮助!
解决方案
您将LDR指令与 64 位目标寄存器一起使用,而不是 32 位。
64 位变体将 8 个字节加载到目标寄存器Xn并允许#0或#3的索引移位
32 位变体将四个字节加载到目标寄存器Wn并允许#0或#2的索引移位。寄存器Wn被零扩展为寄存器Xn
你应该使用LDR w0, [SP, x4, LSL#2]
推荐阅读
- ms-access - 在 Ms Access 中打开 ODBC 连接时触发功能
- html - 下拉菜单隐藏在图片后面
- python - 删除熊猫系列中层次索引的第一个元素
- json - Firefox 扩展:contentscript 权限中的意外属性
- node.js - Hyperledger Fabric 和 NodeJS - 如何转换缓冲区
- sql - 日期格式更改为 dd/mm/yyyy 到 dd mon yy 在 sql server
- python - Python 的类型错误:str 和 int
- python-3.x - 单击时更改 QPushButton 的文本
- amazon-web-services - 安排 AWS lambda 函数在特定时间间隔内调用
- r - 正则表达式在 R 拆分问题中使用 rebus?