控制程序转移类指令
这类指令的主要功能是通过控制改变PC内容而实现程序转移,包括64K字节地址范围内的绝对转移(长转移)和绝对调用(长调用)指令;2K字节地址范围内的绝对转移(短转移)和绝对调用(短调用)指令;64K字节地址范围内的间接转移指令。这类指令用到的助记符有ACALL、AJMP、LCALL、LJMP、SJMP、JMP、JZ、JNZ、CJNE、DJNZ,共10种,见表3-6。
表3-6 MCS-51控制程序转移类指令表
(一)无条件转移指令(第1~第3条)
这类指令是当程序执行到该指令时,无条件转移到指令所提供的地址上去,均不影响标志位。
1.短跳转指令(AJMP)
指令中包含有11位的转移地址,即转移的目标地址是在下一条指令地址开始的2KB范围内,因此目标地址必须和它下面的指令存放在同一个2K字节范围的区域内。它把指令第一字节中的第10~第8位(即A10~A8)和指令的第二字节中的8位(即A7~A0)合并在一起,送入PC10~PC0,而PC15~PC11保持不变,形成新的16位的转移地址,如图3-10所示。
图3-10 AJMP指令转移地址的形成示意图
由图3-10可知,PC的高5位可有32种组合,分别对应32个页号,即把64K字节的存储器空间划分为32页,每页为2K字节,如图3-11所示。
图3-11 AJMP跳转示意图
2.无条件转移指令(SJMP)
该指令为双字节,指令中的相对地址是一个带符号的8位偏移量(补码),rel其范围为-128~+127。负数表示向后(即地址减小方向)转移,正数表示向前(即地址增大方向)转移。该指令执行后程序转移到当前PC与rel之代数和所指示的单元。在用汇编语言编写程序时,rel可以是一个转移目的地址的标号。
【例3-26】SAC: SJMP BEC
如果标号SAC的值为0200 H,则SJMP这条指令的2字节机器码存放在0200 H和0201H这两个单元中;设标号BEC的值为0257H,即跳转的目的地址为0257H,则指令的第二字节,即8位相对偏移量应为
rel=目的地址-(源地址+指令字节数)=0257H-(0200H+2)=55H
3.长转移指令(LJMP)
该指令在运行时把指令的第二字节和第三字节分别装入PC的高字节和低字节中,允许转移的目的范围为64K字节的程序存储器空间。
(二)间接长转移指令(第4条)
JMP @A+DPTR ;PC←A+DPTR
该指令是无条件的间接转移(又称散转)指令。转移目的地址由数据指针DPTR和A的内容之和形成,不影响标志位,如图3-12所示。
图3-12 JMP指令转移示意图
【例3-27】如果累加器中存放待处理的命令编号(0~7),程序存储器中存放着标号为TABLE的转移表。则执行以下程序,将根据A内的命令编号转向相应的命令处理程序。
例如,如果A=02H,则执行JMP指令后,先转去执行AJMP RVT2指令,然后再转去执行RVT2标号处的指令。
(三)子程序调用及返回指令(第5~第8条)
该类指令的执行均不影响标志位。
1.短调用指令(ACALL)
这条指令机器码如下:
这条指令所调用的子程序的起始地址必须和该指令的下一条指令的第一个字节在同一个2K字节区域的程序存储器中。
指令执行时的操作顺序如下:
【例3-28】SBD: ACALL AXD
如果SBD的标号值为0256H,AXD(即子程序入口地址)标号值为0105H,SP为70H,则该指令执行后,SP=72 H,内部RAM中堆栈区内(7l H)=58 H,(72 H)=02H,PC=0105 H。
2.长调用指令(LCALL)
这条指令的机器码如下:指令执行时的操作顺序如下:
PC15~PC0←addr15~addr0 转移地址在64K范围内
LCALL指令可以调用64K字节范围内程序存储器中的任何一个子程序,执行后不影响任何标志。
【例3-29】LOOP: LCALL DL
如果LOOP的标号值为600H,子程序DL的首址为8005H,(SP)为76H,则该指令执行后,(SP)=78H,内部RAM中堆栈区内(77H)=03H,(78H)=06H,(PC)=8005H。
3.子程序返回指令(RET)
在子程序的结尾必须是返回指令,才能从子程序返回到主程序。这条指令的功能是从堆栈中取出子程序调用时保护的断点地址,送入PC,同时把栈指针减2,不影响任何标志。
【例3-30】若SP的值为72 H,(72H)=02 H,(71 H)=58H。则执行指令:
RET
结果是:SP为70H,PC=0258H,CPU从0258H开始执行程序。
4.从中断返回指令(RETI)
这条指令除具有RET指令的功能外,还将清除优先级状态触发器(该触发器由CPU响应中断时置位,指示CPU当前是否处理高级或低级中断)。如果在执行RETI指令的时候,有一个较低级的或同级的中断已挂起,则CPU至少要在执行了中断返回指令的下一条指令之后才能去响应被挂起的中断。
(四)条件转移指令(第9~第16条)
条件转移指令是依据某种特定条件转移的指令。条件满足则转移(相当于一条转移指令);条件不满足则顺序执行下面的指令。目的地址的范围限制在以下一条指令的起始地址为中心的256个字节中(-128~+127)。
1.测试条件符合转移指令
JZ rel
若A=0则转移,PC←PC+2+rel;否则顺序执行 PC←PC+2。
JNZ rel
若A≠0则转移,PC←PC+2+rel;否则顺序执行 PC←PC+2。
2.比较不相等则转移指令
这组指令的功能是比较前面两个操作数(无符号整数)的大小,不相等则转移,并不影响两个操作数的内容。如果第一操作数小于第二操作数,则置位进位标志CY,否则CY清0。操作数有寄存器寻址、直接寻址、寄存器间接寻址和立即寻址方式。
CJNE A,#data,rel
这条指令的执行情况是:若A=data,则PC←PC+3,CY←0
若A>data,则PC←PC+3+rel,CY←0
若A<data,则PC←PC+3+rel,CY←1
CJNE A,direct,rel
这条指令的执行情况是:若A=(direct),则PC←PC+3,CY←0
若A>(direct),则PC←PC+3+rel,CY←0
若A<(direct),则PC←PC+3+rel,CY←1
CJNE Rn,#data,rel
这条指令的执行情况是:若(Rn)=data,则PC←PC+3,CY←0
若(Rn)>data,则PC←PC+3+rel,CY←0
若(Rn)<data,则PC←PC+3+rel,CY←1
CJNE @Ri,#data,rel
这条指令的执行情况是:若((Ri))=data,则PC←PC+3,CY←0
若((Ri))>data,则PC←PC+3+rel,CY←0
若((Ri))<data,则PC←PC+3+rel,CY←1
【例3-31】根据R3的内容大于30H、等于30H和小于30 H三种情况决定执行三种不同的处理情况。
3.减1不为0的转移指令
DJNZ Rn,rel
DJNZ direct,rel
这组指令的功能是把源操作数减1,结果送回源操作数中,若结果不为0则转移,否则顺序执行。在应用中需要多次重复执行某程序时,可以设置一个计数值,每执行一次该程序,计数值减1,当不为0时则继续循环执行,直到计数值减到0为止。
【例3-32】常用的延时程序。
(五)空操作指令(第17条)
NOP
除了PC值加1之外,本指令不进行任何操作,也不影响其他任何状态。指令的功能是在延时等程序中用于调整CPU的时间。