【问题标题】:Sum calculator in MIPSMIPS 中的求和计算器
【发布时间】:2021-04-14 11:54:34
【问题描述】:

我对 MIPS 相当陌生,正在尝试编写一个代码来计算用户输入的整数的总和。我在我的代码中使用递归,但不确定是否有更简单的方法来做到这一点。我的代码在大多数情况下运行得相当好,但是它不断将最终总和加 1。例如,10 的总和是 55,但它给了我 56。

.data
    #messages
    sumMessage: .asciiz "\Enter a number to find its Sum: "
    sumMessage1: .asciiz "\nSum is: "
    
    sumInput: .word 0
    sumAns: .word 0

.text
.globl main
main:

#read promtMessage
li $v0, 4
la $a0, sumMessage
syscall

#take input
li $v0,5
syscall
sw $v0, sumInput#storing input

#call sumCalc function
lw $a0, sumInput
jal sumCalc
sw $v0, sumAns#returns value from function

#display sum
li $v0, 4
la $a0, sumMessage1
syscall
li $v0, 1
lw $a0, sumAns
syscall

#end main
li $v0, 10
syscall

#sumCalc Function
.globl sumCalc
sumCalc:
    subu $sp, $sp, 8
    sw $ra, ($sp)#storing value of returning address in the stack
    sw $s0, 4($sp)#4 bites apart from the value stored above in the stack
    
    #base case
    li $v0, 1
    beq $a0, 0, exit
    
    #find factorial n-1
    move $s0, $a0
    sub $a0, $a0, 1
    jal sumCalc
    
    add $v0, $s0, $v0
    
    exit:
            lw $ra, ($sp)
            lw $s0,, 4($sp)
            addu $sp, $sp, 8
            
            jr $ra

任何帮助将不胜感激!

【问题讨论】:

  • 不需要递归,甚至不需要循环。总和可以计算为(N * (1 + N)) >> 1

标签: recursion assembly sum mips


【解决方案1】:

这里使用递归使处理变得繁琐且没有什么意义,因为我们可以直接计算总和。整数的总和使用以下数学公式给出:n * (n + 1) / 2 或 n * (n + 1) 然后右移相当于除以 2。

    .data
        #messages
        sumMessage: .asciiz "\Enter a number to find its Sum: "
       sumMessage1: .asciiz "\nSum is: "
    
      sumInput: .word 0
      sumAns: .word 0

  .text
  .globl main
   main:

#read promtMessage
li $v0, 4
la $a0, sumMessage
syscall

#take input
li $v0,5
syscall
sw $v0, sumInput#storing input

#call sumCalc function
lw $a0, sumInput
jal sumCalc
sw $s2, sumAns#returns value from function

#display sum
li $v0, 4
la $a0, sumMessage1
syscall
li $v0, 1
lw $a0, sumAns
syscall

#end main
li $v0, 10
syscall

#sumCalc Function
.globl sumCalc
sumCalc:
    subu $sp, $sp, 8
    sw $ra, ($sp)#storing value of returning address in the stack
    sw $s0, 4($sp)#4 bites apart from the value stored above in the stack
    
    li $s2,1      # storing the final result
    move $s3,$v0      
    addi $s3,$s3,1     # $s3 = $v0+1
    mul $s2,$v0,$s3    # $s2 = $v0 * ($v0 +1)
    
    div $s2,$s2,2        # $s2 = $s2/2
        
    exit:
            lw $ra, ($sp)
            lw $s0,4($sp)
            addu $sp, $sp, 8
            
            jr $ra

【讨论】:

  • 感谢您的回答!一些文字来解释这如何解决问题以及为什么它是一个好的解决方案,以及您修复的 OP 做错了什么,这将非常有帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-08
  • 1970-01-01
  • 1970-01-01
  • 2018-07-17
  • 2011-01-28
相关资源
最近更新 更多