【问题标题】:Dilemma related to function call's increment of SP函数调用增量SP相关的困境
【发布时间】:2015-10-02 02:56:11
【问题描述】:

如果在函数调用过程中push,为什么堆栈指针会移动到a 通过减去 4 倍的寄存器数量得到更小的值 压入堆栈?

我在阅读Understanding the stack时得到了这个

【问题讨论】:

  • 因为,在实际的内存表示中,堆栈是从底部(较大地址)到顶部(较小地址)增长的。它的设计与堆的增长相反。
  • 请说的更具体一点:你不明白为什么要进行减法,为什么要减去4次寄存器的数量,还是什么?
  • @cad 我明白了,但为什么是 4 次?

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


【解决方案1】:

在同一页中,明确提到了堆栈的内存布局:-

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

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

堆栈限制 堆栈的最小有效地址。如果堆栈指针变得比这个小,那么就会有堆栈溢出(这个 不应与数学运算溢出混淆)。

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

而且,说到 PUSH 操作,需要减去要压入堆栈的寄存器数量的 4 倍,因为在 MIPS 架构中,连续字的地址相差 4。 而且,MIPS I 指令集架构 (ISA) 和 II ISA 的寄存器为 32 位(4 字节)。

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

这是代码中的样子。假设要压入堆栈的值在寄存器 $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 倍)并将寄存器复制到堆栈中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-06
    • 2014-07-18
    • 1970-01-01
    • 2021-03-30
    • 2011-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多