Loops MIPS汇编,寄存器遍历?

Loops MIPS汇编,寄存器遍历?,loops,assembly,cpu-registers,mips32,Loops,Assembly,Cpu Registers,Mips32,您好,提前谢谢 我的问题是,是否可以遍历寄存器,比如在一个($t0)中有一个指针,然后将指针移动到另一个($t1) 我实际上想做的是在一个循环中读取8个整数并将它们存储在($s0-$s7)您可以尝试更改sw操作码中的位以指向递增寄存器,但这是一个糟糕的主意。我认为您最好的选择是自己编写展开的循环: lw $s0, $t0 addi $t0, $t0, 4 lw $s1, $t0 ... 重新安排以尽量减少暂停,但这是您将得到的最佳结果。您希望寄存器号是可变的吗?我不知道MIPS的内部和外部,但

您好,提前谢谢

我的问题是,是否可以遍历寄存器,比如在一个($t0)中有一个指针,然后将指针移动到另一个($t1)


我实际上想做的是在一个循环中读取8个整数并将它们存储在($s0-$s7)

您可以尝试更改
sw
操作码中的位以指向递增寄存器,但这是一个糟糕的主意。我认为您最好的选择是自己编写展开的循环:

lw $s0, $t0
addi $t0, $t0, 4
lw $s1, $t0
...

重新安排以尽量减少暂停,但这是您将得到的最佳结果。

您希望寄存器号是可变的吗?我不知道MIPS的内部和外部,但我怀疑这是可能的。据我所知,只有SPARC(寄存器窗口,不能用于您想要的内容)和IA64(“旋转寄存器”,可以用于您想要的内容,但只能用于浮点)。

我不知道现有的MIPS体系结构支持通过寄存器内容引用寄存器,这将允许您建议的类型,例如:

move  $t0, $zero
mover $t0, $s0    # $s0 = register($t0) = register(0)
addi  $t0, 1
mover $t0, $s1    # $s1 = register($t0) = register(1)
addi  $t0, 1
...
尽管在任何情况下,我认为这不是一个好主意,但有几个原因。首先,您处理的寄存器数量非常少,因此在任何情况下,循环上都有一个很小的上限,这使得直接方法的灵活性不会降低多少

更重要的是,这样的循环效率极低。它将初始化、递增、执行
移动
和每次迭代(至少)的分支检查。即使不考虑分支暂停,这也至少比简单地:

move $t0, $s0
move $t1, $s1
...
move $t8, $s8

我最感兴趣的是参考一般知识的寄存器,但这似乎不太可能:)至于8个整数,考虑到你的第一个原因,我“手动”阅读了它们。再次感谢所有答案..在ARM中,你可以积累数据,例如在堆栈上,当使用
ldmsp,{r0-r7}
(加载多个)指令完成时,从那里馈送多个寄存器。MIPS没有这个功能,因此必须展开循环和/或展开寄存器初始化指令。在任何情况下,我都不知道任何机器语言具有“逐个寄存器选择”的寻址模式;除了自我修改代码(这很简单,但由于指令缓存破坏,性能可能比简单展开差得多;此外,不是线程安全的),我认为没有办法做到这一点。