4.3.4 控制转移指令

4.3.4 控制转移指令

汇编语言程序中指令的执行顺序是由段寄存器CS和指令指针寄存器IP 的内容来决定的,CS寄存器中存放有当前代码段的基址,IP的内容为要执行的下一条指令距当前代码段段首的位移量,即偏移地址。两者的结合是下一条待执行指令的起始地址,作用是用来控制程序的执行流程,转移指令可改变IP 或CS、IP 的内容,从而控制指令的执行顺序,实现指令转移、程序调用等功能。

1.无条件转移指令JMP

格式:JMP LABEL

功能:JMP指令无条件地将控制转移至由标号所指定的位置执行,即程序无条件地跳转到目标地址。

转移的目标地址在指令中可直接使用标号,标号用来说明可执行指令在汇编语言程序中的位置,是某条指令起始地址的标志,定义标号与高级语言一样,标号名后加“:”即可。

例如:

上面的程序执行后,AX 中的值为1214H,因为执行JMP S后,越过第一条加法指令addw $0x0001,%ax,程序转向了标号S处的addw $0x0002,%ax。也就是说,程序只进行 了AX 加0002H 的 操 作。

2.循环指令LOOP

格式:LOOP LABEL

功能:遇LOOP指令,首先使寄存器CX 减1,然后判断CX 是否为0。如果CX 不为0,则转移到由标号指定处执行;否则顺序执行LOOP指令之后的其他指令,如图4.22所示。

图4.22 LOOP指令功能

循环指令一般使用CX 寄存器每次递减作为计数器,来控制循环次数。

例如,求10~1的累加和送AX:

上面的程序开始执行时,计数器CX 中的初值为10,AX 寄存器作为累加器,初始值为0,每循环一次AX 寄存器自动累加CX 中的值,执行LOOP L后,CX 自减1,然后判断CX 是否为0,若不为0,CX 自动减1,重新转到标号地址处执行循环,直到CX 为0为止。最终,AX 中存放的就是题目表达式中要计算的数值。

3.按标志位转移

按标志位转移共有10 条指令,除AF 标志位外其余5 个状态标志位均可用于产生转移。

ZF:JZ(JE)/JNZ(JNE),CF:JC(JB,JNAE)/JNC(JAE,JNB),OF:JO/JNO,PF:JP(JPE)/JNP(JPO),SF:JS/JNS。“/”前面的指令为相应标志为1时转移,而后面的指令则为相应标志为0时转移,括号内的指令与前面的指令完全等价。这类指令后均跟标号。

4.按数据大小转移

无符号数的大于、大于等于、小于和小于等于的转移指令分别为:JA(JNBE),JAE(JNB,JNC),JB(JNAE,JC)和JBE(JNA)。

有符号数的大于、大于等于、小于和小于等于的转移指令分别为:JG(JNLE),JGE(JNL),JL(JNLE)和JLE(JNG)。