单片机汇编语言指令中中断返回指令RET和RETI有什么不同?

单片机汇编语言指令中中断返回指令RET和RETI有什么不同?,第1张

RET是普通程序的返回指令,RET是普通子程序的最后1条指令,它使程序从子程序转到调用该子程序指令LCALL/ACALL的下1条指令执行。

RETI是中断服务子程序的返回指令,RETI是中断服务子程序的最后1条指令,它使程序从中断服务子程序转到中断点继续运行。

RETI指令除了执行返回功能外,还清除内部相应的中断状态寄存器(该状态寄存器由CPU响应中断时置位,宣告CPU当前正在执行中断服务程序),因此中断服务子程序必须用RETI结束,

CPU执行RETI指令后,必须至少再执行一条其它指令才能响应新的中断。

ORG 00H 开始地址

JMP MAIN跳转到主程序

ORG 03H 外部中断0地址

JMP EXT1跳转

ORG 13H 外部中断1地址

JMP EXT2跳转

MAIN:

MOV IE, #85H 使能中断 0,1

SETB TCON.2边沿触发

SETB TCON.0边沿触发

SJMP $ --没有这一句,程序,自己就去执行中断函数了

EXT1:

MOV P2, #0清0,点亮发光二极管

RETI

EXT2:

MOV P2, #0FFH 置1,关闭

RETI

END

你这是用了一个非常简单程序来说的,就这么几条指令,而且执行到最后是一个SJMP $,即死循环,这一点肯定是永远在执行这一条指令了,那中断时即是从这一条响应中断的,返回时也是返回到这一条了。

可凡事不能以一个简单的特例的结果来概括全面问题,而实际上一个真正的应用程序是不可能有SJMP $指令的,更不可能只有这几条指令,这也不能叫什么程序,只不过是玩几条指令而已。一个真正的程序是很长很长的,单片机是不停地在执行着程序,那什么时候响应中断是未知的,所以,响应中断时执行到哪条指令了,根本就不可能知道的,也不需要知道啊,因为,从哪里响应中断的,中断结束就一定会回到哪里的,这一点都不用怀疑的。

可惜呀,就这么个最简单的特例,也被解释得错了,真是无知呀!


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/11063725.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-13
下一篇 2023-05-13

发表评论

登录后才能评论

评论列表(0条)

保存