3.3.4 控制转移指令
算术运算指令共有16条,包括无条件转移、累加器判0转移、比较转移、减1不为0转移、子程序调用及返回5类指令,指令格式见表3-12。
表3-12 控制转移指令
在实际汇编语言程序中,转移指令的转移地址通常用位置的标识符号指出,这种<标号>对于不同的转移指令的含义是不同的,CPU根据当前的PC值和偏移量计算转移到的目的地址。
1)对于adrr16,<标号>可以是64KB寻址范围内的任何位置,即PC= <标号>的地址。
2)对于adrr11,<标号>可以是本条指令结束后上下2KB范围内的地址,即PC10-0被<标号>地址的10-0位替代。
3)对于rel,<标号>可以是本条指令结束后-128~127的范围内的地址。
1.无条件转移指令
无条件转移指令包括长跳转指令LJMP addr16,绝对跳转指令AJMP addr11,相对跳转指令SJMP rel,基寄存器加变址寄存器间接转移指令(又称散转指令)JMP @A+DPTR。
【例3-10】设累加器A中存放的是散转命令表项索引,表项的起始单元为JMP-TBL,根据命令索引,编写转向命令处理程序。
解:程序如下:
2.累加器判0转移
累加器判0转移包括累加器A为0转移JZ rel和累加器A不为0转移JNZ rel。
【例3-11】编程实现从内存50H开始查找关键字55H,找到第一个55H后停止寻找,且将该地址存放在A中。
解:程序如下:
3.比较转移
第一操作数与第二操作数比较,若二者相等,则不转移;若不等,则转移,且当第一操作数小于第二操作数时,对Cy置“1”,否则清0。
【例3-12】判断内存30H单元中内容是否为66H,若是则置40H单元为55H,若不是则置40H单元为AAH。
解:程序如下:
4.减1不为0转移
这类指令通常用来构成循环操作。
【例3-13】将内存30H~3FH单元中的内容移送到40H~4FH单元中。
解:循环处理算法流程图如图3-1所示,因为要移送16个单元,用R2作循环控制变量,程序如下:
图3-1 循环处理流程
5.子程序调用及返回
子程序是具有一定功能的公用程序段,可以多次被其他程序调用,便于模块化程序设计。子程序调用可以嵌套,在子程序的末尾是一条返回指令(RET),在中断服务子程序的末尾是一条中断返回指令(IRET)。
子程序调用的示意图如图3-2所示。
图3-2 子程序调用示意图