Mips翻译问题

Mips翻译问题,mips,pseudocode,Mips,Pseudocode,我在将这个伪代码翻译成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 - h

我在将这个伪代码翻译成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:    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
我对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

您有一些指示错误(
sw
lw
addi
j
)。这些指令的定义可以在中找到

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
你在else街区走对了路。您要做的是保存希望在递归调用过程中保留的所有值(在堆栈上)
jal
到十六进制(n-1),将其保存在堆栈上,然后再次
jal
到十六进制(n-2)。然后加载所有值,对其进行计算并
jr-ra
。返回前不要忘记还原$sp。使用
jal
时,请记住分支延迟:

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
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
。这不好

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