关于单片机在调用子程序时,进行了怎样的堆栈操作
单片机在调用子程序时,进行了怎样的堆栈操作?除了断点的PC值入栈,还有哪些东西呢?比如临时变量?!有人说临时变量不入栈,那CPU从子程序运行退回断点时,临时变量的值是如何...
单片机在调用子程序时,进行了怎样的堆栈操作?除了断点的PC值入栈,还有哪些东西呢?比如临时变量?!有人说临时变量不入栈,那CPU从子程序运行退回断点时,临时变量的值是如何恢复的呢?还是说临时变量只是在C语言上的定义形式,在汇编里本质上也是全局RAM,所以在退回时只要按原先的地址继续调用,仍然是调用子程序前的值。
展开
4个回答
展开全部
“断点的PC值入栈,还有哪些东西呢?”
取决于子程序的类型和编程方式。有些特殊类型的子程序是需要入栈的,若采用高级语言编程则编译器会自动添加相应的入栈出栈语句。
“有人说临时变量不入栈,那CPU从子程序运行退回断点时,临时变量的值是如何恢复的呢?”
呵呵,为何要恢复?调用子程序的时候会从局部变量块中新分配空间的,如同你后半部分所说。
取决于子程序的类型和编程方式。有些特殊类型的子程序是需要入栈的,若采用高级语言编程则编译器会自动添加相应的入栈出栈语句。
“有人说临时变量不入栈,那CPU从子程序运行退回断点时,临时变量的值是如何恢复的呢?”
呵呵,为何要恢复?调用子程序的时候会从局部变量块中新分配空间的,如同你后半部分所说。
更多追问追答
追问
但是不管是临时变量还是全局变量,其占用的RAM都是在单片机的用户RAM区的吧(假设是只有256BRAM的51单片机)?既然这样,那不管是临时变量还是全局变量所占用的RAM单元比如,如果不刷新它的值,按道理它在掉电前一直都是一个固定的值。
追答
“但是不管是临时变量还是全局变量,其占用的RAM都是在单片机的用户RAM区的吧”
是的
“既然这样,那不管是临时变量还是全局变量所占用的RAM单元比如,如果不刷新它的值,按道理它在掉电前一直都是一个固定的值”
不是。非静态的局部变量是可以重叠分配的。
展开全部
可重入函数调用时,被调函数内部临时变量要入栈。数据之所以入栈是因为空间资源重合了,需要保护原数据。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
单片机在调用子程序时,进行了怎样的堆栈操作?除了断点的PC值入栈,还有哪些东西呢?
--没有其它的了。
比如临时变量?!有人说临时变量不入栈,那CPU从子程序运行退回断点时,临时变量的值是如何恢复的呢?还是说临时变量只是在C语言上的定义形式,...
--C语言,并没有子程序。
--C语言,称为函数。
--概念不能混用。
--调用C函数时,参数的传递方法,返回值的传递方法,各有好几种:单个数值、数组、指针...,讲起来,得用好几页,还是看书去吧。
--没有其它的了。
比如临时变量?!有人说临时变量不入栈,那CPU从子程序运行退回断点时,临时变量的值是如何恢复的呢?还是说临时变量只是在C语言上的定义形式,...
--C语言,并没有子程序。
--C语言,称为函数。
--概念不能混用。
--调用C函数时,参数的传递方法,返回值的传递方法,各有好几种:单个数值、数组、指针...,讲起来,得用好几页,还是看书去吧。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
栈: 在函数调用时,第一个进栈的是主函数中函数调用后的下一条指令(函数调用语句的下一条可执行语句)的地址,然后是函数的各个参数,在大多数的C编译器中,参数是由右往左入栈的,然后是函数中的局部变量。注意静态变量是不入栈的。
当本次函数调用结束后,局部变量先出栈,然后是参数,最后栈顶指针指向最开始存的地址,也就是主函数中的下一条指令,程序由该点继续运行。
堆:一般是在堆的头部用一个字节存放堆的大小。堆中的具体内容有程序员安排。
当本次函数调用结束后,局部变量先出栈,然后是参数,最后栈顶指针指向最开始存的地址,也就是主函数中的下一条指令,程序由该点继续运行。
堆:一般是在堆的头部用一个字节存放堆的大小。堆中的具体内容有程序员安排。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询