2013-10-28 33 views
0

大家好,我刚刚开始Mips和我有一个程序(函数decleration)我无法理解它的某些部分。是否有人帮助我理解?提前致谢。Mips函数declarion

将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中了?

如果我得到一些答案,我会很感激。

回答

2

这个问题都与MIPS calling procedure有关。

从本质上讲,当你在MIPS汇编编写一个函数,你应该遵循以下约定:

  • 参数都采取了在$a0 - $a4
  • 返回值在$v0返回和$v1
  • $ s变量被保存和恢复(以便它们看起来没有改变)。

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