2013-02-27 83 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由于分支延迟。不是很好。