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

时间:2016-03-11 05:54:52

标签: loops assembly mips

我写了一些代码,但时间太长了。我想也许我可以通过将这个部分放在循环中来使我的程序更小一些。我尝试将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                                

谢谢

1 个答案:

答案 0 :(得分:0)

看起来你只需要迭代你的数组,将每个连续的值加载到$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,无论您是否完全展开(如现在)。

如果没有,你必须跨越系统调用将你的循环指针/计数器溢出到内存中。