义隆单片机CALL 与JMP的区别

来源:互联网 发布:英雄联盟js 编辑:程序博客网 时间:2024/05/22 07:09

CALL 子程序调用指令:

      CALL 是调用,调用的程序跑完了,通过RET返回调用的后一句,是要压栈的。


JMP  是无条件跳转,不会压栈。



在使用JMP 或者 CALL进行程序跳转时

如果是仅仅局限在当前页的范围内,则不用修改(A11、A10),直接将目标地址赋值给A9~A0,【对于JMP指令,这样就行了;对于CALL指令还要将要执行的下一条指令PC+1入栈,以便CALL执行完毕之后,程序正确返回】如果需要跳转到别的页中,则需要首先通过设置R3的PS0、PS1进而载入到PC的A11 A10
如果使用指令直接修改的PC(R2)的值,(如:MOV  R2 A 或者 ADD R2 A 或者 BC R2,0)则PC低8位以上的位会被清零,所以之后产生的 跳转会被限制在也页面的256地址。


堆栈
EM78X有五级堆栈,遵循后入先出的原则实现程序多至五级嵌套调用.通常堆栈使用如下: 
当CALL和中断响应时PC+1压栈; 
当子程序或中断返回,执行RET、RETL(带参数返回)、RETI(中断返回),将栈顶值(栈1)弹回程序计数器PC、同时将堆栈2的值拷
贝到堆栈1,堆栈3的值拷贝到堆栈2,以此类推。
要注意的是RET、RETL、RETI指令并没有改变R3中的PS0~PS1位便返回到原来调用程序的页面,所以当从一次跨页的子程序
调用返回时,一定要用指令恢复R3中原先的PS0、PS1值。

原创粉丝点击