比较转移指令
CJNE A,#data,rel
CJNE A,direct,rel
CJNE Rn,#data,rel
CJNE @Ri,#data,rel
第一条指令的功能是将 A 中的值和立即数 data 比较,如果两者相等,就顺序执行(执行本指令的下一条指令),如果不相等,就转移,同样地,我们可以将 rel 理解成标号,即: CJNE A , #data, 标号。这样利用这条指令,我们就可以判断两数是否相等,这在很多场合是非常有用的。但有时还想得知两数比较之后哪个大,哪个小,本条指令也具有这样的功能,如果两数不相等,则 CPU 还会反映出哪个数大,哪个数小,这是用 CY (进位位)来实现的。如果前面的数( A 中的)大,则 CY=0 ,否则 CY=1 ,因此在程序转移后再次利用 CY 就可判断出 A 中的数比 data 大还是小了。
例:
MOV A,R0
CJNE A,#10H,L1
MOV R1,#0FFH
AJMP L3
L1: JC L2
MOV R1,#0AAH
AJMP L3
L2: MOV R1,#0FFH
L3: SJMP L3
上面的程序中有一条指令我们还没学过,即 JC ,这条指令的原型是 JC rel, 作用和上面的 JZ 类似,但是它是判 CY 是 0 ,还是 1 进行转移,如果 CY=1 ,则转移到 JC 后面的标号处执行,如果 CY=0 则顺序执行(执行它的下面一条指令)。
分析一下上面的程序,如果( A ) =10H ,则顺序执行,即 R1=0 。如果( A )不等于 10H ,则转到 L1 处继续执行,在 L1 处,再次进行判断,如果( A ) >10H ,则 CY=1 ,将顺序执行,即执行 MOV R1 , #0AAH 指令,而如果( A ) <10H ,则将转移到 L2 处指行,即执行 MOV R1 , #0FFH 指令。因此最终结果是:本程序执行前,如果( R0 ) =10H ,则( R1 ) =00H ,如果( R0 ) >10H ,则( R1 ) =0AAH ,如果( R0 ) <10H ,则( R1 ) =0FFH 。