【问题标题】:Different ways to traverse arrays in RISC-V在 RISC-V 中遍历数组的不同方法
【发布时间】:2020-02-27 09:48:18
【问题描述】:

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

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

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

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

我也知道使用 slli/srli 也可以让你转变,谁能解释一下这个概念?

谢谢!

【问题讨论】:

  • 让我们把你的想法推向逻辑极端:如果数组有一千个元素长怎么办?你打算写一个不同的lw 来访问每个元素吗?相当不切实际,不是吗?相反,您想增加指针变量本身,并使用循环。
  • 不,lw s0, 4(s0) 不会增加 s0,它会取消引用 4+s0。您可以使用它来遍历 linked list,其中 .next 成员是第二个单词。
  • 换档确实是一个不同的话题,最好放在不同的问题上。尽管使用查询 bit shifting 进行网络搜索应该会找到足够的材料来解释这个概念。

标签: arrays assembly riscv


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-29
    • 2012-05-16
    相关资源
    最近更新 更多