关于51单片机中的CALL与JMP指令

好像单片机中只有LCALL和ACALL指令,没有CALL指令啊?为什么也可以用CALL指令呢?谁来说一下CALL的用法有什么特别之处?还有“JMP 标号”指令,书上只有“JMP @A+DPRT”啊,没有“JMP 标号”指令

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值。
温馨提示:答案为网友推荐,仅供参考
第1个回答  推荐于2018-04-13
可能编译器会根据偏移量自动用LCALL或者ACALL代替CALL指令,JMP 标号也类似,你可以看看反汇编的结果,对比一下本回答被提问者和网友采纳
相似回答