如何设计一个程序,找到从1到N的整数之和,其中N是键盘上读取的值?

时间:2017-02-04 23:05:24

标签: for-loop while-loop mips mips32

这是我对MIPS的第一次尝试,我设计了一种可能算法的伪代码描述。代码大纲如下:

main: Print: "Please input a value for N ="
read v0
If(v0 >0)
{
  t0 = 0
  while(v0 > 0) do
  {
    t0 = t0 + v0
    v0 = v0 +v0 -1
  }
 print: The sum of integers from 1 to N is = ", t0
 go to main
}
else
  print: "Honest Abe"

所以,通过这个大纲,我尝试将其转换为MIPS,但整个存储变量并将其读入使我感到困惑。我对真实代码的尝试是:

.data
  Prompt:   .asciiz  "\n Please input a value for N="
  Result:   .asciiz  "\n The sum of integers from 1 to N is "
  Bye:      .asciiz  "\n ***Honest Abe***"

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

        bgz $v0, else
        li $t0, 0
        while:
              bgz $v0
              add $t0,$t0,$v0
              addi $v0,$vo -1

从这里,我不明白for循环如何在MIPS中工作,我不明白这是否是正确的方法。读取数字然后存储整数的整个想法并不是我脑海中的处理。另外,我不确定我是否使用适当的循环命令。对这些问题的任何帮助都会很棒!

1 个答案:

答案 0 :(得分:0)

如果我做对了你想做的事情,你的算法似乎有点奇怪而且太麻烦了。

您可以使用简单的for循环计算一个总和,直到某个数字。如在C:

 scanf("%d", &num);
 for(i=0;i<num;i++)
 sum=sum+i;
像一个数组一样。 在MARS参考卡的帮助下,您可以得到类似的结果:

.text
main:

li  $v0, 5   #read a number from the keyboard
syscall

addi    $s0, $v0, 1    #s0= the number from the keyboard + 1 (the limit)

li  $t0, 1        #counter set to 1

loop:
    beq $t0, $s0, exit      #if the counter becomes equal tothe limit, exit the loop

    add $t1, $t1, $t0       #add the counter to the sum to this point

    addiu   $t0, $t0, 1     #add 1 to the counter for each loop

j loop                      #go to the "loop" label above

exit:

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

li  $v0, 10
syscall