在调用函数时,也即当执行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
SP = SP + 1
(SP) = PC[7-0]
SP = SP + 1
(SP) = PC[15-8]
PC = addr16

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等解析相关推荐

  1. 《uCOS51移植心得》---七年前之《快快乐乐跟我学51单片机操作系统和IP栈》

    http://www.amobbs.com/forum.php?mod=viewthread&tid=3396563 <uCOS51移植心得>---七年前之<快快乐乐跟我学5 ...

  2. 51单片机之STC89C52RC最小系统板烧录说明

    51单片机之STC89C52RC最小系统板烧录说明 STC89C52RC最小系统板 上面配的是11.0592MHz的晶振.其实使用12M也是可以使用的. STC89C52RC 如果动手能力强,自己购买 ...

  3. 基于51单片机的温室大棚环境检测系统

    ** 基于51单片机的温室大棚环境监测系统 空气温湿度监测,土壤温湿度监测,光照监测,无线传输数据 ** 文末尾附带源码 1.1 研究背景 随着人们生活水平的不断提高,人们对自身的健康越来越关注,对各 ...

  4. 基于51单片机的热水卡系统

    基于51单片机的热水卡系统 说明 功能描述 主要材料 原理图和实物图 部分代码 补充说明 说明 首先很感谢您对这篇文章的阅读,这是我第一次写博文,写得不好的地方请谅解.文章中如果有侵权的请联系我,我会 ...

  5. 基于51单片机简单病床呼叫系统

    基于51单片机简单病床呼叫系统 基于51单片机设计 主要硬件:AT89C52 扬声器.按键 采用16个按键控制16个床位系统设计 实现代码 #include<reg51.h> #defin ...

  6. 0800基于51单片机的甲烷监测系统proteus仿真

    [前言] hello 大家好,今天给大家讲一讲基于51单片机的甲烷监测系统.该项目的功能如下:1.LCD1602液晶实时显示当前温度和甲烷浓度2.超过甲烷浓度阈值,蜂鸣器报警3.按键可更改甲烷浓度阈值 ...

  7. 基于51单片机太阳能光伏充电宝系统 +防过充 基于单片机太阳能充电系统

    基于51单片机太阳能光伏充电宝系统 +防过充 基于单片机太阳能充电系统:由单片机最小系统+太阳能板+ADC0832转换模块+太阳能充电电池+升压模块+充电模块+继电器模块+液晶显示模块+USB供电组成 ...

  8. 51单片机自动浇水系统/51单片机自动浇花系统/智能浇水系统

    51单片机自动浇水系统/51单片机自动浇花系统 整个设计由51单片机模块.湿度传感器模块(土壤湿度传感器或者温度传感器或者温湿度传感器,都可以).lcd1602液晶显示模块等组成,实现智能浇花和智能浇 ...

  9. 51单片机温度语音播报系统TTS播报DS18B20温度LCD1602显示

    实践制作DIY- GC0023-温度语音播报系统 一.功能说明: 基于51单片机设计-温度语音播报系统 功能介绍: 1.STC89C52单片机(STC89C51/52 AT89C51/52 任选其一) ...

最新文章

  1. 201671010145 2016-2017《Java程序设计》JAVA语言中,异常处理有哪几种方式?
  2. 电缆桥架安装规范标准_电缆桥架怎么安装,桥架安装工艺分享
  3. 微信公众号无需二次登录_您无需两次解决问题-您需要一个设计系统
  4. 切题 (problem)(线段树+最大流最小割)
  5. 论文盘点:CVPR 2018 Top 20,华人发明的SENet居首!
  6. 二进制和八进制表示法
  7. 数据结构—链表-循环链表
  8. 图片不存在显示默认图片
  9. 中兴光猫F412超级管理员密码获取
  10. 线性代数笔记4.4(二)非齐次线性方程组解的结构
  11. 为什么程序员大多数都会脱发?( ConcurrentHashMap 并发)
  12. 机器学习算法系列(七)-对数几率回归算法(一)(Logistic Regression Algorithm)
  13. 室内定位如何介入工业互联网背景
  14. 矩阵计算:乘法,哈达玛积,克罗内克积 ,方阵的部分性质
  15. 线索二叉树(前中后序线索化/遍历/画线索)
  16. 性能 Android APP 帧数FPS的方法
  17. Linux 下 QT 安卓开发环境搭建
  18. SVN使用教程:一:安装及使用
  19. 【复杂网络】网络级联模型
  20. 爬取《斗破苍穹》小说

热门文章

  1. 编辑器之神-vim的使用技巧
  2. Network Mess UVA - 1667
  3. Spring - IOC是怎么来的
  4. 微信小程序:提交表单数据中选择的日期
  5. flutter 获取当前屏幕宽高
  6. Google Chrome浏览器将阻止混合内容–您准备好了吗?
  7. 1984年 洛杉矶 第23届奥运会
  8. JSP Tomcat动态网页开发
  9. 动漫人物经典名言及口头禅:
  10. GIS之家demo源代码咨询