2.7.1 控制转移类指令
控制转移类指令的功能是改变指令的执行顺序,转向指令指示的新PC地址去执行。修改PC地址的方式有直接修改16位地址或11位地址,或将当前PC加一个单字节有符号数。
1.无条件转移指令
执行无条件转移指令时,无须判断,直接转移到目的地址。
(1)绝对转移
这条指令提供11位地址,可在2 KB范围内无条件转移到由a10~a0所指出的地址单元中。因为指令只提供低11位地址,高5位为原PC11~15位的值,因此,转移的目的地址必须在AJMP指令的第一个字节开始的同一2 KB范围内,也就是该指令转移范围为2 KB。
(2)长转移
该指令为64 KB程序存储空间的全范围转移指令。转移地址可为16位地址中的任意值,该指令为3字节指令。指令提供16位目标地址,将指令的第二、第三字节地址码分别装入PC的高8位和低8位中,程序无条件转向指令的目标地址去执行。
(3)相对转移(短转移)指令
该指令为双字节指令,执行本指令时,当前PC+2+rel。rel为转移的偏移量,转移可以向前转(目的地址小于源地址),也可以向后转(目的地址大于源地址),因此偏移量rel是1字节有符号数,用补码表示(—128~+127)。在用汇编语言编写程序时,rel可以是一个转移目的的地址标号,由汇编程序在汇编过程中自动计算偏移地址。在手工汇编时,可用转移目的地址减转移指令所在源地址,再减转移指令字节数2得到偏移字节数rel。
(4)间接转移(散转指令)
该指令的转移地址由数据指针DPTR的16位数和累加器A的8位数进行无符号相加形成,并直接送入PC。指令执行过程对DPTR、累加器A和标志位均无影响。这条指令具有散转功能,又称散转指令。
例如,当A=02 H,DPTR=2000H时,指令JMP @A+DPTR执行后,结果为PC=2002 H,也就是说,程序转移到2002H地址单元去执行。
【例2-9】 现有一段程序如下:
根据JMP @A+DPTR指令的操作可知,当A=00H时,程序转入到地址PROC0处执行;当A=02 H时,转到PROC1处执行……
可见这是一段多分支转移程序,进入的分支由累加器A的内容确定。因为AJMP指令是2字节指令,所以累加器A的内容必须为偶数。
2.条件转移指令
执行条件转移指令时,首先判断是否满足转移条件,若满足,则转移到目的地址,若不满足,则按顺序执行。
(1)累加器判零转移指令
(2)减1不为零转移指令
减1不为零转移指令将源操作数(Rn或direct)先减1,如果结果不为0,则转移到目标地址。该指令允许把寄存器Rn或direct单元用作程序循环计数器。
这两条指令主要用于控制程序循环。如预先把寄存器Rn或内部RAM的direct单元装入循环次数,则利用减1不为零转移指令,以减1后是否为0作为转移条件,即可实现按次数循环控制。
(3)比较不相等转移指令
这组指令的功能是对目的操作数和源操作数的内容进行比较,若它们的值不相等,则转移。在PC加到下一条指令的起始地址后,把指令最后一个字节的带符号的相对偏移量加到PC上,并计算转向的目的地址。如果第一操作数小于第二操作数,则进位标志位CY置1,否则CY清0。该指令的执行不影响任何一个操作数的内容。
3.调用及返回指令
(1)长调用指令
该指令可以调用64 KB范围内程序存储器中的任何一个子程序。指令执行时将该指令的下一条指令的首地址压入堆栈,以进行断点保护。有子程序的入口地址addr16送入PC,转子程序执行,该指令的机器码为三字节。
(2)短调用指令
该指令的功能与AJMP指令类似,是为了与MCS-48单片机中的CALL指令兼容而设置的。指令执行时先把PC加2,获得下一条指令的首地址后,把该地址压入堆栈保护,即SP+2。然后,把PC的高5位和指令代码中的11位地址连接,获得16位的子程序入口地址,并送入PC,转向执行子程序。所调用的子程序地址必须与ACALL指令下一条指令的16位首地址中的高5位地址相同,否则将引起程序转移混乱。所以该指令是2 KB范围内的子程序调用指令。
(3)子程序返回指令
执行本指令时:
这条指令的功能是,从堆栈中弹出PC的高8位和低8位字节,把堆栈指针减2,从PC值处开始继续执行程序。
(4)中断子程序返回指令
该指令和RET指令类似,不同之处在于该指令清除了在中断响应时被置1的MCS-51单片机内部中断优先级寄存器的中断优先级状态。该指令可用来从中断服务程序返回主程序。
4.空操作指令
执行该指令时,CPU不进行任何实际操作,除PC加1外,不影响其他寄存器和标志位。该指令常用来产生一个机器周期的延时。