单片机开发中pc和sp的作用

发布时间:2024-07-30  

概念
两个都是寄存器
pc(program counter)程序计数器
SP (stack pointer)堆栈指针

原理
pc 存放下一条指令的寄存器,cpu从内存中拿指令 ,寄存器是属于cpu的一部分,不属于内存
sp 堆栈指针,本质是寄存器,指向堆栈的顶部,
爬论坛:https://www.cnblogs.com/uestcliming666/p/11488782.html
假设有如下函数Fun

Fun()
{
…………………
Sub-fun(a, b);
…………………
}
cpu执行程序时的逻辑和步骤如下:
前提储备知识:

单片机对于堆栈的内存分配,一般栈空间由cpu自行分配,堆空间程序员可以用malloc进行申请,

栈空间一般储存非malloc分配的局部变量,全局变量和静态变量保s存在.date区域。一般对于函数内的局部变量,都保存在栈空间中,栈空间自动分配,自动释放,堆空间需要程序员自己free。
841609ec38ec92259b59e26224d2a4de_3036865-20240301113058622-1370858406.png

19408719d54a4e7021a10f6aeb07f0d5_3036865-20240301114223865-824557565.png

基于以上共识,开始对程序进行分析

执行CPU指令call,CPU会把目前PC寄存器的值push到stack 栈中,这个动作意味着存储返回地址。(很重要,要返回,向下)

cpu将参数a,b入栈,即根据CPU SP寄存器的值,把a、b的值存入SP指向的地址,并把SP减1(栈通常从高地址向低地址生长)。注意是减一不是加一

cpu把pc寄存器的值指向子函数的地址,则下一个被执行的代码就是sub-fun的第一句

当函数sub-fun在执行时,可以根据目前SP寄存器的值计算出参数a、b的地址。

如果函数sub-fun有定义局部变量,这些变量的地址会从当前栈的顶端继续生长(这就是为什么我们在嵌入式开发时,总是会要求应用程序工程不要定义size太大的局部变量,否则容易导致栈溢出的原因)。

当函数sub-fun执行完毕后,CPU会执行ret指令,这个命令会从栈顶端pop出返回地址——即调用sub-fun之前Fun函数执行到的语句的地址,然后更改PC寄存器的值为这个返回地址,则下个指令就会返回执行函数sub-fun的下一行语句,从而完成了函数调用。

补充
堆栈和寄存器的关系,寄存器是内存吗
堆栈(Stack)和寄存器(Registers)是计算机体系结构中的两个不同的概念,它们在处理数据和控制程序流程方面扮演着不同的角色。

堆栈(Stack):

堆栈是计算机内存中的一部分,用于存储临时数据,如局部变量、函数参数、返回地址等。它遵循后进先出(LIFO)的原则,即最后推入(push)堆栈的数据会最先被弹出(pop)。
在函数调用时,当前函数的局部变量和参数会被推入调用者的堆栈帧(stack frame),当函数返回时,这些数据会被弹出,同时恢复调用者的程序计数器和栈指针。
寄存器(Registers):

寄存器是CPU内部的一组高速存储单元,用于存储指令、数据和地址等信息。寄存器的访问速度远远快于内存,因此它们被用来存储当前正在处理的数据和指令。
寄存器的种类很多,包括通用寄存器、浮点寄存器、指令指针寄存器(如程序计数器PC)、栈指针寄存器(如SP)和帧指针寄存器(如FP)等。其中,栈指针寄存器(SP)和帧指针寄存器(FP)与堆栈管理密切相关。
寄存器与内存的关系:

寄存器不是内存,它们是CPU的一部分,具有极快的访问速度。寄存器用于存储当前执行的指令和处理的数据,而内存(包括堆栈)则用于存储程序的代码、全局变量、静态数据以及在一定时间内不会被频繁访问的数据。
寄存器与堆栈的关系:

堆栈是内存的一部分,而寄存器(特别是栈指针寄存器SP)用于指向当前堆栈的顶部。当数据被推入堆栈时,SP寄存器的值会相应减少,指向新的堆栈顶部;当数据从堆栈弹出时,SP寄存器的值会增加,指向新的堆栈顶部。
在函数调用过程中,寄存器(如SP)和堆栈紧密协作,以确保函数的参数、局部变量和返回地址得到正确的管理。
总结来说,寄存器是CPU内部的高速存储单元,用于快速访问和处理数据;堆栈是内存的一部分,用于存储临时数据和控制信息。两者在程序执行过程中相互配合,但它们的功能和存储位置是不同的

文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。

我们与500+贴片厂合作,完美满足客户的定制需求。为品牌提供定制化的推广方案、专属产品特色页,多渠道推广,SEM/SEO精准营销以及与公众号的联合推广...详细>>

利用葫芦芯平台的卓越技术服务和新产品推广能力,原厂代理能轻松打入消费物联网(IOT)、信息与通信(ICT)、汽车及新能源汽车、工业自动化及工业物联网、装备及功率电子...详细>>

充分利用其强大的电子元器件采购流量,创新性地为这些物料提供了一个全新的窗口。我们的高效数字营销技术,不仅可以助你轻松识别与连接到需求方,更能够极大地提高“闲置物料”的处理能力,通过葫芦芯平台...详细>>

我们的目标很明确:构建一个全方位的半导体产业生态系统。成为一家全球领先的半导体互联网生态公司。目前,我们已成功打造了智能汽车、智能家居、大健康医疗、机器人和材料等五大生态领域。更为重要的是...详细>>

我们深知加工与定制类服务商的价值和重要性,因此,我们倾力为您提供最顶尖的营销资源。在我们的平台上,您可以直接接触到100万的研发工程师和采购工程师,以及10万的活跃客户群体...详细>>

凭借我们强大的专业流量和尖端的互联网数字营销技术,我们承诺为原厂提供免费的产品资料推广服务。无论是最新的资讯、技术动态还是创新产品,都可以通过我们的平台迅速传达给目标客户...详细>>

我们不止于将线索转化为潜在客户。葫芦芯平台致力于形成业务闭环,从引流、宣传到最终销售,全程跟进,确保每一个potential lead都得到妥善处理,从而大幅提高转化率。不仅如此...详细>>