将程序的一部分重构为循环以使其更小



我写了一些代码,但它太长了。我想也许我可以通过把这部分放在循环中来使我的程序变小一点。我尝试将0更改为某些寄存器(例如$f9)并增加它,但没有奏效。

有人知道我该怎么做吗?

windfact:   .float 1.201, 1.036, 2.320, 5.026, 6.321, 1.0215
newLine:    .asciiz "n"
la  $t0, windfact           # put address of list into $a1
l.s $f12, 0($t0) 
li  $v0, 2           
syscall                     # This will print 1.192173
li       $v0, 4                 # system call code for print string
la       $a0, newLine           # load addr of newLine in $a0
syscall
l.s $f12, 4($t0) 
li  $v0, 2           
syscall                     
li       $v0, 4                 
la       $a0, newLine           
syscall
l.s $f12, 8($t0) 
li  $v0, 2           
syscall                     
li       $v0, 4                 
la       $a0, newLine           
syscall
l.s $f12, 12($t0) 
li  $v0, 2           
syscall                     
li       $v0, 4                 
la       $a0, newLine           
syscall
l.s $f12, 16($t0) 
li  $v0, 2           
syscall                     
li       $v0, 4                 
la       $a0, newLine           
syscall
l.s $f12, 20($t0) 
li  $v0, 2           
syscall                     
li       $v0, 4                 
la       $a0, newLine           
syscall                                

谢谢

看起来你只需要迭代你的数组,将每个连续的值加载到$f12 中。 一种方法是将指针递增到数组中,而不是递增索引。

在 C 中,这就像做

float *array_end = array+size;   // keep this in a register to compare against
for(float *p = array ; p < array_end ; p++ )
    do_stuff(*p);

而不是

for(int i=0 ; i < size ; i++ )
    do_stuff(array[i]);

在您正在使用的 ABI 中,syscall指令是否保留其输入寄存器? 如果是这样,您只需设置$f12$a0一次,无论您是否完全展开(就像现在一样)。

如果没有,则必须在系统调用之间将循环指针/计数器溢出到内存。

最新更新