根据不同条件转向不同的处理程序,这种结构的程序称为分支程序。分支转移程序按结构类型来分,可分为单分支转移结构和多分支转移结构。
1.单分支转移结构
程序的判断仅有两个出口,两者选一,称为单分支选择结构。单分支转移的程序设计一般根据运算结果的状态标志,用条件判断指令选择并转移。
图5-5 双字节数求补码程序框图
【例5-3】 求双字节有符号数的补码。
双字节数是一个16位二进制数,其最高位D15是符号位,低15位是有效数字位。设R7存储高字节,R6存储低字节,求得的补码仍存储在R7、R6中。正数的补码是其本身,负数的补码是有效数字位按位取反加1。编程时先判断被转换数据的符号,通过判断数据的最高位来确定正负,数据最高位为1则为负数,为0则为正数。程序框图如图5-5所示。参考程序如下:
2.多分支转移结构
当程序的判断部分有两个以上的出口流向时,称为多分支转移结构。多分支转移结构有两种常见的形式,如图5-6和图5-7所示。8051的指令系统提供了两种非常有用的多分支选择指令,例如CJNE、JMP。
图5-6 多分支选择结构1
图5-7 多分支选择结构2
其中,比较转移指令CJNE能对两个单元内容进行比较(或称为散转指令)。当不相等时,程序作出相对转移,并指出其大小,以备作第二次判断;若两者相等,则程序按顺序往下执行。
最简单的多分支转移程序的设计,一般采用逐次比较法,就是把所有的不同情况一个个进行比较,发现符合就转向相应的处理程序。这种方法的主要缺点是程序太长,有n种可能的情况,就需要n个判断和转移。(www.xing528.com)
【例5-4】 求分段函数的值。分段函数定义如下:
X是自变量,存储在30H单元,Y是因变量结果,存入31H单元。这是一个三分支程序结构,按照X值的不同对应不同的Y值,程序有3个出口。程序流程图如图5-6所示。程序如下:
在实际应用中,经常会遇到图5-7所示结构形式的分支转移程序的设计,即在很多应用场合,需根据某一单元的内容是0、1、…、n,来分别转向处理程序0、1、…、n。对于这种情况,可以利用间接转移指令JMP@A+DPTR和直接转移指令(LJMP或AJMP)组成一个转移表,由指针DPTR决定分支转移程序的首地址,由累加器A的内容作偏移量,动态地选择相应的分支。
【例5-5】 根据寄存器R2的内容,转向各个处理程序PRGx(x=0~n)。
题意:需要根据R2的内容跳转到相应的分支处理程序,可以将各分支程序的首地址标号组成一个表格,再根据R2的内容选择表格中的相应首地址,从而实现多分支选择。
程序如下:
R2中的分支转移参数乘2是由于绝对跳转指令AJMP要占2个单元,而乘2可以用自加运算来实现。对分支转移数超过256个时,自累加时必定有进位,需要对分支转移参数的高位进行处理,即要将它加到DPH中去。
【例5-6】 根据31H(高字节)、30H(低字节)的内容(分支转移参数)转向不同的处理程序。程序如下:
对分支转移参量进行乘3处理,是因为长跳转指令LJMP要占3个单元。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。