1

符号なし整数を引数として取得し、整数内のすべての 10 進数の合計を再帰的に返す 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$t3は に$t1剰余は になり$t3ます。合計に追加するときは、逆に扱っています。

  • これは実際にあなたに与えようとしています$t0 = 2 * $t1:あなたは$t1それ自体に追加し、結果を$t0.

    add $t0, $t1, $t1

    あなたはおそらく実際に欲しい:

    add $t0, $t0, $t3

  • $t1 == 0 残りを合計に追加する前に確認しているため、最上位桁が追加されることはありません。合計に追加するためのサブルーチンも実際には必要ありません。->bnez Loopの代わりに使用することもできます。最後に、商はすでに にあるので、も必要ありません。beqz Exitb 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 に答える