您好,在此先感谢您,
我的问题是,是否可以通过寄存器,例如在一个指针 ($t0) 中使用指针并将指针移动到另一个指针 ($t1)。
我真正想做的是在一个循环中读取 8 个整数并将它们存储在 ($s0-$s7)
您好,在此先感谢您,
我的问题是,是否可以通过寄存器,例如在一个指针 ($t0) 中使用指针并将指针移动到另一个指针 ($t1)。
我真正想做的是在一个循环中读取 8 个整数并将它们存储在 ($s0-$s7)
我不知道现有的 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
和一个分支检查(至少)。即使不考虑分支停顿,这至少比简单的慢 3 倍:
move $t0, $s0
move $t1, $s1
...
move $t8, $s8
你想让一个寄存器号是可变的吗?我不了解 MIPS 的内部和外部,但我怀疑这是可能的。我所知道的唯一具有类似功能的 ISA 是 SPARC(寄存器窗口,不能用于您想要的)和 IA64(“旋转寄存器”,可以用于您想要的,但只能用于浮点)。
您可以尝试更改sw
操作码中的位以指向增加的寄存器,但这是一个糟糕的主意。我认为您最好的选择是自己编写展开的循环:
lw $s0, $t0
addi $t0, $t0, 4
lw $s1, $t0
...
重新安排东西以尽量减少摊位,但这与您将获得的一样好。