时得到了这个如果在函数调用期间按下,为什么堆栈指针移动到a 通过减去寄存器数量的4倍来减小值 推到堆栈上?
答案 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>