子程序的末尾一定要有RETI指令,子程序的调用是LCALL和ACALL。
RETI是中断返回指令,这条指令的功能和RET指令相似,2条指令的不同之处是:本指令清除了中断响应时,被置1的MCS-51内部不可寻址的 “优先级生效”触发器清零。
执行这条指令后,CPU将会把堆栈中保存着的地址取出,送回PC,那么程序就会从主程序的中断处继续往下执行了。中断指令“RETI”作为中断跳出指令,除了将堆栈中保存着的地址取出,送回PC,使程序从主程序的中断处继续往下执行的作用外,还有将“优先级生效”触发器清零的功能。
扩展资料
单片机汇编指令中RETI和RET的区别
通常情况下,在普通的汇编子程序中用RET做返回,在中断服务子程序中用RETI起中断返回作用。两条指令都能从堆栈中d出断点地址并装入PC中,使CPU回到原来主程序的断点处继续运行。
然而,RET和RETI有本质的区别:当某一中断源响应后,单片机中的标志寄存器flag H和flag L其中的一个将会自动置位,用于阻止比它低级或同级的中断触发。RETI可以清除“优先级激活触发器”(即flag寄存器),以保证后续中断源的及时响应。
所以,当把RETI替换为RET后,该程序在第一次运行时可能不会出错,但在第二次运行时就会出错了。
如果只是用到不带参数的ret的话,就是返回主程序的时候pop出之前push的ip(远转移的话还有cs)。如果用的是带参数的ret的话,也就是retf指令,参数n表示在ret的基础上还在再将sp指针向后移动n个字节。也就是不仅仅d出ip和cs,还多d出了数据。
RET,子程序返回指令;
把栈顶的内容送到PC寄存器中,不影响标志;
通常用在ACALL或LCALL调用子程序的末尾。
((SP)) ---> (PC15~08)
(SP)-1 ---> (SP)
((SP)) ---> (PC7~0)
(SP)-1 ---> (SP)
SP:堆栈指针;
PC:程序计数器。
1、方式不同
当某一中断源响应后,单片机中的RETI将会自动置位,用于阻止比它低级或同级的中断触发。RETI可以清除“优先级激活触发器”(即flag寄存器),以保证后续中断源的及时响应。
所以,当把RETI替换为RET后,该程序在第一次运行时可能不会出错,但在第二次运行时就会出错了。
2、过程不同
RET是从子程序返回,返回到LCALL或ACALL指令下一条指令处继续执行程序。RETI是从中断服务子程序返回,返回到中断时的断点处继续执行程序,断点未知。
扩展资料:
直接使用汇编指令编写单片机程序,对硬件的控制更加直接,可以直接 *** 作物理地址,寄存器,端口等;其它更高级的语言(如:C语言)对硬件的控制是依赖于类库来实现的。并且,对于一些对程序大小和运行速度有非常严苛要求的项目而言,都必须使用汇编指令。
C语言只是为了方便编写,与机器打交道的其实都是2进制得代码,汇编语言就是这些代码好记忆的名称和规则,只是比C语言难理解些。
RET是子程序的返回指令。执行本指令时:sp增加一个内存单元,栈顶数据出栈赋值给ip寄存器。
call和ret都是转移指令,它们都修改IP,或同时修改CS和IP。(CS代码段寄存器与IP指令指针寄存器)。它们经常用来实现子程序的设计。ret指令用栈中的数据,修改IP的内容,从而实现近转移;retf指令用栈中的数据,修改CS和IP的内容,从而实现远转移。
CALL和RET指令
模块化程序设计call与ret指令共同支持了汇编语言编程中的模块化设计。在对现实的实际问题中,往往比较复杂,对现实问题分析时,把他转化成相互联系,不同层次的子问题,是必须的解决方法。
而call与ret指令对这种分析方法提供了程序实现上的支持。利用call和ret指令,用简洁的方法,实现多个相互联系,功能独立的子程序来解决一个复杂的问题。
以上就是关于子程序的末尾有什么指令全部的内容,包括:子程序的末尾有什么指令、汇编语言编写的程序,子程序的结尾用到ret与ret 参数对主程序有什么影响、单片机RET指令怎么运行等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)