在 RISC-V 中遍历数组的不同方法

KER*_*KER 3 arrays assembly riscv

我目前正在通过 RISC-V 学习基本的汇编语言,并且我对循环数组的有效方法有点困惑。

如果我们将 a0 作为指向整数数组的指针,这是否足以移动到下一个元素?

  • lw s0, 0(a0) #指向数组的指针存储在s0中
  • lw s0 4(s0) #每次要移动到下一个元素时都调用它吗?

如果我也想修改该位置元素的实际值,我可以简单地使用 sw 吗?

我还知道使用 slli/srli 也可以让你进行转换,有人能解释一下这个概念吗?

谢谢你!

max*_*zig 7

遍历数组(有 n 个元素)的基本模式是这样的:

  1. 将数组起始地址存储在寄存器X中
  2. Y = X + n * 4使用移位和加指令将地址存储在寄存器 Y 中最后一个元素之后(例如)
  3. 取消引用 X(即lw从 X 中存在的地址加载字)并对该数组元素执行某些操作
  4. add使用指令将 X 增加字大小(例如 4 字节)
  5. 转移到步骤 3。如果 X 仍然小于 Y
  6. 遍历完成

关于修改:您可以修改寄存器中加载的数组元素,然后可以使用 将新的寄存器值存储回数组中sw