与函数调用SP

时间:2015-07-13 17:56:40

标签: pointers operating-system stack mips function-calls

  

如果在函数调用期间按下,为什么堆栈指针移动到a   通过减去寄存器数量的4倍来减小值   推到堆栈上?

我在阅读Understanding the stack

时得到了这个

1 个答案:

答案 0 :(得分:0)

在同一页面中,清楚地提到了堆栈的内存布局: -

  

考虑堆栈的以下方面是有用的。

     

堆栈底部堆栈的最大有效地址。初始化堆栈时,堆栈指针指向堆栈底部。

     

堆栈限制堆栈的最小有效地址。如果堆栈指针小于此值,那么堆栈溢出(这就是   不应该与数学运算中的溢出相混淆。)

     

内存的其他部分用于程序和堆   (用于动态内存分配的内存部分)。

并且,在讨论PUSH操作时,需要减去要在堆栈上推送的寄存器数量的4倍,因为MIPS架构中的 ,连续字的地址相差4。 < / strong>并且,MIPS I指令集架构(ISA)和II ISA的寄存器为32位(4字节)。

对于我们的4字节(全字)数据堆栈,添加项目意味着从 $sp 中减去4并将该项目存储在该地址中。

以下是代码中的内容。假设推送堆栈的值在寄存器 $t0

# PUSH the item in $t0:
subu $sp,$sp,4      #   point to the place for the new item,
sw   $t0,($sp)      #   store the contents of $t0 as the new top.

因此,您可以通过将堆栈指针设置为较小的值(通常通过减去堆栈中要推送的寄存器数量的4倍)并将寄存器复制到堆栈来推送一个或多个寄存器。 / p>