汇编语⾔转换c51语⾔,mcs-51单⽚机汇编语⾔条件转移指令
(8条)编程举例
控制转移指令⽤于控制程序的流向,所控制的范围即为程序存储器区间,MCS-51系列单⽚机的控制转移指令相对丰富,有可对64kB程序空间地址单元进⾏访问的长调⽤、长转移指令,也有可对2kB字节进⾏访问的绝对调⽤和绝对转移指令,还有在⼀页范围内短相对转移及其它⽆条件转移指令,这些指令的执⾏⼀般都不会对标志位有影响。
汇编判断指令[2]. 条件转移指令(8条)
条件转移指令是指在满⾜⼀定条件时进⾏相对转移
JZ rel ; A=0,(PC)+ 2 + rel→(PC),累加器中的内容为0,则转移到偏移量所指向的地址,否则程序往下执⾏
JNZ rel ; A≠0,(PC)+ 2 + rel→(PC),累加器中的内容不为0,则转移到偏移量所指向的地址,否则程序往下执⾏
这两条指令是判断A内容是否为0转移指令
第⼀条指令的功能是:如果(A)=0,则转移,否则顺序执⾏(执⾏本指令的下⼀条指令)。转移到什么地⽅去呢?如果按照传统的⽅法,就要算偏移量,很⿇烦,好在现在我们可以借助机器汇编了,因此这条指令我们可以这样理解:
JB 标号
即转移到标号处,下⾯举⼀例说明:
MOV A,R0
JZ L1
MOV R1,#00H
AJMP L2
L1:MOV R1,#0FFH
L2:SJMP L2
END
在执⾏上⾯这段程序前,如果R0中的值是0的话,就转移到L1执⾏,因此最终的执⾏结果是R1中的值为0FFH。⽽如果R0中的值不等于0,则顺序执⾏,也就是执⾏MOV R1,#00H指令。最终的执⾏结果是R1中的值等于0。
第⼀条指令的功能清楚了,第⼆条当然就好理解了,如果A中的值不等于0,就转移。把上⾯的例⼦中的JZ改成JNZ试试看,程序执⾏的结果是怎样的?
CJNE A, data, rel ; A≠(data),(PC)+ 3 + rel→(PC),累加器中的内容不等于直接地址单元的内容,则转移到偏移量所指向的地址,否则程序往下执⾏
CJNE A, #data, rel ; A≠#data,(PC)+ 3 + rel→(PC),累加器中的内容不等于⽴即数,则转移到偏移量所指向的地址,否则程序往下执⾏
CJNE Rn, #data, rel ; A≠#data,(PC)+ 3 + rel→(PC),⼯作寄存器Rn中的内容不等于⽴即数,则转移到偏移量所指向的地址,否则程序往下执⾏
CJNE @Ri, #data, rel ; A≠#data,(PC)+ 3 + rel→(PC),⼯作寄存器Ri指向地址单元中的内容不等于⽴即数,则转移到偏移量所指向的地址,否则程序往下执⾏
第⼀条指令的功能是将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。
弄懂了这条指令,其它的⼏条就类似了,第⼆条是把A当中的值和直接地址的中的值⽐较,第三条则是
将直接地址中的值和⽴即数⽐较,第四条是将间址寻址得到的数和⽴即数⽐较,这⾥就不详谈了,下⾯给出⼏个相应的例⼦。
CJNE A,10H ;把A中的值和10H中的值⽐较(注意和前⾯题⽬的区别)
CJNE 10H,#35H;把10H中的值和35H中的值⽐较
CJNE @R0,#35H;把R0中的值作为地址,从此地址中取数并和35H⽐较。
DJNZ Rn, rel ; (Rn)-1→(Rn),(Rn)≠0,(PC)+ 2 + rel→(PC)⼯作寄存器Rn减1不等于0,则转移到偏移量所指向的地址,否则程序往下执⾏
DJNZ data, rel ; (Rn)-1→(Rn),(Rn)≠0,(PC)+ 2 + rel→(PC)直接地址单元中的内容减1不等于0,则转移到偏移量所指向的地址,否则程序往下执⾏
这两条指令在前⾯我们已有提到,这⾥就不多说了。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论