我试图编写一个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
2 回答
add $t1, $t1, 0
分割并复制到
$t1
和$t3
后,商在$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
替换为:Exit
很奇怪:你是第二次打印output
字符串而不是打印整数 .把它改成这个:
方法很简单 . 你需要递归函数,我把它命名为SumDigits,它将采用参数中所有数字的最后一个数字和重复过程 . 递归调用返回后,您将向前一个结果添加数字 . 对代码进行了评论以便于理解 . 代码如下: