堆栈操作类指令(2条)
这4类指令的作用是把直接寻址单元的内容传送到堆栈指针SP所指的单元中,以及把SP所指单元的内容送到直接寻址单元中。这类指令只有两条,下述的第一条常称为入栈操作指令,第二条称为出栈操作指令。需要指出的是,单片机开机复位后,(SP)默认为07H,但一般都需要重新赋值,设置新的SP首址。入栈的第一个数据必须存放于SP+1所指存储单元,故实际的堆栈底为SP+1所指的存储单元。
PUSH data ;(SP)+1→(SP),(data)→(SP) 堆栈指针首先加1,直接寻址单元中的数据送到堆栈指针SP所指的单元中
POP data ;(SP)→(data)(SP)-1→(SP), 堆栈指针SP所指的单元数据送到直接寻址单元中,堆栈指针SP再进行减1操作
第一条指令称为推入,就是将direct中的内容送入堆栈中,第二条指令称为弹出,就是将堆栈中的内容送回到direct中,推入指令的执行过程是:首先将P中的值加1,然后把SP中的值当做地址,将direct中的值送入以SP中的值为地址的RAM单元中去。
例:
MOV SP,#5FH
MOV A,#100
MOV B,#20
PUSH ACC
PUSH B
执行第一条PUSH ACC指令是这样的:将SP中的值加1,即变为60H,然后将A中的值送到60H单元中,因此执行完本条指令后,内存60H单元中的值就是100,同样执行PUSH B时,是将SP+1,即变为61H,然后将B中的值送入到61H单元中,即执行完本条指令后61H单元中的值变为20。
POP指令的执行也是这样的,首先将SP中的值做为地址,并将此地址中的数送到POP指令的那个direct中,然后SP减1。
接上例:
POP B
POP ACC
则执行过程是:将SP中的值(现在是61H)作为地址,取61H单元中的数值(现在是20),送到B中,所以执行完本条指令后B中的值是20,然后SP减1,因此本条指令执行完后,SP的值变为60H,然后搪行POP ACC,将SP中的值(60H)作为地址,从该地址中取数(现在是100),并送到ACC中,所以执行完本条指令后,ACC中的值是100。
这有什么意义呢?ACC中的值本来就是100,B中的值本来就是20,是的,在本例中,的确没有意义,但在实际工作中,则在PUSH B后往事要执行其它的指令,而且这些指令会把A中的值,B中的值改掉,所以在程序结束,如果我们要把A和B中的值恢复原值,那么这些指令就没有意义了。
还有一个问题,如果我们不用堆栈,比如说在PUSH ACC指令处用MOV 60H,A在PUSH B处用指令MOV 61H,B,然后用MOV A,60H,MOV B,61H来替代两处POP指令,不也是一样吗?是的,从结果上看是一样的,但从过程看是不一样的,PUSH和POP指令都是单字节,单周期指令,而MOV指令则是双字节,双周期指令,更何况,堆栈的作用不止于此,所以一般的计算机上都设有堆栈,而我们在编写子程序,需要保存数据时,通常不采用后面的方法,而是用堆栈的方法来实现。
例:写出以下程序的运行结果
MOV 30H,#12
MOV 31H,#23
PUSH 30H
PUSH 31H
POP 30H
POP 31H
结果是30H中的值变为23,而31H中的值则变为12。也就是两者进行了数据交换。从这个例子可以看出:使用堆栈时,入栈的书写顺序和出栈的书写顺序必须相反,才能保证数据被送回原位,否则就出错了。
另外特别注意事项:
进行堆栈操作时,我们不能:
PUSH R0
PUSH R1
而只能:
PUSH 00H
PUSH 01H
POP也是一样
关键字:堆栈操作类指令 mcs51 单片机 汇编语言
引用地址:
堆栈操作类指令(2条)举例——mcs51单片机汇编语言
推荐阅读最新更新时间:2024-03-16 15:40
基于51单片机的电子密码锁综合课程设计
这是我的单片机结课项目 原理比较简单,主要使用80C51单片机,加一个lcd屏 摘 要 在日常的生活和工作中,住宅安全,文件资料的保护都需要用锁来保证。传统往往使用机械式钥匙开锁,但钥匙丢失会使锁的安全性大打折扣。随着科学技术的不断发展,电子密码锁应运而生,而密码锁也具有安全性高、成本低、功耗低、易操作等优点。 本设计是基于51单片机,并结合液晶显示LCD1602,以及矩阵键盘输入、复位、电源等电路组合而成。系统能够完成开锁、修改密码等基本功能。整个设计在Keil开发环境下,用C语言编写主控芯片的控制程序来实现具有多功能的电子密码锁。 一、绪论 1.1电子密码锁的背景 随着社会不断进步,人民生活水平不断提高,安全成为现代居民
[单片机]
STC12系列单片机简易编程器制作
STC12系列单片机简易编程器制作 一、STC12系列单片机优点 1.性价比高 采用STC12系列单片机可以省掉复位电路、外部数据存储器(如24Cxx系列芯片),某些场合还可以省掉晶振,电路简单、价格低廉。 2.速度快STC12系列单片机为单时钟/机器周期(1T),一些指令执行速度是传统8051的24倍,最低的也是3倍。 3.安全性好 目前,很难破译STC12系列单片机加密程序,加之用户数据可以保存到单片机内部,解密者很难通过用户数据分析单片机的运行状况。 4.可以直接代替8051针对传统8051单片机开发的程序,可以直接用于STC12系列单片机,无须重新编写。 二、简易编程器原理 图1是STC12系列单片机简易编程
[单片机]
AVR单片机研究(8):GCC-AVR的中断
目录 1.头文件 2.中断函数格式 3.中断向量名称 4.中断函数的设计着力点 5.C语言编写ISR的原则 //注意:本文使用的GCC-AVR版本为WinAVR20100110 中断不是C语言的一部分,中断的实现是由编译器实现的。所以,不同版本的编译器的中断的写法有很大的不同;即便同样是WinAVR,不同版本中的中断向量竟然都是略有区别的! 1.头文件 如果使用GCC-AVR的中断操作,必须包括头文件interrupt.h,即: #include avr/interrupt.h 进一步说明:WinAVR20100110版本已经不支持使用头文件signal.h了,为了向
[单片机]
51单片机IO口模拟串口通讯6
/*************************************************************** *模拟接收程序,这个程序的作用从模拟串口接收数据,然后将这些数据发送到实际串口 *在单片机上模拟了一个串口,使用P3.2作为发送和接收端 *以P3.2模拟串口接收端,从模拟串口接收数据发至串口 *本程序来源于《单片机IO口模拟串口程序(发送+接收)》 *硬件环境:11.0592MHz, RXD P3.2 ***************************************************************/ #include reg51.h #include stdio.h
[单片机]
MAXQ614 16位微控制器芯片详解
概述 MAXQ614是一款低功耗,16位MAXQ®微控制器,专为低功耗应用,如通用遥控器,消费类电子产品,白色家电。该器件结合了一个功能强大的16位RISC微控制器和集成外设,包括两个通用同步/异步接收器发送器(USART),产生载波频率的IR模块和灵活的I / O端口可复用键盘控制。 该器件包含80KB的闪存和2KB数据SRAM。 最终在低功耗电池供电性能,该器件还包括一个超低功耗停止模式(0.2μA典型值)。在此模式中,最小数量的电路供电。唤醒源包括外部中断,电源失效中断和定时器中断。从1.70V至3.6V的宽工作电压微控制器运行。 关键特性 高性能,低功耗的16位RISC核心 DC至12MHz工作频率在整个工作范
[模拟电子]
单片机小白学习之路(十四)---外部中断1实现蜂鸣器报警
目标:定时器和计数器的理解(一) 1.定时器/计数器简介 定时器/计数器(Timer/Counter,简称T/C)是单片机中最基本的接口之一。即可以定时又可以计数。常用于计数、延时、测量周期/脉宽/频率、提供定时脉冲信号等。 8051系列单片机至少含有2个16位的T/C,STC89C51/52含有3个T/C。其中2个为基本定时器/计数器T/C0和T/C1,另一个是T/C2。可通过软件配置为定时器功能或者计数器功能。 定时/计数器的工作原理 定时/计数器实质上是一个加1计数器。当工作在定时器模式时,对振荡源(晶振)12分频(12分频就是震荡周期,单位 是us)的脉冲计数,即每个机器周期(12个震荡周期就是1/12us12=
[单片机]
MSP430单片机的特点、分类和优缺点
MSP430单片机 MSP430系列单片机是德州仪器1996年开始推向市场的一种16位超低功耗的混合信号处理器,给人们留下的最大的亮点是低功耗而且速度快,汇编语言用起来很灵活,寻址方式很多,指令很少,容易上手。主要是由于其针对实际应用需求,把许多模拟电路、数字电路和微处理器集成在一个芯片上,以提供“单片”解决方案。其迅速发展和应用范围的不断扩大,主要取决于以下的特点… 特性: 强大的处理能力,采用了精简指令集(RISC)结构,具有丰富的寻址方式( 7 种源操作数寻址、 4 种目的操作数寻址)、简洁的 27 条内核指令以及大量的模拟指令;大量的寄存器以及片内数据存储器都可参加多种运算;还有高效的查表处理指令;有较高的处理速度,在
[单片机]
单片机四组按键控制LED的不同状态
单片机源程序如下: #include reg52.h #define uchar unsigned char #define uint unsigned int void DelayMS(uint x) { uchar t; while(x--) { for(t=0;t 120;t--); } } void main() { uchar k,t,Key_State; P0 = 0xff; P1 = 0xff; while(1) { t = P1; { DelayMS(10);
[单片机]