0

この疑似コードを mips アセンブリに変換するのに問題があります。何が起こっているのかを理解するために使用しているレジスタを追加しました。

# if (n == 1)
#   return 1
# else if (n == 2)
#   return 6
# else
#   return 2*hex(n-1) - hex(n-2) + 4

# (hex) Registers:
# $a0 - n, the argument
# $v0 - the result the n-th Hexamorphic number
# $t0 - holds hex(n-2)
# $t1 - holds constants 1
# $t2 - holds constant 2

これが私のコードのどこにいるのか、hex:とelseif:について自信を持っていますが、else:が問題の始まりです

hex:    bne $a0,$t1,elseif #if n==1
        li $t1,1
        li $t2,2
        li $v0,1 
        jr $ra         #retu

elseif: bne $a0, $t2,else
        li $v0,6
        jr $ra

else:   addi $sp,$sp,-12
    sw $ra,$ra 0($sp)
    addi $t3,$a0,-1
    sll $t3, $t2,1
    sw $a0,$a0,4($sp)
    sw $t3,8($sp)
    lw $ra
    lw $a0
    addi $t3,4
    sub $t4,$t3,$t0
    lw $t4
    sw $v0,$t4
    lw $ra
    lw $a0
    j $ra
4

1 に答える 1

1

一部の指示が間違っています ( swlwaddiおよびj)。これらの命令の定義は、MIPS32 命令セットのクイック リファレンスに記載されています。

あなたはelseブロックで正しい軌道に乗っています。やりたいことは、再帰呼び出し全体で保持したいすべての値を (スタックに) 保存することです。jal16 進数へ (n - 1)、スタックに保存し、jal再度 16 進数へ (n - 2)。次に、すべての値をロードし、それらに対して計算を行いますjr ra。戻る前に $sp を復元することを忘れないでください。を使用するときjalは、分岐遅延に注意してください。

jal hex
The instruction here will be run "together" with jal, before taking the branch.
ra will point here

分岐遅延のため、jr $rain elseif が実行されます。addi $sp,$sp,-12これは良くない。

于 2013-02-28T13:47:48.950 に答える