Mips函数声明

时间:2013-10-28 15:11:58

标签: assembly mips procedure

大家好我刚刚开始使用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

现在我想知道我为什么要做“#adjust stack for 3 items #save register $ t1,$ t0#和$ s0 for#use after” part。我可以从程序体开始而不做它吗?

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

如果我得到一些答案,我会很沮丧。

1 个答案:

答案 0 :(得分:2)

这个问题都与MIPS calling procedure

有关

基本上,当您在MIPS程序集中编写函数时,应遵循以下约定:

  • 参数在$a0 - $a4
  • 中进行
  • 返回值在$v0$v1
  • 中返回
  • 保存并恢复$ s变量(以便它们看起来没有变化)。

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