程序中的堆栈深入理解

概念区分:

1. 堆栈:个人认为这个需要分成数据结构中的堆栈程序中的堆栈(即操作系统中的堆栈,因为程序中的堆栈使用操作系统控制的)这两个概念是不同的。这里主要讨论的是程序中的堆栈。
2. 通常所说的堆栈指的就是栈,堆就是堆。

1. 一个程序的栈区大小是固定的。解释:Windows中栈是向低地址扩展的数据结构,是一块连续的内存的区域。这句话的意思是栈顶的地址(刚开始栈为空)和栈的最大容量是系统预先规定好的。

  • 注意:在WINDOWS下,栈的大小是一个编译时就确定的常数(一般是2M),不会很大,如果申请的空间超过栈的剩余空间时,将提示overflow。因此,能从栈获得的空间较小

2. 栈的用途主要是过程的调用。即调用子程序时暂存断点地址和保护(恢复)现场数据。

3. 栈中到底存放的是什么?如何存放的呢?
栈中存放的是:1.参数值、返回地址,2.上下文寄存器、3.局部变量

过程调用

为了更好的理解栈的作用和存放的内容,需要了解过程的调用。

这里使用的是MIPS系统的过程调用:

    子程序的使用有助于提高程序的可读性,有利于代码的复用,以及模块化的编程。
    将这个程序分成若干个过程后,编译器对每一个过程分别编译。为了配合操作系统的工作,对寄存器的使用和帧栈的建立等需要有着约定。

1.MIPS中用于过程调用的指令

调用指令:jal(jump and link)跳转并连接指令 采用J型指令格式
具有两个功能:
1.保存下一条指令的地址(即返回地址)到$ra寄存器(31号寄存器)
2.跳转到指定地址处执行。
e.g.指令jal 10000的功能为$31 = PC + 4;go to 10000,(其中的地址10000使用编译器将标识符的地址转化而来)
返回指令: jr(jump register)寄存器跳转指令采用R型指令格式
功能:
跳转到寄存器所指定的地址处执行
e.g.指令jr $31的功能就是跳转到调用程序的返回地址处执行。
jal和jr指令通常都是一起使用,用于过程调用。

2.过程调用时MIPS寄存器的使用约定

注: 没有应用到嵌套调用的过程
未完待续。。。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值