什么是堆栈,51单片机堆栈指针SP的使用举例
- 格式:docx
- 大小:9.70 KB
- 文档页数:2
堆栈的定义及应用堆栈(Stack)是一种数据结构,它按照后进先出(LIFO)的原则存储数据。
也就是说,最后存入堆栈的数据元素最先被取出,而最先存入的数据元素最后被取出。
堆栈中包含两个主要操作:压栈(Push)和弹栈(Pop)。
压栈是指将数据元素存入堆栈,弹栈是指从堆栈中取出数据元素。
除此之外,还有一个查看栈顶元素的操作。
堆栈的实际应用非常广泛,以下列举几个常见的应用场景:1. 函数调用与递归:在程序中,每当一个函数被调用,系统将会为这个函数分配一段内存空间,这段内存空间就被称为函数的栈帧。
当函数执行完毕后,栈帧会被销毁。
函数调用过程中,每次调用都会将返回地址和相关参数等信息压入栈中,在函数执行完毕后再将这些信息弹出。
递归函数的实现也离不开堆栈,每次递归调用都会生成一个新的栈帧,直到递归结束后才开始回溯弹栈。
2. 表达式求值:在编程语言中,堆栈可以用于实现算术表达式求值。
例如,中缀表达式需要通过堆栈进行转换成后缀表达式来简化计算过程,然后再通过堆栈进行后缀表达式的计算。
在进行表达式求值时,通过堆栈可以保存运算符和操作数的顺序,确保运算的优先级正确。
3. 括号匹配:在编程或者数学等领域,括号匹配是一个常见的问题。
我们可以使用堆栈来判断一个表达式中的括号是否匹配。
遍历表达式,每当遇到左括号时,将其压入堆栈。
当遇到右括号时,从堆栈中弹出一个左括号,若左右括号匹配,则继续遍历。
若右括号没有对应的左括号或者堆栈为空,则括号不匹配。
4. 浏览器的历史记录:在浏览器中,通过点击链接或者前进后退按钮,我们可以在不同的网页之间进行切换。
这种网页切换也可以使用堆栈来实现浏览历史记录的功能。
每当访问一个新网页时,将其URL压入堆栈顶部;当点击前进按钮时,从堆栈中弹出一个URL;当点击后退按钮时,将当前页面的URL压入堆栈,然后再弹出上一个URL。
5. 撤销与恢复:在许多软件中,都提供了撤销与恢复功能。
当用户对文档进行操作时,软件会将操作信息(如添加、删除、修改等)压入堆栈中,当用户点击撤销时,软件会从堆栈中弹出最近的操作信息并进行撤销操作;当用户点击恢复时,软件会从堆栈中弹出已经撤销的操作信息并进行恢复。
51单片机堆栈操作指令的用法51单片机是一种非常常用的单片机芯片,其指令集非常丰富,其中包含了很多堆栈操作指令。
堆栈操作指令是用来进行数据的入栈和出栈操作的指令,通过堆栈操作指令,我们可以方便地保存和恢复程序执行中的临时数据,提高代码的灵活性和效率。
本文将详细介绍51单片机堆栈操作指令的用法,帮助读者更好地理解和运用这些指令。
一、堆栈简介堆栈(Stack)是一种特殊的数据结构,具有后进先出(LIFO)的特点。
在51单片机的内部RAM中,有一段专门用来存放堆栈的空间,这段空间的大小为128字节(地址为0x07Fh至0x080h)。
在程序执行过程中,我们可以通过堆栈操作指令将数据入栈或者出栈,进栈是将数据放入堆栈,出栈是将数据从堆栈中取出。
二、堆栈操作指令51单片机的指令集中包含了以下几条堆栈操作指令:1. PUSH 指令PUSH指令用于将8位数据入栈,将要入栈的数据放入寄存器A中,通过PUSH 指令可以将A的数据压入堆栈。
PUSH指令的实际操作是将A的数据先放入栈顶指针(SP)所指向的内存单元中,然后将SP的值减1,即栈顶指针向下移动一个位置。
2. POP 指令POP指令用于将数据出栈,即从堆栈中取出一个8位数据,并放入寄存器A中。
POP指令的实际操作是将栈顶指针向上移动一个位置,然后将栈顶指针所指向的内存单元中的数据取出,并放入A中。
3. XCH指令XCH指令用于交换A寄存器的数据和栈顶指针所指向的内存单元的数据。
具体操作是将栈顶指针所指向的内存单元中的数据取出,并放入A中,然后将A中的数据放回栈顶指针所指向的内存单元中。
4. LCALL指令LCALL指令是一个特殊的调用指令,用于将下一条指令的地址入栈,并转移到指定地址处执行。
具体操作是将下一条指令的地址(即当前指令的地址加3)入栈,然后将指定地址的值赋给程序计数器(PC)。
5. RET指令RET指令用于从子程序返回,从堆栈中取出地址,并赋给程序计数器(PC),从而实现返回到调用该子程序的地方继续执行。
单⽚机原理及接⼝技术课后习题答案第⼆章1.89C51单⽚机内包含哪些主要逻辑功能部件?答:80C51系列单⽚机在⽚内集成了以下主要逻辑功能部件:(l)CPU(中央处理器):8位 (2)⽚内RAM:128B (3)特殊功能寄存器:21个 (4)程序存储器:4KB(5)并⾏I/O⼝:8位,4个 (6)串⾏接⼝:全双⼯,1个 (7)定时器/计数器:16位,2个(8)⽚内时钟电路:1个2.89C51的EA端有何⽤途?答:/EA端接⾼电平时,CPU只访问⽚内/doc/c312e1f309a1284ac850ad02de80d4d8d15a01a8.html 并执⾏内部程序,存储器。
/EA端接低电平时,CPU只访问外部ROM,并执⾏⽚外程序存储器中的指令。
/EA端保持⾼电平时,CPU执⾏内部存储器中的指令。
3. 89C51的存储器分哪⼏个空间?如何区别不同空间的寻址?答:ROM(⽚内ROM和⽚外ROM统⼀编址)(使⽤MOVC)(数据传送指令)(16bits地址)(64KB)⽚外RAM(MOVX)(16bits地址)(64KB)⽚内RAM(MOV)(8bits地址)(256B)4. 简述89C51⽚内RAM的空间分配。
答:⽚内RAM有256B ,低128B是真正的RAM区,⾼128B是SFR(特殊功能寄存器)区5. 简述布尔处理存储器的空间分配,⽚内RAM中包含哪些可位寻址单元。
答:⽚内RAM区从00H~FFH(256B),其中20H~2FH(字节地址)是位寻址区,对应的位地址是00H~7FH7. 89C51如何确定和改变当前⼯作寄存器组?答:PSW(程序状态字)(Program Status Word)中的RS1和RS0可以给出4种组合,⽤来从4组⼯作寄存器组中进⾏选择,PSW属于SFR(Special Function Register)(特殊功能寄存器)9. 读端⼝锁存器和“读引脚”有何不同?各使⽤哪种指令?答:读锁存器(ANL P0,A)就是相当于从存储器中拿数据,⽽读引脚是从外部拿数据(如MOV A,P1 这条指令就是读引脚的,意思就是把端⼝p1输⼊数据送给A)传送类MOV,判位转移JB、JNB、这些都属于读引脚,平时实验时经常⽤这些指令于外部通信,判断外部键盘等;字节交换XCH、XCHD算术及逻辑运算 ORL、CPL、ANL、ADD、ADDC、SUBB、INC、DEC控制转移CJNE、DJNZ都属于读锁存器。
习题和思考题答案习题和思考题答案第⼀章单⽚机概述1. 第⼀台电⼦数字计算机发明的年代和名称。
1946年、ENIAC。
2. 根据冯·诺依曼提出的经典结构,计算机由哪⼏部分组成?运算器、控制器、存储器、输⼊设备和输出设备组成。
3. 微型计算机机从20世纪70年代初问世以来,经历了哪四代的变化?经历了4位、8位、16位、32位四代的变化。
4. 微型计算机有哪些应⽤形式?系统机、单板机、单⽚机。
5. 什么叫单⽚机?其主要特点有哪些?单⽚机就是在⼀⽚半导体硅⽚上,集成了中央处理单元(CPU)、存储器(RAM、ROM)、并⾏I/O、串⾏I/O、定时器/计数器、中断系统、系统时钟电路及系统总线的⽤于测控领域的微型计算机,简称单⽚机。
单⽚机技术易于掌握和普及、功能齐全,应⽤⼴泛、发展迅速,前景⼴阔、嵌⼊容易,可靠性⾼。
6. 举例说明单⽚机的应⽤?略7. 当前单⽚机的主要产品有哪些?各⾃有何特点?MCS是Intel公司⽣产的单⽚机的系列符号,MCS-51系列单⽚机是Intel公司在MCS-48系列的基础上于20世纪80年代初发展起来的,是最早进⼊我国,并在我国应⽤最为⼴泛的单⽚机机型之⼀,也是单⽚机应⽤的主流品种。
其它型号的单⽚机:PIC单⽚机、TI公司单⽚机、A VR系列单⽚机。
8. 简述单⽚机应⽤系统的开发过程。
(1)根据应⽤系统的要求进⾏总体设计总体设计的⽬标是明确任务、需求分析和拟定设计⽅案,确定软硬件各⾃完成的任务等。
总体设计对应⽤系统是否能顺利完成起着重要的作⽤。
(2)硬件设计根据总体设计要求设计并制作硬件电路板(即⽬标系统),制作前可先⽤仿真软件(如Proteus软件)进⾏仿真,仿真通过后再⽤硬件实现并进⾏功能检测。
(3)软件设计软件编程并调试,⽬前⼀般⽤keil软件进⾏设计调试。
调试成功后将程序写⼊⽬标单⽚机芯⽚中。
(4)综合调试进⾏硬软件综合调试,检测应⽤系统是否达到设计的功能。
9. 说明单⽚机开发中仿真仪的作⽤。
一、51单片机的硬件结构1. 硬件结构框图说明:○1微处理器(CPU):51单片机含一个8位CPU,与通用的CPU功能基本相同,含运算器和控制器,不仅可以字节处理,还可以位处理。
例如:未处理、查表、状态检测、中断处理等。
○2数据存储器(RAM):51为128B,52为256B;片外最大可扩展到64K。
○3程序存储器(ROM/EPROM):8031没有,8051有4K的ROM,8751有4K的EPROM;片外可扩展至64K。
○4中断系统:5个中断源,2级优先权。
○5定时器/计数器:2个16位定时/计数器,四种工作方式。
○6串行口:1个全双工串行口,四种工作方式。
可进行串口通信,扩展并行I/O口,多机通信等。
○7P1、P2、P3、P0口:四个8位并行I/O口。
○8特殊功能寄存器(SFR):共21个,对片内部件进行管理、控制、监视;实际上是一些控制寄存器和状态寄存器,是一个具有特殊功能的RAM区。
2. 引脚排列(1)电源及时钟引脚○1电源引脚:Vcc(40脚)解5V电源、Vss(20脚)接地。
○2时钟引脚:两个始终引脚XTAL1、XTAL2外接晶振,或接晶体与片内反相放大器构成振荡器。
XTAL1(19脚):内部反相放大器的输入端。
若接晶振则应接地;XTAL2(18脚):内部反相放大器的输出端。
若采用外部时钟振荡器,该引脚接收时钟振荡信号。
(2)控制引脚○1RST/Vpd(9脚):复位信号输入,高电平有效。
单片机运行时,此脚持续2个机器周期(24个时钟振荡周期)的高电平,就可复位。
平时应为0.5V低电平;Vpd为第二功能,备用电源输入端。
○2:ALE为地址锁存允许,正常工作时,ALE不断输出正脉冲信号。
当访问外部存储器时,ALE输出信号的负跳变沿用作低8位地址的锁存信号;PROG’为编程脉冲输入端。
○3PSEN’(Program Strobe Enable,29脚):程序存储器允许输出控制端。
低电平是外部程序存储器选通。
MCS-51单片机存储器结构MCS-51的存储器可分为四类:程序存储器一个微处理器能够聪明地执行某种任务,除了它们强大的硬件外,还需要它们运行的软件,其实微处理器并不聪明,它们只是完全按照人们预先编写的程序而执行之。
那么设计人员编写的程序就存放在微处理器的程序存储器中,俗称只读程序存储器(ROM)。
程序相当于给微处理器处理问题的一系列命令。
其实程序和数据一样,都是由机器码组成的代码串。
只是程序代码则存放于程序存储器中。
MCS-51具有64kB程序存储器寻址空间,它是用于存放用户程序、数据和表格等信息。
对于内部无ROM的8031单片机,它的程序存储器必须外接,空间地址为64kB,此时单片机的端必须接地。
强制CPU从外部程序存储器读取程序。
对于内部有ROM的8051等单片机,正常运行时,则需接高电平,使CPU先从内部的程序存储中读取程序,当PC值超过内部ROM的容量时,才会转向外部的程序存储器读取程序。
8051片内有4kB的程序存储单元,其地址为0000H—0FFFH,单片机启动复位后,程序计数器的内容为0000H,所以系统将从0000H 单元开始执行程序。
但在程序存储中有些特殊的单元,这在使用中应加以注意:其中一组特殊是0000H—0002H单元,系统复位后,PC为0000H,单片机从0000H单元开始执行程序,如果程序不是从0000H单元开始,则应在这三个单元中存放一条无条件转移指令,让CPU直接去执行用户指定的程序。
另一组特殊单元是0003H—002AH,这40个单元各有用途,它们被均匀地分为五段,它们的定义如下:0003H—000AH 外部中断0中断地址区。
000BH—0012H 定时/计数器0中断地址区。
0013H—001AH 外部中断1中断地址区。
001BH—0022H 定时/计数器1中断地址区。
0023H—002AH 串行中断地址区。
可见以上的40个单元是专门用于存放中断处理程序的地址单元,中断响应后,按中断的类型,自动转到各自的中断区去执行程序。
思考题:【2-1】80C51单片机由哪几部分组成,试说明ROM和RAM的功能分别是什么?【2-2】在程序运行中,PC的值是。
()A)当前正在执行指令的前一条指令的地址B)当前正在执行指令的地址C)当前正在执行指令的下一条指令的首地址D)控制器中指令寄存器的地址【2-3】判断下列说法是否正确。
(1)PC可以存放一个16位二进制数,因此其寻址范围为0000H~7FFFH。
()(2)单片机系统复位时PC的内容为0000H,因此CPU从程序存储器0000H地址单元取指令,开始执行程序。
()(3)PC可以看成是程序计时器()(4)PC可以看成是程序存储器的地址指针。
()【2-4】试计算当振荡频率为12 MHz和6 MHz时,一个机器周期的长度?试辨析振荡周期、状态周期、机器周期、指令周期之间的关系。
【2-5】单片机的ROM必须具有掉电存储功能,这句话是否正确?【2-6】单片机对RAM的根本要求是快,但掉电可丢失数据,这个表述正确吗?【2-7】试说出80C51的两种时钟电路模式,如果是只有一个单片机工作常使用的是哪一种?如果是两个以上的单片机工作使用哪一种?【2-8】80C51单片机的EA信号有何功能?在使用8031时,EA信号引脚应如何处理?现在使用的80C51系列单片机内部一般均含有ROM,其EA引脚应该怎么接?【2-9】80C51系列单片机的三总线结构包括哪三种?其中作地址总线指的是?作数据总线指的是?属于控制总线的有?P0口的分时复用功能需要依靠锁存器的锁存功能,试举1种常用的低功耗锁存器并将其与单片机正确连接?【2-10】片内RAM低128单元一般划分为哪三个主要部分?对应的字节地址空间是?内部RAM中,可作为工作寄存器区的单元地址为()H~()H。
【2-11】80C51单片机任何一个时间4组通用工作寄存器中只能有一组工作,具体哪一组工作由什么来决定?如何设置才能选用0组通用寄存器?【2-12】80C51单片机具有很强的位(布尔)处理功能,内部RAM中共有多少单元可以位寻址,试写出其字节范围和位地址范围?【2-13】位地址00H与字节地址00H在内存中的位置有什么区别?片内字节地址为2AH单元最低位的位地址是();片内字节地址为88H单元的最低位的位地址为()。
1.2 单片机内部主要部件单片机内部电路比较复杂,MCS-51系列的8051型号单片机的内部电路根据功能可以分为CPU、RAM、ROM/EPROM、并行口、串行口、定时/计数器、中断系统及特殊功能寄存器(SFR)等8个主要部件,如图1-2-1所示。
这些部件通过片内的单一总线相连,采用CPU加外围芯片的结构模式,各个功能单元都采用特殊功能寄存器集中控制的方式。
其他公司的51系列单片机与8051结构类似,只是根据用户需要增加了特殊的部件,如A/D转换器等。
在设计程序过程中,寄存器的使用非常频繁。
本节内容在了解单片机内部的组成机构基础上,重点介绍单片机内部常用的寄存器的作用。
图1-2-1 MCS-51架构1.2.1中央处理器(CPU)中央处理器是单片机的核心,主要功能是产生各种控制信号,根据程序中每一条指令的具体功能,控制寄存器和输入/输出端口的数据传送,进行数据的算术运算、逻辑运算以及位操作等处理。
MCS-51系列单片机的CPU字长是8位,能处理8位二进制数或代码,也可处理一位二进制数据。
单片机的CPU从功能上一般可以分为运算器和控制器两部分。
一、控制器控制器由程序计数器PC、指令寄存器、指令译码器、定时控制与条件转移逻辑电路等组成。
其功能是对来自存储器中的指令进行译码,通过定时电路,在规定的时刻发出各种操作所需的全部内部和外部的控制信号,使各部分协调工作,完成指令所规定的功能。
各部分功能部件简述如下。
1.程序计数器PC(Program Counter)程序计数器是一个16位的专用寄存器,用来存放下一条指令的地址,具有自动加1的功能。
当CPU要取指令时,PC的内容送地址总线上,从存储器中去取出一个指令码后,PC 内容自动加1,指向下一个指令码,以保证程序按顺序执行。
PC是用来指示程序的执行位置,在顺序执行程序时,单片机每执行一条指令,PC就自动加1,以指示出下一条要取的指令的存储单元的16位地址。
也就是说,CPU总是把PC 的内容作为地址,根据该地址从存储器中取出指令码或包含在指令中的操作数。
51单片机堆栈深入剖析用C语言进行MCS51系列单片机程序设计是单片机开发和应用的必然趋势。
Keil公司的C51编译器支持经典8051和8051派生产品的版本,通称为Cx51。
应该说,Cx51是C语言在MCS51单片机上的扩展,既有C语言的共性,又有它自己的特点。
本文介绍的是Cx51程序设计时堆栈的计算方法。
1.堆栈的溢出问题。
MCS51系列单片机将堆栈设置在片内RAM中,由于片内RAM资源有限,堆栈区的范围也是有限的。
堆栈区留得太大,会减少其他数据的存放空间,留得太少则很容易溢出。
所谓堆栈溢出,是指在堆栈区已经满了的时候还要进行新的压栈操作,这时只好将压栈的内容存放到非堆栈区的特殊功能寄存器(SFR)中或者堆栈外的数据区中。
特殊功能寄存器的内容影响系统的状态,数据区的内容又很容易被程序修改,这样一来,之后进行出栈操作(如子程序返回)时内容已变样,程序也就乱套了。
因此,堆栈区必须留够,宁可大一些。
要在Cx51程序设计中防止堆栈的溢出,要解决两个问题:第一,精确计算系统分配给用户的堆栈大小,假设是M;第二,精确计算用户需要堆栈的大小,假设是N。
要求M≥N,下面分别分析这两个问题。
2.计算系统分配给用户的堆栈大小Cx51程序设计中,因为动态局部变量是长驻内存中的,实际上相当于局部静态变量,即使在函数调用结束时也不释放空间(这一点不同于标准C语言)。
Cx51编译器按照用户的设置,将所有的变量存放在片内和片外的RAM中。
片内变量分配好空间后,将剩下的空间全部作为堆栈空间,这个空间是最大可能的堆栈空间。
当然,因为Cx51是一种可以访问寄存器的C语言(特殊功能寄存器),因此可在程序中访问SP,将堆栈空间设置得小一点。
不过,一般没有人这么做。
本文只是讨论放在片内RAM的变量。
我们把变量分为两种情况:①用作函数的参数和函数返回值的局部变量。
这种变量尽量在寄存器组中存放。
为了讨论方便,假设统一用寄存器组0,具体的地址为0x00~0x07。
C语言及ARM中堆栈指针SP设置的理解与总结1什么是栈百度这么说:栈是一种特殊的线性表,是一种只允许在表的一端进行插入或删除操作的线性表。
表中允许进行插入、删除操作的一端称为栈顶。
表的另一端称为栈底。
栈顶的当前位置是动态的,对栈顶当前位置的标记称为栈顶指针。
当栈中没有数据元素时,称之为空栈。
栈的插入操作通常称为进栈或入栈,栈的删除操作通常称为退栈或出栈。
简易理解:客栈,即临时寄存的地方,计算机中的堆栈主要用来保存临时数据,局部变量和中断/调用子程序程序的返回地址。
程序中栈主要是用来存储函数中的局部变量以及保存寄存器参数的,如果你用了操作系统,栈中还可能存储当前进线程的上下文。
设置栈大小的一个原则是,保证栈不会下溢出到数据空间或程序空间.CPU在运行程序时,会自动的使用堆栈,所以堆栈指针SP就必须要在调用C程序前设定。
CPU的内存RAM空间存放规律一般是分段的,从地址向高地址,依次为:程序段(.text)、BSS段,上面还可能会有堆空间,然后最上面才是堆栈段。
这样安排堆栈,是因为堆栈的特点决定的,堆栈的指针SP初始化一般在堆栈段的高地址,也就是内存的高地址,然后让堆栈指针向下增长(其实就是递减)。
这样做的好处就是堆栈空间远离了其他段,不会跟其他段重叠,造成修改其他段数据,而引起不可预料的后果,还有设置堆栈大小的原则,要保证栈不会下溢出到数据空间或者程序空间。
所谓堆栈溢出,是指堆栈指针SP向下增长到其他段空间,如果栈指针向下增长到其他段空间,称为堆栈溢出。
堆栈溢出会修改其他空间的值,严重情况下可造成死机. 2堆栈指针的设置开始将堆栈指针设置在内部RAM,是因为不是每个板上都有外部RAM,而且外部RAM 的大小也不相同,而且如果是SDRAM,还需要初始化,在内部RAM开始运行的一般是一个小的引导程序,基本上不怎么使用堆栈,因此将堆栈设置在内部RAM,但这也就要去改引导程序不能随意使用大量局部变量。
什么是堆栈?MCS-51单片机的堆栈怎样设置的?答:程序设计时,往往需要一个后进先出的RAM区,以保存CPU的现场。
这种后进先出的缓冲区,就称为堆栈。
MCS-51单片的堆栈原则上设在内部RAM的任意区域内。
但是,一般设在31H~7FH的范围之间,栈顶的位置由栈指针SP指出。
51单片机堆栈操作指令举例说明时间:2009-03-02 18:46来源:未知作者:牛牛点击:149次这4类指令的作用是把直接寻址单元的内容传送到堆栈指针SP所指的单元中,以及把SP 所指单元的内容送到直接寻址单元中。
这类指令只有两条,下述的第一条常称为入栈操作指令,第二条称为出栈操作指令。
需要指出的是,单片机开机复位后,(SP)默认为07H,但一般都需要重新赋值,设置新的SP首址。
入栈的第一个数据必须存放于SP+1所指存储单元,故实际的堆栈底为SP+1所指的存储单元。
堆栈操作指令有两条: PUSH direct POP direct 第一条指令称之为推入,就是将direct中的内容送入堆栈中,第二条指令称之为弹出,就是将堆栈中的内容送回到direct中。
推入指令的执行过程是,首先将SP中的值加1,然后把SP 中的值当作地址,将direct中的值送进以堆栈操作指令有两条:PUSH directPOP direct第一条指令称之为推入,就是将direct中的内容送入堆栈中,第二条指令称之为弹出,就是将堆栈中的内容送回到direct中。
推入指令的执行过程是,首先将SP中的值加1,然后把SP中的值当作地址,将direct中的值送进以SP中的值为地址的RAM单元中。
例:MOV SP,#5FHMOV A,#100MOV B,#20PUSH ACCPUSH B则执行第一条PUSH ACC指令是这样的:将SP中的值加1,即变为60H,然后将A中的值送到60H单元中,因此执行完本条指令后,内存60H单元的值就是100,同样,执行PUSH B时,是将SP+1,即变为61H,然后将B中的值送入到61H单元中,即执行完本条指令后,61H单元中的值变为20。
mcs51单片机堆栈处理过程MCS51单片机堆栈处理过程MCS51单片机是一种常用的8位微控制器,具有强大的数据处理和控制能力。
在MCS51单片机中,堆栈是一种重要的数据结构,用于存储程序执行过程中的临时数据和返回地址。
本文将详细介绍MCS51单片机堆栈的处理过程。
1. 堆栈的概念堆栈是一种先进后出(Last In First Out,LIFO)的数据结构,类似于我们日常生活中的堆叠物品的方式。
在MCS51单片机中,堆栈是由一段连续的内存空间组成的,用于存储程序执行过程中的临时数据和返回地址。
堆栈指针(Stack Pointer,SP)用于指示当前堆栈的栈顶位置。
2. 堆栈的操作MCS51单片机通过一组特定的指令来实现堆栈的操作。
常用的堆栈操作指令包括PUSH(将数据入栈)和POP(将数据出栈)。
具体操作过程如下:2.1 PUSH指令PUSH指令用于将数据压入堆栈。
执行PUSH指令时,首先将堆栈指针减1,然后将数据写入堆栈指针所指向的内存单元。
堆栈指针的更新保证了每次PUSH操作都将数据写入到新的内存位置,避免数据被覆盖。
2.2 POP指令POP指令用于将数据从堆栈中弹出。
执行POP指令时,首先将堆栈指针所指向的内存单元中的数据读取出来,然后将堆栈指针加1。
这样可以确保每次POP操作都能获取到正确的数据,并将堆栈指针恢复到上一次的位置。
3. 堆栈的应用堆栈在MCS51单片机中广泛应用于函数调用和中断处理等场景。
在函数调用中,当一个函数被调用时,会将函数的返回地址和参数等数据压入堆栈,然后执行函数体内的代码。
当函数执行完毕后,会从堆栈中弹出返回地址,继续执行调用函数的代码。
这样可以实现函数的嵌套调用,保证程序执行的顺序和正确性。
在中断处理中,当一个中断事件发生时,MCS51单片机会自动保存当前的程序现场(包括程序计数器、寄存器状态等)到堆栈中,然后跳转到中断服务程序,并开始执行相应的中断处理代码。
习题一1.什么是单片机,和微机相比较,它有什么优点?2.请叙述51系列单片机的主要产品及其特点。
3.除51系列单片机外,常用的单片机还有哪些型号,各有什么优点?4.单片机中常用的数制有哪些,它们之间相互如何转换?5.计算机中常用的二进制编码有哪些,请分别予以叙述。
6.(1)10和(-1)10的原码、反码和补码分别是多少?习题二1.单片机主要应用在什么领域?2. 89C51单片机包含哪些主要逻辑功能部件? 各有什么主要功能?3.89C51单片机EA端如何使用?4.什么是机器周期、指令周期?89C51指令周期、机器周期和时钟周期的关系如何?当主频为12MHz时,一个机器周期等于多少微秒?执行一条最长的指令需多少微秒?5.如何认识89C51存储器空间在物理结构上可划分为四个空间,而在逻辑上又可划分为三个空间?各空间的寻址范围、寻址方式是什么?6.89C51有哪些主要的特殊功能寄存器,分布在哪里?7.内部RAM低128B从功能和用途方面,可划分为哪三个区域?8.89C51内部RAM有几组工作寄存器?每组工作寄存器有几个工作寄存器?寄存器组的选择由什么决定?9.89C51的外部RAM和I/O口是如何编址的,如何寻址?10.89C51的程序存储器的寻址空间是多少,如何区别片内程序存储器和片外程序存储器的?11.89C51的位寻址区在哪里,位寻址空间是多少?12.什么是堆栈,什么是SP,89C51的堆栈位于什么地方,复位后堆栈指针初值是多少,一般将SP设置为多少?进栈、出栈时堆栈指针将怎样变化?13.单片机包括哪两种复位方式,在单片机应用系统中为何需要系统复位,复位后主要寄存器的状态如何?14.89C51的P3口各引脚的第二功能是什么?15.89C51有几种低功耗方式,如何进入和退出?习题三1.什么是指令,什么是指令系统?2.89C51总共有多少条指令,分为哪几类?3.89C51有哪些寻址方式,各自的寻址空间如何?4.说明下列指令中源操作数采用的寻址方式。
什么是ARM中的SP(堆栈)和LR?LR是⽤于保存函数调⽤的返回地址的。
SP是堆栈指针。
堆栈通常⽤于在函数调⽤中保存”automatic”变量和上下⽂/参数。
从概念上讲,您可以将”stack”视为您”pile”您的数据的地⽅。
您将”stacking”保留在⼀个数据之上,堆栈指针告诉您”high”的数据是”stack”。
您可以从”stack”的”top”中删除数据并缩短。
从ARM架构参考:SP, the Stack PointerRegister R13 is used as a pointer to the active stack.In Thumb code, most instructions cannot access SP. The only instructions that can access SP are those designed to use SP asa stack pointer. The use of SP for any purpose other than as a stack pointer is deprecated. Note Using SP for any purpose otherthan as a stack pointer is likely to break the requirements of operating systems, debuggers, and other software systems, causing them to malfunction.LR, the Link RegisterRegister R14 is used to store the return address from a subroutine. At other times, LR can be used for other purposes.When a BL or BLX instruction performs a subroutine call, LR is set to the subroutine return address. To perform a subroutinereturn, copy LR back to the program counter. This is typically done in one of two ways, after entering the subroutine with a BL or BLX instruction:• Return with a BX LR instruction.• On subroutine entry, store LR to the stack with an instruction of the form: PUSH {,LR} and use a matching instruction to return: POP {,PC} …次佳解决⽅案SP是堆栈寄存器,⽤于键⼊r13的快捷⽅式。
编程模型Keil中的执行情况编程模型寄存器组8位数据寄存器组16位地址寄存器组程序计数器PC堆栈指针SP状态标记寄存器组指令集汇编指令集C51指令集编程模型16位地址寄存器组片内ROM 8位数据寄存器组片内RAM地址内容(指令)0x0FFF xx0x0FFE xx (xx)0x0101xx0x0100xx (xx)0x0002xx0x0001xx0x0000 xx 地址内容(数据)0x7F xx0xFE xx (xx)0x61xx0x60xx (xx)0x02xx0x01xx0x00 xx只考虑片内时SP、PCSP PCSP:堆栈指针,51单片机堆栈是向上生长型,即栈底是低位地址。
SP 指向栈顶。
存放有顺序要求的数据。
用途:(1)用来存放压入堆栈的数据。
(2)存放函数调用是断口地址。
(3)中断断口地址及保存数据。
51单片机复位后的SP默认地址:07H,为了避免和位寻址区重合,一般设置50H或者60H。
PC:程序计数器,51单片机内不可访问,独立结构的16位地址寄存器。
(1)自动+1,CPU从ROM中每读一个字节,自动执行PC+1→PC。
(2)执行转移指令,PC会根据指令要求修改下一次读ROM的地址(3)执行子程序调用或中断时,CPU自动将下一条执行的PC值压入堆栈,将子程序或中断入口地址装入PC,返回时,恢复原有压入堆栈的PC值,继续执行原程序。
举一个例子(汇编程序)ORG0000H;规定下一条指令的起始地址为0000HJMP START;跳转指令,程序跳转到START处执行ORG0400H;规定下一条指令DELY 的起始地址为0400HDELY: ;子函数DELYNOP;NOP指令,空操作,什么都不做,消耗该指令周期的时间RET;返回指令,弹出堆栈中断口地址,DELY调用返回指令ORG0100H;规定下一条指令START 的起始地址为0100HSTART: ;函数STARTMOV SP,#60H ;设置堆栈指针的值,即设置单片机栈底的地址为60HMOV DPTR,#1234H;将立即数1234H赋值给DPTR,其中低8位给DPTR的DPL(34H),;高8位给DPTR的DPH(12H)PUSH DPH;将DPH中数据12H压入堆栈PUSH DPL;将DPL中数据34H压入堆栈CALL DELY;调用子函数DELYPOP DPH;弹出堆栈中栈顶数据到DPH中POP DPL;弹出堆栈中栈顶数据到DPL中LJMP$;原地等待END;结束标志KEIL中的执行情况PC=0x0000 ;即0000HSP=0x07 ;即07H黄色箭头表示PC指针指向PC=0x0100 ;即0100H SP=0x07 ;即07HPC指针指向下一条指令PC=0x0103 ;即0103H SP=0x60 ;即60HPC指针指向下一条指令PC=0x0106 ;即0106H SP=0x60 ;即60HPC指针指向下一条指令PC=0x0108 ;即0108HSP=0x61 ;即61H,且地址为61H中的数据为12H PC指针指向下一条指令PC=0x010A ;即010AHSP=0x62 ;即62H,且地址为61H中的数据为12H,62H中的数据为34HPC指针指向下一条指令PC=0x0400 ;即0400HSP=0x64 ;即62H,且地址为61H中的数据为12H,62H中的数据为34H,63H中的数据为0CH,64H中的数据为01H。
什么是堆栈,51单片机堆栈指针SP的使用举例
SP:堆栈指针。
(专用于指出堆栈顶部数据的地址。
)堆栈介绍:日常这样的现象,家里洗的样的现象,家里洗的碗,一只一只摞起来,最晚放上去的放在最上面,而最早放上去的则放在最下面,在取的时候正好相反,先从最上面取,这种现象我们用一句话来概括:先进后出,后进先出。
请大家想想,还有什么地方有这种现象?其实比比皆是,建筑工地上堆放的砖头、材料,仓库里放的货物,都是先进后出,后进先出,这实际是一种存取物品的规则,我们称之为堆栈。
在单片机中,我们也能在RAM中构造这样一个区域,用来存放数据,这个区域存放数据的规则就是先进后出,后进先出,我们称之为堆栈。
为什么需要这样来存放数据呢?存储器本身不是能按地址来存放数据吗?对,知道了地址的确就能知道里面的内容,但如果我们需要存放的是一批数据,每一个数据都需要知道地址那不是麻烦吗?如果我们让数据一个接一个地放置,那么我们只要知道第一个数据所在地址单元就能了(看图2)如果第一个数据在27H,那么第二、三个就在28H、29H了。
所以利用堆栈这种办法来放数据能简化操作那么51中堆栈什么地方呢?单片机中能存放数据的区域有限,我们不能够专门分配一块地方做堆栈,所以就在内存(RAM)中开辟一块地方,用于堆栈,但是用内存的哪一块呢?还是不好定,因为51是一种通用的单片机,各人的实际需求各不相同,有人需要多一些堆栈,而有人则不需要那么多,所以怎么分配都不合适,怎样来解决这个问题?分不好干脆就不分了,把分的权利给用户(编程者),根据自已的需要去定吧,所以51单片机中堆栈的位置是能变化的。
而这种变化就体现在SP中值的变化,看图2,SP中的值等于27H 不就相当于是一个指针指向27H单元吗?当然在真正的51机中,开始指针所指的位置并非就是数据存放的位置,而是数据存放的前一个位置,比如一开始。