子程序调用指令分析
扫描二维码
随时随地手机看文章
子程序调用指令共两条:一条为长调用指令,另一条为绝对调用指令。都为1字节2周期指令,两条指令都从堆栈中取出以前压入的16位地址送入PC,从而完成子程序的返回。
长调用指令LCALL addr16是一条三字节的两周期指令,指令码格式为12,16位地址高8位,16位地址低8位。该指令完成下列操作:先将PC内容加3,再将PC内容压入堆栈,最后将指令中的16位地址addr16送入PC中,长调用的子程序调用范围是64KB。
在子程序结束时运行子程序返加指令RET,这条指令的运行过程:将堆栈指针SP指向的栈顶单元中的数据弹出以程序计数器PC的高8位中,堆栈指针SP减1,使其指向栈顶,此时,PC中的数据恰好就是子程序调用指令的下一条指令地址。
绝对调用指令ACALL addr11为两字节两周期指令。指令完成下列操作:先将PC内容加2,再将PC内容压入堆栈;最后将11位地址addr11送入PC的低11位,这条指令的调用范围是2KB
指令ACLL SUB1的地址为0600H,这条指令的下一条指令地址应为0602H,则该指令能跳转到的最低地址为保持PC高5位不变,而低11位全为0的地址,即0000H,能跳转到的最高的地址为保持PC高5位不变,而低11位全为1的地址,即07FFH,所以在本例中,这条转移指令的跳转范围为0000H-07FFH,标号LAB1的地址为0700H,在指令能跳转的范围内。
在实际编程时,我们不用计算机器码,编译系统会根据程序中使用的地址号自动将其转为机器码,但在编程时要注意到所使用的标号是否超出指令能转移的范围,假定这段程序运行前,堆栈指针SP中的数据为10H,则程序运行过程如下:PC指针加2,使其指向下一条指令的地址,堆栈指针SP加1,PC低8位压栈,堆栈指针SP加1,PC高8位压栈,将机器码第一字节的高3位送入程序计数器PC的D10D9D8,将机器码第二字节送入PC低8位,则程序跳转到0700去运行子程序SUB1。在子程序结束时运行子程序返回指令RET。
空操作指令NOP控制CPU不作任何操作,只消耗这条指令执行所需的机器周期,该指令是单字节单周期指令,机器码为00,这条指令常暖和于待待或延迟。