繁体   English   中英

MIPS汇编,寄存器遍历?

[英]MIPS assembly, register traversing?

您好,谢谢!

我的问题是,是否有可能像在一个指针中放置一个指针($ t0),然后将指针移动到另一个指针($ t1)一样进行访问。

我真正想做的是在一个循环中读取8个整数并将其存储在($ s0- $ s7)中

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

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

重新安排东西以最大程度地减少失速,但这与您将要获得的效果差不多。

您想让注册号可变吗? 我不了解MIPS,但我怀疑这是否可能。 我所知道的唯一具有类似功能的ISA是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和分支检查(至少)。 即使不考虑分支停顿,这也比简单慢至少三倍:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM