1

我试图编写一个 MIPS 程序,它获取一个无符号整数作为参数,并递归地返回整数中所有十进制数字的总和。例如,如果参数为 75080,则返回的总和为 20 (7+5+0+8+0)。到目前为止,这是我的代码。任何帮助,将不胜感激。

我的想法是将数字除以 10,留下数字中的最后一个整数,使用 mfhi 添加提醒。

.data
prompt: .asciiz "Enter a string of integer: "
output: .asciiz "\nThe total sum is: "
    .text
    .globl main
main:
    la $a0, prompt
    li $v0, 4
    syscall

    li $v0, 5
    syscall

    move $t2, $v0

    la $a0, output
    li $v0, 4
    syscall

Loop:
    div $t2, $t2, 10
    mflo, $t1
    mfhi, $t3
    beqz $t1, Exit
    add $t1, $t1, 0
    b additive

additive:
    add $t0, $t1, $t1
    j Loop

Exit:   
        la $a0, output
            li $v0, 4
            syscall
            la $v0, 10
            syscall
4

2 回答 2

0
  • 这应该是做什么的?向寄存器添加 0 不会改变其值:

    add $t1, $t1, 0

  • 与 和 相除后$t1$t3in $t1余数$t3。当您添加到总数时,您正在以相反的方式对待它。

  • 这实际上会给您$t0 = 2 * $t1:您正在添加$t1自身并将结果存储在$t0.

    add $t0, $t1, $t1

    您可能实际上想要:

    add $t0, $t0, $t3

  • 您在将余数添加到总数$t1 == 0 之前进行检查,因此永远不会添加最高有效数字。你也不需要一个子程序来增加总数。您也可以使用bnez Loop代替beqz Exit-> b Loop。最后,您甚至不需要$t1,因为商已经在$t2.

摆脱additive并替换Loop为:

Loop:
    div $t2, $t2, 10
    mfhi, $t3
    add $t0, $t0, $t3
    bnez $t2, Loop
  • Exit很奇怪:你output第二次打印字符串而不是打印整数。

将其更改为:

Exit:
    move $a0, $t0
    la $v0, 1
    syscall

    la $v0, 10
    syscall
于 2012-04-07T06:53:35.050 回答
0

方法很简单。您需要递归函数,我将其命名为 SumDigits,它将获取最后一位数字并对参数中的所有数字重复过程。递归调用返回后,您将在前一个结果中添加数字。为了便于理解,对代码进行了注释。代码如下:

    .text

#calculates sum of digits recursively
SumDigits:

    sub     $sp,    $sp,    12                  #alloocate 12B on stack
    sw      $ra 0($sp)                      #save return address
    sw      $a0,    4($sp)                      #save argument

    beq     $a0,    $0, exit_sumdigits      #when there is no more digits return 0
    rem     $t0,    $a0,    10                  #get last digit
    sw      $t0,    8($sp)                      #save it on stack
    div     $a0,    $a0,    10                  #divide argument by 10
    jal     SumDigits                       #repeat procedure
    lw      $t0,    8($sp)                      #read digit from stack
    add     $v0,    $v0,    $t0             #add digit to previous result
    lw      $ra,    0($sp)                      #load return address
    addi    $sp,    $sp,    12                  #free stack
    jr      $ra                             #return

exit_sumdigits:
    li      $v0,    0                           #there are no more digits, return 0
    lw      $ra,    0($sp)                      #load return address
    addi    $sp,    $sp,    12                  #free stack
    jr      $ra                             #return

main:
    li      $a0,    75080                       #load number in $a0
    jal     SumDigits                           #call SumDigits

    move    $a0,    $v0                         #set a0 = result of SumDigits
    li      $v0,    1                           #set $v0 for print int system call
    syscall

    li      $v0,    10                          #set $v0 for exit system call
    syscall

.data
于 2015-03-06T13:01:07.603 回答