关于51单片机中的CALL与JMP指令
发布网友
发布时间:2022-04-25 14:44
我来回答
共2个回答
热心网友
时间:2023-10-09 17:29
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值。
热心网友
时间:2023-10-09 17:30
可能编译器会根据偏移量自动用LCALL或者ACALL代替CALL指令,JMP 标号也类似,你可以看看反汇编的结果,对比一下