2013-02-27 86 views
0

我無法翻譯這個僞代碼來組裝我添加了一些我使用,以幫助瞭解寄存器MIPS是怎麼回事的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 

這裏是我在我的代碼,我覺得自信十六進制:和ELSEIF:但別人:是哪裏出了問題開始

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 

回答

1

你有一些錯誤的指令(swlwaddij)。這些intstructions的定義可以在MIPS32 instruction set quick reference中找到。

你在else塊的正確軌道上。你想要做的是保存你想在整個遞歸調用中保留的所有值(在堆棧中)。 012-轉換爲十六進制(n - 1),將它保存在堆棧中,並且jal再次以十六進制表示(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 

在ELSEIF的jr $ra將運行addi $sp,$sp,-12由於分支延遲。不是很好。