子程序调用与返回指令
发布时间:2014/6/5 21:10:51 访问次数:2610
1.绝对调用
绝对调用指令ACALL是一条两字节指令, AD536AJDZ指令提供了11位目标地址addrll,所以和前面AJMP指令相似,其调用地址必须与ACALL指令的下一条指令首字节位于程序存储器的同一个2KB区内。ACALL指令与AJMP指令不同的是它需要保存子程序的返回地址,
而AJMP指令不用。
指令执行过程是:执行ACALL指令时,PC+2后获得了下一条指令的地址,然后把PC的当前值压栈(栈指针SP加l,PC低字节进栈,SP再加l,PC高字节进栈)。最后把PC的高5位和指令给出的11位地址addrll连接组成16位目标地址(PCis~11aio~ao),并作为
子程序入口地址送入PC中,使CPU转向执行子程序。因此,所调用的子程序入口地址必须和ACALL揩令下一条指令的第一个字节在同一个2KB区域的程序存储器空间,否则就调用不到了。
2.长调用指令
LCALL addr16(长调用指令)
可以在64KB程序存储器内调用子程序的指令,它是三字节指令。指令执行过程是:把PC加3获得的下一条指令的地址进栈(先压入低字节,后压入高字节),进栈操作使SP加l两次。接着把指令的第二和第三字节(a15~a8,a7~ao)分别装入PC的高位和低位字节中,然后从该地址addr16(ais~a o)开始执行子程序。
3.子程序返回
这条返回指令的功能是从堆栈中取出断点地址,送给PC,并从断点处开始继续执行程序。RET应放在一般子程序的末尾。
4.中断返回
这条返回指令的功能也是从堆栈中取出断点地址,送给PC,并从断点处开始继续执行程序。RETI应放在中断服务子程序的末尾。在执行RETI指令时,还将清除MCS-51中断响应时所置位的优先级状态触发器,开放中断逻辑,使得已申请的较低级中断源可以响应。且必须在RETI指令执行完之后,至少要再执行一条指令才能响应这个中断。
1.绝对调用
绝对调用指令ACALL是一条两字节指令, AD536AJDZ指令提供了11位目标地址addrll,所以和前面AJMP指令相似,其调用地址必须与ACALL指令的下一条指令首字节位于程序存储器的同一个2KB区内。ACALL指令与AJMP指令不同的是它需要保存子程序的返回地址,
而AJMP指令不用。
指令执行过程是:执行ACALL指令时,PC+2后获得了下一条指令的地址,然后把PC的当前值压栈(栈指针SP加l,PC低字节进栈,SP再加l,PC高字节进栈)。最后把PC的高5位和指令给出的11位地址addrll连接组成16位目标地址(PCis~11aio~ao),并作为
子程序入口地址送入PC中,使CPU转向执行子程序。因此,所调用的子程序入口地址必须和ACALL揩令下一条指令的第一个字节在同一个2KB区域的程序存储器空间,否则就调用不到了。
2.长调用指令
LCALL addr16(长调用指令)
可以在64KB程序存储器内调用子程序的指令,它是三字节指令。指令执行过程是:把PC加3获得的下一条指令的地址进栈(先压入低字节,后压入高字节),进栈操作使SP加l两次。接着把指令的第二和第三字节(a15~a8,a7~ao)分别装入PC的高位和低位字节中,然后从该地址addr16(ais~a o)开始执行子程序。
3.子程序返回
这条返回指令的功能是从堆栈中取出断点地址,送给PC,并从断点处开始继续执行程序。RET应放在一般子程序的末尾。
4.中断返回
这条返回指令的功能也是从堆栈中取出断点地址,送给PC,并从断点处开始继续执行程序。RETI应放在中断服务子程序的末尾。在执行RETI指令时,还将清除MCS-51中断响应时所置位的优先级状态触发器,开放中断逻辑,使得已申请的较低级中断源可以响应。且必须在RETI指令执行完之后,至少要再执行一条指令才能响应这个中断。