条件转移指令是指在满足一定条件时进行相对转移。
(1)比较转移指令
cjnea,#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大还是小了。
(2)举例:
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。
弄懂了这条指令,其它的几条就类似了,第二条是把a当中的值和直接地址中的值比较,第三条则是将直接地址中的值和立即数比较,第四条是将间址寻址得到的数和立即数比较,这里就不详谈了,下面给出几个对应的例程。
cjne a,10h ;把a中的值和10h中的值比较(注意和上题的区别)
cjne 10h,#35h ;把10h中的值和35h中的值比较
cjne @r0,#35h ;把r0中的值作为地址,从此地址中取数并和35h比较