
汇编语言中:
1 ret和SJMP $相同点: 都属于转移指令。
2 ret和SJMP $区别:
ret是子程序返回指令,放在子程序的结尾,当子程序执行完后,靠该指令返回主程序。
SJMP $ 是相对转移指令 是用在主程序中的,可以作为暂停。
等价于 LL: SJMP LL
就是又跳转到这条指令的本身,反复执行给指令,不再执行别的指令了。
相当于暂停 (或在这等待计算机的中断时间发生)
呵呵 满意 就选满意回答吧
子程序的末尾一定要有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后,该程序在第一次运行时可能不会出错,但在第二次运行时就会出错了。
先澄清一下你问得模糊的地方。
1、你说的“RST”返回指令应该是“RET”吧?
2、“SP”不叫堆栈指令,它是堆栈指针,估计是Stack Pointer的首字母。
该指针总是指向堆栈的栈顶,即始终存放的是栈顶的地址。
堆栈的工作原理可简述为“后进先出”,即LIFO,last-in-first-out。(具体解释请查阅相关资料)
不同的处理器所支持的汇编指令助记符不尽相同,但是他们的含义有相似性。
下面就以RET来说说吧。
RET在51指令系统里其含义是子程序返回。在用LCALL或ACALL指令调用子程序的时候,堆栈指针SP先增加1,再把下一条将要被执行的程序计数器PC的值存入SP(这一步保证了子程序结束能正常返回原程序),然后存放子程序的存储空间的首地址被送入PC,于是CPU可以执行子程序中的代码。
在子程序结束时,要用RET指令结束,它的作用是将SP中的内容d出到PC中。SP的内容d出后,SP自减1,即恢复到调用子程序前的状态。由于SP中的内容(即子程序调用前将要被执行的指令)又回到PC中,所以原程序会继续进行。
至于SP的地址,系统复位后,SP被初始化为07H,使得堆栈区从08H开始。当然用户也可以自己设置SP的地址,只不过要注意不要将堆栈区与其它的存储区冲突。
RET是普通子程序的返回指令,而不能用RETI,所以,RET不是中断返回指令,就是子程序返回指令。
而RETI是用在中断子程序的返回指令,必须用这个,这才叫中为返回指令,而不能用RET,这就是区别。
这样定义的:
子程序名 PROC NEAR|FAR
RET
子程序名 ENDP
子程序名相当于标号,表示本过程的符号地址。过程有NEAR和FAR两种类型,FAR型的过程可供段间调用,NEAR型过程仅供段内调用。
在一个过程中,至少要有一条返回指令RET,它可以书写在过程中的任何位置,但是过程执行的的最后一条指令一定是RET。
扩展资料:
注意事项
一、子程序调用指令
格式:CALL [NEAR PTR] 子程序名
CALL指令的两个作用,1将断点地址(CALL指令的下一条指令地址)压栈保存,2转去子程序执行。
[NEAR PTR]可以省略。
二、返回指令
格式:RET [N]
指令作用:实现子程序执行完后返回主程序的指令。从堆栈栈顶d出一个字数据(段内调用)送入IP作为返回地址。N是立即数,执行完RET之后,再将SP增加N,也叫“平栈”。
子程序的返回要用到RET,当单片机执行到RET语句时,就会自动返回到调用处并继续向下执行。楼上说的RETI是中断的返回语句。
你的子程序不返回有可能是子程序最后一句不是RET,这样的话,子程序当然就无法返回了。还有就是你程序本身就有问题。因为你是以看到的结果为依据来判断程序的成功与否。如果你的程序本身就有问题,那么肯定会不能按照你的想法来执行的。
希望你可以将程序贴上来,这样大家就可以更好更快的帮助你了。
以上就是关于汇编语言中ret和SJMP $有什么区别,为什么有些程序结束的时候是用SJMP $ 而有些时候是用RET呢全部的内容,包括:汇编语言中ret和SJMP $有什么区别,为什么有些程序结束的时候是用SJMP $ 而有些时候是用RET呢、子程序的末尾有什么指令、汇编语言中的返回指令Rst问题等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)