内存访问指令(二)
文章目录
- 内存访问指令(二)
- 2、寻址模式和偏移量形式
- 2.3 寄存器偏移量
- 2.4 预索引模式
- 2.5 后变址寻址
- 2.6 字面量(PC 相对)寻址
- 2.6.1 加载常量
2、寻址模式和偏移量形式
2.3 寄存器偏移量
有时,相对于基址的偏移量并非恒定偏移量,而是动态计算并写入寄存器的。这意味着偏移量值可以在通用寄存器中指定,该通用寄存器的值会加到基址寄存器地址上或从基址寄存器地址中减去。这种寄存器偏移量形式在访问数组或数据块的程序中很常见。例如,在 C/C++ 中,代码 char c = my_string[i] 访问 my_string 数组第 i 个元素的单个字节,而 i 很可能存储或加载到寄存器中。
在深入探讨细节之前,让我们先来看看 A32 和 A64 指令集之间寄存器偏移量形式的差异。
A32 寄存器偏移量形式允许将偏移量值指定为通用寄存器。Rn 是基址寄存器,Rm 是寄存器偏移量。
LDR Rt, [Rn, Rm]A32 缩放寄存器偏移量形式允许将偏移量寄存器移位一个立即数,然后再将其应用于基址寄存器地址。此形式常用于 C/C++ 程序中,将数组索引按每个数组元素的大小缩放。此偏移量形式可用的移位运算包括 LSL、LSR、ASR、ROR 和 RRX。
LDR Rt, [Rn, Rm, <shift> #imm]A64 寄存器偏移量是 64 位通用寄存器 X0-X30 中的一个,语法标签为 Xm。请记住,在 A64 中,基址寄存器始终为 64 位 (Xn)。在这种情况下,SP 不能用作寄存器