控制转移类指令
计算机运行过程中,有时因为操作的需要,程序不能按顺序逐条执行指令,需要改变程序运行方向,即将程序跳转到某个指定的地址再顺序执行下去。
控制转移类指令的功能就是根据要求修改程序计数器PC的内容,以改变程序运行方向,实现转移。
控制转移类指令可分为:无条件转移、条件转移、绝对转移、相对转移和调用、返回指令。下面我们将分类介绍。
1.无条件转移指令(4条)
LJMP add16 ;add16→PC,无条件跳转到add16地址,可在64KB范围内
转移,称为长转移指令
AJMP add11 ;add11→PC,无条件转向add11地址,在2KB范围内转移
SJMP rel ;PC+2+rel→PC,相对转移,rel是偏移量,8 位有符号
数,范围-128~127,即可向后跳转128,向前可跳转127
JMP @A+DPTR ;A+DPTR→PC ,属散转指令,无条件转向A与DPTR内容相
加后形成的新地址
例1 执行指令
LJMP 9100H
不管这条指令存放在哪里,执行时将使程序转移到9100H,和AJMP,SJMP指令是有差别的。
例2 程序
2000H MOV R0 , #10H ;10H→PC
2002H SJMP 03H ;PC+2+rel=2002H+2+03H=2007H→PC
┇ ┇
2006H ┇
2007H ┇
从说明中可见,执行SJMP 03H 指令后,马上跳转到2007H地址执行程序。
2.条件转移指令(8条)
条件转移指令是根据某种特定条件转移的指令。条件满足时转移,条件不满足时则顺序
执行下面的指令。
JZ rel ;A=0转向PC+2+rel→PC,A≠0顺序执行
JNZ rel ;A≠转向PC+2+rel→PC ,A=0顺序执行
CJNE A, direct, rel ;A≠ (direct)转向PC+3+rel→PC且当A>(direct),Cy=0
;当A(direct),Cy=1
;否则A=(direct),PC+3→PC即顺序执行
CJNE A, #data, rel ;A data P转向PC+3+rel→PC且当A >data,Cy=0
;当A data,Cy=1,
;A=data,PC+3→PC顺序执行
CJNZ Rn, #data, rel ;Rn≠data转向PC+3+rel→PC
;且当Rn>data,Cy=0,当Rndata,Cy=1
;Rn=data,PC+3→PC顺序执行
CJNE @Ri,#data, rel ;(Ri) ≠data ,PC+3+rel→PC
;且当(Ri)>data ,Cy=0,当(Ri)data,Cy=1
;(Ri)=data, PC+3→PC顺序执行
DJNZ Rn, rel ;Rn-1→Rn ,Rn ≠0转向PC+2+rel→PC
;Rn=0,PC+2→PC顺序执行
DJNZ direct, rel ;(direct)-1→(direct),(direct) ≠0转向 PC+2+rel
→PC
;(direct)=0 ,PC+2→PC顺序执行
注意:
1)CJNE类指令借用进位标志Cy作为比较结果的标志位。从指令中可知,目的操作数内容小于原操作数内容Cy置1,反之Cy清0,该类指令多用于分支程序。
2) DJNZ指令执行时Rn或direct先减1,然后再判断Rn或direct内容是否等于0。不为0则转,为0顺序执行。DJNZ用在循环程序中,控制循环次数很方便。
3) JZ和JNZ的操作数只有一个,是对A的内容的进行判断的指令。
例1 以下程序的循环次数是多少,最后(R0)=?
MOV R0 , #0
LL: ┇
DJNZ R0 , LL
分析:由于DJNZ是减1再判断大小的,因为R0=0,所以第一次执行DJNZ R0 , LL后R0=FFH=255,则程序要执行的次数为256次,R0最后的值为0。
解:程序要循环的次数为256次,最后R0=0
3.调用、返回、控操作指令
在程序设计中,常常要把具有一定功能的公用程序编制成子程序。当主程序转至子
程序时用调用指令,而在子程序的最后安排一条返回指令,使执行完子程序后再返回到主程序。
(1) LCALL addr16 ;调用入口地址为addr16的子程序
这是一条长调指令,可调用64KB范围内的子程序,因此,可放在程序的任何位置。
指令的执行过程分两步:第一步把断点(当前执行指令的下一条指令地址)压入堆栈。第二步将调用的子程序的入口地址装入PC。即addr16(16位地址)→PC,转向执行子程序。
(2) ACALL addr11 ;子程序入口地址为addr11的子程序
这是一条短调指令,只能实现2KB范围内的子程序的调用。其指令执行过程与LCALL
指令一样。但是需要注意的是:ACALL中addr11只占用PC的PC.0~PC.10位。
(3) RET ;放在子程序最后,使程序准确返回到主程序断点处
执行过程为:(SP)→PC.8~PC.15断点地址高字节送入PC
SP-1→SP,(SP) →PC.0~PC.7断点低字节送入PC,
这时PC中为主程序断点地址,程序准确返回到调用指令的下一条。
例 设SP=62H,(62H)=07H,(61H)=30H,执行指令RET
结果:SP=60H,(PC)=0730H,CPU从0730H开始执行程序。
(4) RETI ;中断返回指令
该指令用于中断服务程序,使中断程序结束后准确返回到主程序断点处,执行过程同RET,它还能清除优先级状态。
(5) NOP ;空操作
执行该指令时,CPU只进行取指令、译码,而不进行任何操作,故称为控操作。常用于产生一个机器周期延时。