ARM微控制器与嵌入式系统(2)-------堆栈的概念

回顾上节
在第一个单元,我们初步认识了ARM的微控制器里头CPU运行机制。
知道了程序是怎么运行的。
在一个存储有地址的空间这种概念里,在PC指针寄存器的指引下,根据地址一条一条的指令,取进来,放到CPU里运行。
CPU在这些指令的解析下,从我们的存储器或者档期CPU内部寄存器拿到的数交给运算单元,一步一步的运算。
指令告诉了这些数从哪来。 以及这些数拿进来,后,分别应该做什么运算。我们称为指令的解析和数据的流向。


上一节,留了一个尾巴。
PC指针寄存器,指引的程序的运行的流程,可能很多时候,不是简单的逐一递增,这样自动的操作。
很多时候,会出现,具有一定偏移量的跳转,比如 if else
遗留问题是:当我们发生类似函数调用,使用的时候,在一个程序执行的流程当中,调用了一个子函数,完成了一个特定的功能。那么我们以怎样的机制,能够让计算机,CPU自动保存一个返回的地址。知道这个CPU能够回到哪里去?
(加一个地址返回寄存器,存返回的地址,嵌套函数调用,怎么办?再加一个,再加一个,加多少是头?)
how to do that?
stack 堆栈(栈) 堆是heap
在这里插入图片描述

栈的特点就是保证数据进入存储器的顺序。
在这里插入图片描述

在这里插入图片描述

stack最简单用途就是保存嵌套调用的返回地址。

在这里插入图片描述

在这里插入图片描述

我们学习C语言,堆栈的绝大多数使用是感觉不到的。
C语言的函数调用,函数的返回值,参数的传递,局部变量的开销。都是由编译器帮你隐性的使用了堆栈。
所以,没有堆栈就没有办法使用C语言。
在这里插入图片描述

CPU基本构架 有了一个完整的认识。
在一个完整的CPU构架里,有一个逻辑运算单元可以负责运算。数可以从寄存器来,也可以从片外的存储器来。
数从哪儿来,做什么运算,是由我们指令解析产生的逻辑控制单元控制它有序的产生。
而我们逻辑控制单元的指令又是在PC指针寄存器的指引下,从程序的那个地址空间一条一条指令,一个一个0和1的序列拿进来,解析控制数据的流向和数据的来源。
以及要做运算的内容。
这些运算过程中如果发生PC指针寄存器不是逐一累加的时候,我们需要在堆栈指针寄存器的指引下,把当前PC指针寄存器的值,我们要返回的值,想办法存到一个特定的内存空间。用堆栈,压栈,出栈的方式来使用这段内存,有序的保存这个值来应付程序之间的函数调用、他们的嵌套调用以及跳转。

高阶堆栈概念

根据程序运行,内存会动态变化。
会动态的涨落。
堆 从顶部向下。
栈,从底部向上。
总大小,终究是有限的。
在这里插入图片描述

堆栈溢出。(少用递归)
两个常见错误:

  1. Windows蓝屏,memory overflow
  2. 越界访问 (内存内容,拿出来当栈访问,访问无效。)

寄存器组 register file
编程模型

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值