程序控制类指令有哪些:分支、跳转、循环指令
程序控制类指令有哪些,按8086汇编体系划分,主要包含无条件跳转、条件跳转、循环控制、子程序调用返回、中断相关指令,这类指令不参与数据运算,只修改指令指针寄存器IP的值,改变CPU读取指令的顺序,适用场景为汇编底层开发、微机原理考试、单片机汇编编程,不适合高级语言如Python、Java的逻辑编写。
程序控制类指令的跳转指令
无条件跳转指令JMP,可以直接修改IP,部分格式同时修改CS,实现段内跳转或者段间跳转,执行后一定会跳转到目标地址,不会做任何标志位判断。段内短跳转的范围限制在当前指令前后128字节区间,超出这个范围会出现编译报错。
条件跳转指令全部依赖标志寄存器的状态决定是否跳转,指令长度较短,大多只能段内短跳转。常见指令有JE/JZ相等跳转、JNE/JNZ不等跳转、JC进位跳转、JNC无进位跳转、JS负标志跳转、JNS正标志跳转、JO溢出跳转、JNO无溢出跳转、JA高于跳转、JB低于跳转。
程序控制类指令的循环指令
循环指令默认使用CX寄存器充当循环计数器,每执行一次自动把CX的值减1,再判断跳转条件。
- LOOP:CX减1,CX不为0则跳转
- LOOPE/LOOPZ:CX减1,CX不为0且ZF=1才跳转
- LOOPNE/LOOPNZ:CX减1,CX不为0且ZF=0才跳转
循环指令同样属于短跳转,跳转范围和条件跳转保持一致。
程序控制类指令的子程序与中断指令
CALL是子程序调用指令,执行时先把返回地址压入栈中,再跳转到子程序入口;RET为返回指令,从栈中取出保存的返回地址,恢复IP,回到调用位置继续执行。RET可以带立即数,用于调用后平衡栈空间。
INT是软中断指令,格式为INTn,n代表中断类型号,触发对应的中断服务程序;IRET是中断返回指令,会同时弹出IP、CS、标志寄存器内容,完整恢复中断前现场。INTO单独处理溢出中断,仅在OF=1时触发4号中断。
标志位不会被JMP、CALL、RET、LOOP系列指令修改,只有条件跳转指令读取标志位,不会改动标志位的值。
这是汇编考试高频考点。
8086汇编的程序控制类指令,不包含MOV、ADD这类数据传送和算术运算指令,数据类指令只会修改寄存器、内存或者标志位,不会更改指令执行流向。
