我无法将此伪代码转换为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
答案 0 :(得分:1)
您有一些错误的说明(sw
,lw
,addi
和j
)。这些说明的定义可以在MIPS32 instruction set quick reference。
你在else块的正确轨道上。您要做的是保存要在整个递归调用中保留的所有值(在堆栈上)。 jal
到十六进制(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
。这不好。