【问题标题】:Mips function declarionmips函数声明
【发布时间】:2013-11-07 10:34:48
【问题描述】:

大家好,我刚开始使用 Mips,我有一个程序(函数声明)我无法理解它的某些部分。有没有人可以帮助我理解?提前致谢。

将 mips 转换为高级语言。

int leaf_example (int g, int h, int i, int j) { 
     int f= (g+h)-(i+j); return f;}

Mips 代码:

    # g,h,i and j corresponds to $a0-$a3 

    # g,h,i and j corresponds to $a0-$a3
    # adjust stack for 3 items # save register $t1,$t0 # and $s0 for # use afterwards
    Sub $sp,$sp,-12 
    sw $t1,8($sp) 
    sw $t0,4($sp) 
    sw $s0,0($sp)

   # Body of procedure

    add $t0,$a0,$a1  # $t0=g+h
    add $t1,$a2,$a3  # $t1=i+j
    sub $s0,$t0,$t1  # $s0=(g+h)-(i+j)

# return the value of f, copy into value register

  add $v0,$s0,$zero #$v0=$s0


# before returning, we need to restore values

lw $s0,0($sp)  # restore register
lw $t0,4($sp)  # $s0,$t0,$t1 for
lw $t1,8($sp)  # caller.
add $sp,$sp,12 # release stack
jr $ra         # jump back to calling routine

现在我想知道为什么我要这样做 " # 调整 3 个项目的堆栈 # 保存寄存器 $t1,$t0 # 和 $s0 以供 # 之后使用" 部分。我可以不做就从程序开始吗?

其次,我为什么要这样做 add $v0,$s0,$zero #$v0=$s0 ?我已经将结果插入到 $s0 中了吗?

如果我能得到一些答案,我会很高兴的。

【问题讨论】:

    标签: assembly mips procedure


    【解决方案1】:

    这个问题和MIPS calling procedure有关。

    本质上,当您在 MIPS 汇编中编写函数时,您应该遵循以下约定:

    • 参数取自$a0 - $a4
    • 返回值在$v0$v1 中返回
    • $s 变量被保存和恢复(因此它们看起来没有改变)。

    为了满足这些点(第三点),需要使用栈来保存$s变量。因此,在您的示例中扩展堆栈的目的是保存变量(尽管 $t 变量通常不会由被调用者保存 - 约定规定这些是调用者保存的)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-25
      • 2010-12-24
      • 2012-08-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多