如何计算MIPS中两个值之间的偶数之和?

时间:2017-02-12 23:26:22

标签: c loops branch mips

我对如何将C代码转换为MIPS感到困惑。我似乎让循环混乱,我想我可能使用了错误的命令。我这样做的C代码如下:

int main()
{
   int x, y;
   int sum = 0;
   printf("Please enter values for X and Y:\n ");
   scanf("%d %d",&x,&y);


   if (x > y)
   {
     printf("\n** Error");
     exit(0);
   }
   while (x <= y)
   {
     if (x%2 == 0)
        sum += x;
        x++;
   }
   printf("\nThe sum of the even integers between X and Y is: %d\n\n",sum);

   return 0;
}

我对MIPS翻译的尝试如下:

   .data
 Prompt:   .asciiz   "Please enter values for X and Y:\n"
 Result:   .asciiz   "The sum of the even integers between X and Y is: \n"

    .text
 li $v0,4              #load $v0 with the print_string code.
 la $a0, Prompt        #load $a0 with the message to me displayed
 syscall

 li $v0,5              #load $v0 with the read_int code for X
 syscall
 move $t0,$v0

 li $v0,5              #load $v0 with the read_int code for Y
 syscall
 move $t1, $v0

 while:

   slt $t2, $t1,$t0  #$t1 = y   $t0 = x
   li $t3,2
   div $t2,$t3
   beq $t2,$0,else
     add $s1,$s1,$t0      #s1 = s1 + x
     addi $t0,$t0,1       #x++
   j while

else:
   li $v0,4
   la $a0, Result
   syscall

   move $a0,$s1
   li $v0,1
   syscall

我认为我的错误出现在我的MIPS代码中。我的结果保持为零,我认为我的代码正在检查循环,然后只是跳到我的else语句。

经过进一步的工作,我得到它来计算所有整数的总和,我不确定它为什么会这样做。这是我最近的更新:

while:

   sle $t2, $t0,$t1     #$t1 = y   $t0 = x
   li $t3,2        #t3 = 2
   div $t2,$t3       #$t2/2
   beq $t2,$0, else   #if ($t2/2 == 0), jump to the else, otherwise do else
     add $s1,$s1,$t0      #s1 = s1 + x
     addi $t0,$t0,1      #x++
   j while

所以现在,如果我输入1和5,它计算1和3给我6而不是偶数和应该只是2。

1 个答案:

答案 0 :(得分:1)

回答我自己的问题,主要的困惑在于分支机构。我现在明白它们的工作方式就像对立面那样,例如,我必须在我的while循环中将“beq”设置为bnez,这样当$ t2为!时,它会进行计算!另一个小修正是在外面添加增量循环。所以,当$ t2!= 0时,我跳到我的“else”,然后递增以找到下一个数字。但是,如果余数为0,则进行sum = sum + x的数学运算。总之,主要的困惑来自对分支的反思。我现在明白,如果我想说:

而(a1

我必须把它写成

while:
 bgeu $a1,$a2, done
   addi "whatever"
 b while

done:
      do done stuff

在此理解之前,我写的是ble $ a1,$ a2,已完成,这不是键入的方式。从逻辑上讲,如果a1&lt; a2 ......但实际上是说a1&lt; a2,跳转到“完成”并跳过计算。所以我不得不反思。