51单片机SP指向的系统栈中都有什么?LCALL、RETI等解析
在调用函数时,也即当执行LCALL、ACALL等汇编指令时,硬件首先把PC指针压入到SP指向的系统栈(PC不可寻址,无法用程序出入栈,只能由硬件自动完成),随着函数调用链条不断加长,SP指向的系统栈被占用的空间越来越多。
下面看一下执行ACALL和LCALL时,硬件为我们自动做了什么? (这些信息都能从帮助文件中找到,keil->Help->uVision Help打开帮助文件,依次展开8051 instruction set指令集->Instructions)
ACALL等价于: (下述代码由硬件自动完成) PC = PC + 2 SP = SP + 1 (SP) = PC[7-0] SP = SP + 1 (SP) = PC[15-8] PC[10-0] = A[10-0] |
LCALL等价于:
PC = PC + 3 |
PC存放的是下一条要执行的指令,在调用子函数前,要把紧跟ACALL/LCALL指令后面的一条指令的ROM地址入栈,因为ACALL指令本身占用2字节,LCALL占用3字节,所以上面
的代码才一个PC+2,一个PC+3。
这里顺便再提一下函数(子程序)的返回指令:RET和RETI,RET用于普通子程序返回,这两个指令对应的硬件自动代码如下(来自于keil的帮助文件):
RET: PC[15-8] = (SP) SP = SP - 1 PC[7-0] = (SP) SP = SP - 1 | | | |
RETI: PC[15-8] = (SP) SP = SP - 1 PC[7-0] = (SP) SP = SP - 1 执行完上述伪代码之后, 恢复中断逻辑, 以便接收下一个中断。 |
可以看到,RET和RETI在对PC和SP的处理上一模一样,区别在于,RETI还额外地要恢复一下中断逻辑,(因为同优先级的中断不可嵌套,不可嵌套的实现机制就是靠的这个中断逻辑,如果我们在中断服务函数中使用了RET来返回,中断逻辑得不到恢复的话,那么同优先级以及更低优先级的中断将无法响应)
对于51单片机,SP指向的系统栈的内容就两部分:
(1)是上面所述的CALL指令压入的PC指针;
(2)是中断服务函数为保护现场而手动压入的A、B、PSW、DPTR等,(keil编译生成的汇编不会把Rn入栈,只会使用using指令切换工作寄存器组,也即切换BANK,但是如果中断服务代码我们使用汇编自己写的话,也可以不切换BANK,而把Rn入栈)。可参考keil帮助文件,依次展开CX51 Compiler User‘s Guide-> Language Extensions -> Function Declarations -Interrupt > Interrupt Functions
对于STM32等单片机,在仅使用MSP的情况下,MSP的栈中除了上述2个部分以外,还会有第3部分:函数的形参和局部变量(Rn不足时);若Rn足以容纳形参和局部变量,那么形参和局部变量就不占用栈了,但是如果本函数func1( )中又需要调别另一个函数func2( )的话,func2( )函数传参等也是需要使用Rn的,这样本函数func1()在调用func2( )之前,func1()就必须得把刚才存在Rn中的形参和局部变量压栈,以便腾出Rn供func2( )传参和导出返回值用)。
51单片机SP指向的系统栈中都有什么?LCALL、RETI等解析相关推荐
- 《uCOS51移植心得》---七年前之《快快乐乐跟我学51单片机操作系统和IP栈》
http://www.amobbs.com/forum.php?mod=viewthread&tid=3396563 <uCOS51移植心得>---七年前之<快快乐乐跟我学5 ...
- 51单片机之STC89C52RC最小系统板烧录说明
51单片机之STC89C52RC最小系统板烧录说明 STC89C52RC最小系统板 上面配的是11.0592MHz的晶振.其实使用12M也是可以使用的. STC89C52RC 如果动手能力强,自己购买 ...
- 基于51单片机的温室大棚环境检测系统
** 基于51单片机的温室大棚环境监测系统 空气温湿度监测,土壤温湿度监测,光照监测,无线传输数据 ** 文末尾附带源码 1.1 研究背景 随着人们生活水平的不断提高,人们对自身的健康越来越关注,对各 ...
- 基于51单片机的热水卡系统
基于51单片机的热水卡系统 说明 功能描述 主要材料 原理图和实物图 部分代码 补充说明 说明 首先很感谢您对这篇文章的阅读,这是我第一次写博文,写得不好的地方请谅解.文章中如果有侵权的请联系我,我会 ...
- 基于51单片机简单病床呼叫系统
基于51单片机简单病床呼叫系统 基于51单片机设计 主要硬件:AT89C52 扬声器.按键 采用16个按键控制16个床位系统设计 实现代码 #include<reg51.h> #defin ...
- 0800基于51单片机的甲烷监测系统proteus仿真
[前言] hello 大家好,今天给大家讲一讲基于51单片机的甲烷监测系统.该项目的功能如下:1.LCD1602液晶实时显示当前温度和甲烷浓度2.超过甲烷浓度阈值,蜂鸣器报警3.按键可更改甲烷浓度阈值 ...
- 基于51单片机太阳能光伏充电宝系统 +防过充 基于单片机太阳能充电系统
基于51单片机太阳能光伏充电宝系统 +防过充 基于单片机太阳能充电系统:由单片机最小系统+太阳能板+ADC0832转换模块+太阳能充电电池+升压模块+充电模块+继电器模块+液晶显示模块+USB供电组成 ...
- 51单片机自动浇水系统/51单片机自动浇花系统/智能浇水系统
51单片机自动浇水系统/51单片机自动浇花系统 整个设计由51单片机模块.湿度传感器模块(土壤湿度传感器或者温度传感器或者温湿度传感器,都可以).lcd1602液晶显示模块等组成,实现智能浇花和智能浇 ...
- 51单片机温度语音播报系统TTS播报DS18B20温度LCD1602显示
实践制作DIY- GC0023-温度语音播报系统 一.功能说明: 基于51单片机设计-温度语音播报系统 功能介绍: 1.STC89C52单片机(STC89C51/52 AT89C51/52 任选其一) ...
最新文章
- 201671010145 2016-2017《Java程序设计》JAVA语言中,异常处理有哪几种方式?
- 电缆桥架安装规范标准_电缆桥架怎么安装,桥架安装工艺分享
- 微信公众号无需二次登录_您无需两次解决问题-您需要一个设计系统
- 切题 (problem)(线段树+最大流最小割)
- 论文盘点:CVPR 2018 Top 20,华人发明的SENet居首!
- 二进制和八进制表示法
- 数据结构—链表-循环链表
- 图片不存在显示默认图片
- 中兴光猫F412超级管理员密码获取
- 线性代数笔记4.4(二)非齐次线性方程组解的结构
- 为什么程序员大多数都会脱发?( ConcurrentHashMap 并发)
- 机器学习算法系列(七)-对数几率回归算法(一)(Logistic Regression Algorithm)
- 室内定位如何介入工业互联网背景
- 矩阵计算:乘法,哈达玛积,克罗内克积 ,方阵的部分性质
- 线索二叉树(前中后序线索化/遍历/画线索)
- 性能 Android APP 帧数FPS的方法
- Linux 下 QT 安卓开发环境搭建
- SVN使用教程:一:安装及使用
- 【复杂网络】网络级联模型
- 爬取《斗破苍穹》小说