【问题标题】:Mips translating problemsMips 翻译问题
【发布时间】:2013-03-01 16:23:57
【问题描述】:

我无法将此伪代码转换为 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

【问题讨论】:

    标签: mips pseudocode


    【解决方案1】:

    您的某些指令有误(swlwaddij)。这些指令的定义可以在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 由于分支延迟。这不好。

    【讨论】:

      猜你喜欢
      • 2020-07-28
      • 2013-09-23
      • 1970-01-01
      • 1970-01-01
      • 2013-05-03
      • 2012-10-27
      • 2021-03-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多