在程序设计中,常常出现几个地方都需要进行功能完全相同的处理,为了减少程序编写和调试的工作量,使某一段程序能被公用,于是引入了主程序和子程序的概念。
通常把具有一定功能的公用程序段作为子程序而单独编写,当主程序需要引用这一子程序时,可利用调用指令对子程序进行调用。在子程序末尾安排一条返回指令,使子程序执行结束能返回到主程序。
1.长调用指令LCALL
长调用指令用于无条件地调用位于指定地址的子程序。该指令在运行时先把PC加3获得下条指令的首地址,并把它压入堆栈(按先低8位后高8位的顺序),堆栈指针加2。接着把子程序的16位首地址装入PC中,然后从该地址开始执行子程序。LCALL指令可以调用64 KB范围内程序存储器中的任何一个子程序,执行该指令后不影响任何标志。
例如:设(SP)=60H,标号START值为1000H,标号DIR值为4000H,执行指令:
视频:调用指令调试
指令执行结果为:(SP)=62H,(6lH)=03H,(62H)=10H,(PC)=4000H。
2.绝对调用指令ACALL
绝对调用指令用于无条件地调用首地址由addr10~addr0所指向的子程序,执行时先把PC加2以获得下一条指令的首地址,把该地址压入堆栈(按先低8位后高8位的顺序),堆栈指针加2,然后将PC当前值的高5位和指令中给出的11位地址组合成16位地址(即为子程序的起始地址)送入PC中。因此所调用的子程序的起始地址必须和该调用指令的下一条指令的首地址在同一个2 KB区域中。
例如:设(SP)=60H,标号NBA值为0123H,子程序START位于0345H,执行指令:
指令执行结果为:(SP)=62H,(61H)=25H,(62H)=01H,(PC)=0345H。(www.xing528.com)
3.返回指令
(1)子程序返回指令
视频:RET指令调试
子程序返回指令必须和调用指令成对出现,用在子程序结束处。这条指令的功能是从堆栈中退出PC的高位和低位字节,同时把堆栈指针减2,并从产生的PC值处(即调用指令下一条地址)开始继续执行程序,不影响任何标志。
例如:设(SP)=62H,(62H)=10H,(6lH)=30H,执行指令:
指令执行结果为:(SP)=60H,(PC)=1030H。
(2)中断服务程序返回指令
中断服务程序返回指令为中断程序返回指令,用在中断服务程序结束处。这条指令的执行过程类似于RET指令,不影响任何标志。与RET指令不同之处在于:RETI指令执行时,中断返回主程序的地址不是事先预知的,是在程序执行过程中产生的。RETI指令还有清除相应中断优先级状态、开放较低级中断和恢复中断逻辑的功能。有关中断的详细内容将在第5章中详细介绍。
4.空操作指令
执行空操作指令时,CPU不作任何操作,仅消耗一个机器周期的时间。NOP指令常用于程序的等待或时间的延迟。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。