调用及返回指令
发布时间:2016/7/11 22:18:27 访问次数:1064
在程序设计时,对经常使用的具有一定功能的程序段可以设计为子程序,在需要使用时可以调用它,ADM705ARZ这样可以使程序的结构更加清楚,同时减少重复指令所占的内存空间,实现程序的模块化设计。
在调用子程序时,80C51系统有专门的子程序调用指令。子程序调用时,必须要中断原有的指令执行顺序,转移到子程序的入口地址去执行子程序。在子程序执行完毕后,又要返回到原有程序中断的位置,继续往下执行。所以这个断点位置(地址)要保存起来,一般都是放在堆栈中保存。我们把返回到原有程序继续执行的位置称为程序断点,也就是子程序调用指令的下一条指令的地址。
调用指令
MCs-51中有两条子程序调用指令:
ACALL addr11 ;(PC)+2→PC
KsD+1→sRlPC,~0)→fsPl(断点低8位压入堆栈)
fsD+1→sECC15~:)→lSP,(断点高8位压入堆栈)
addr11→PClO~o
LCALL addr16 ;(PC)+3→PC
KsP)+1→s:lPC7~o)→lsPJ(断点低8位压入堆栈)
fsD+1→s只rPc15~:)→fsD(断点高8位压入堆栈)
addr16→PC
ACALL ad&11是短调用指令,同样addr11是被调用子程序首地址的低11位,编程时常用标号来表示,同AJMP指令一样,被调用的子程序的起始地址必须与ACALL下面指令的第一个字节在同一个9KB区域的页面内。
LCALL addr16是长调用指令,被调用的子程序可以在“KB范围内的任何位置。
【例4.34】设(sD=ωH,标号K11的值为8000H,标号AAs的值为8200H,在执行指令:Kl1: ACALL AAs
后结果为rsP)=62H,“1H)=02H,∞2H)=80H,eC)=8⒛oH。
在程序设计时,对经常使用的具有一定功能的程序段可以设计为子程序,在需要使用时可以调用它,ADM705ARZ这样可以使程序的结构更加清楚,同时减少重复指令所占的内存空间,实现程序的模块化设计。
在调用子程序时,80C51系统有专门的子程序调用指令。子程序调用时,必须要中断原有的指令执行顺序,转移到子程序的入口地址去执行子程序。在子程序执行完毕后,又要返回到原有程序中断的位置,继续往下执行。所以这个断点位置(地址)要保存起来,一般都是放在堆栈中保存。我们把返回到原有程序继续执行的位置称为程序断点,也就是子程序调用指令的下一条指令的地址。
调用指令
MCs-51中有两条子程序调用指令:
ACALL addr11 ;(PC)+2→PC
KsD+1→sRlPC,~0)→fsPl(断点低8位压入堆栈)
fsD+1→sECC15~:)→lSP,(断点高8位压入堆栈)
addr11→PClO~o
LCALL addr16 ;(PC)+3→PC
KsP)+1→s:lPC7~o)→lsPJ(断点低8位压入堆栈)
fsD+1→s只rPc15~:)→fsD(断点高8位压入堆栈)
addr16→PC
ACALL ad&11是短调用指令,同样addr11是被调用子程序首地址的低11位,编程时常用标号来表示,同AJMP指令一样,被调用的子程序的起始地址必须与ACALL下面指令的第一个字节在同一个9KB区域的页面内。
LCALL addr16是长调用指令,被调用的子程序可以在“KB范围内的任何位置。
【例4.34】设(sD=ωH,标号K11的值为8000H,标号AAs的值为8200H,在执行指令:Kl1: ACALL AAs
后结果为rsP)=62H,“1H)=02H,∞2H)=80H,eC)=8⒛oH。