控制转移指令
- 转移指令(无条件转移指令、条件转移指令)
- 循环指令
- 子程序控制和返回指令
- 中断与中断返回指令
- 无条件转移指令:JMP
段内直接短转移:JMP SHORT OPR 执行操作:IP←IP+8位位移量 (即255B的位移范围)
段内直接近转移:JMP NEAR PTR OPR 执行操作:IP←IP+16位位移量 (即64KB的位移范围)
段内间接转移:JMP WORD PTR OPR 执行操作:IP←(通用寄存器) 或 IP←(OPR)
1)前两条的位移量为目的地址与OPR地址的相对位移量
2)最后一条目的地址存储在OPR中,为有效地址
- 条件转移指令:JZ/JNZ、JE/JNE、JS/JNS、JO/JNO、JP/JNP、JB/JNB、JL/JNL、JBE/JNBE、JLE/JNLE、JCXZ
指令格式 转移条件 说明 单个标志条件转移 JZ(JE) OPR ZF=1 = E euqal JNZ(JNE) OPR ZF=0 != N not JS OPR SF=1 负数 JNS OPR SF=0 非负 JO OPR OF=1 溢出 JNO OPR OF=0 没溢出 JP OPR PF=1 JNP OPR PF=0 JC OPR CF=1 < JNC OPR CF=0 >= 两个无符号数比较 JB(JNAE,JC) OPR CF=1 < JNB(JAE,JNC) OPR CF=0 >= JBE(JNA) OPR CF∨ZF=1 <= JNBE(JA) OPR CF∨ZF=0 > 两个带符号数比较 JL(JNGE) OPR SF⊕OF=1 < G greater JNL(JGE) OPR SF⊕OF=0 >= JLE(JNG) OPR (SF⊕OF)∨ZF=1 <= L less JNLE(JG) OPR (SF⊕OF)∨ZF=0 > 测试CX寄存器 JCXZ OPR CX=0 Z zero 注意:只能使用段内直接寻址(8位位移量),超过60条指令要谨慎使用
- 循环指令:LOOP、LOOPZ/LOOPE、LOOPNZ/LOOPNE
循环指令:LOOP OPR 测试条件:CX≠0
为零或相等时循环:LOOPZ(LOOPE) OPR 测试条件:CX≠0且ZF=1
不为零或不相等时循环:LOOPNZ(LOOPNE) OPR 测试条件:CX≠0且ZF=0
执行操作:CX←CX-1,然后判断若满足条件则 IP←IP+8位位移量,循环;否则 IP 不变,退出循环
1)CX中存放循环次数,每次自动减一
2)循环嵌套时注意用栈保护CX值
- 子程序控制和返回指令:CALL、RET
段内直接近调用:CALL DST(DST为子程序名)
执行操作:先SP←SP-2,(SP+1),(SP)←IP保护当前程序的下条指令地址,后IP←IP+16位位移量
段内间接近调用:CALL DST(DST为寄存器如BX,或存储器地址,存储的是目的程序的EA)
执行操作:先SP←SP-2,(SP+1),(SP)←IP保护当前程序的下条指令地址,后IP←(DST)
段间远调用:CALL FAR DST(DST为子程序名)
执行操作:先SP←SP-2,(SP+1),(SP)←IP保护当前程序的下条指令地址,后IP←(DST)
注意:只能调用段外声明为FAR的子程序,如sample PROC FAR
段内近返回:RET 执行操作:IP←(SP+1),(SP),SP←SP+2
段内带立即数返回:RET EXP 执行操作:IP←(SP+1),(SP),SP←SP+EXP
- 中断与中断返回指令:INT、INTO、IRET
中断指令是隐指令,并不是指令系统中的一条真正指令,它没有操作码
中断向量存放于内存中的中断向量区(从00000H号地址开始),是中断服务程序的入口地址,从0开始编号,每个中断向量4字节(32位),低位存IP,高位存CS。中断时,按照中断类型编号从中断向量表中取出相应的值赋给CS和IP(又硬件自动完成,不可见,但是可以修改中断响亮表中的值)。由于中断的复杂,将在后面的接口部分专门介绍。在80X86中reset不算是中断,不在中断向量表内,reset时CS=0FFFFH,IP=0000H,在内存FFFF0H处存放了一个JMP指令。
中断指令:INT TYPE 或 INT(隐藏TYPE为3,TYPE不是操作码)
执行操作:SP←SP-2,(SP+1),(SP)←FLAGS,
SP←SP-2,(SP+1),(SP)←CS,
SP←SP-2,(SP+1),(SP)←IP,(隐含操作)
IP←(TYPE*4),CS←(TYPE*4+2)
溢出中断指令:INTO
执行操作:若OF=1,(隐含操作),IP←(10H),CS←(12H)
中断返回指令:IRET
执行(隐含)操作:IP←(SP+1),(SP),SP←SP+2
CS←(SP+1),(SP),SP←SP+2
FLAGS←(SP+1),(SP),SP←SP+2
1)TYPE(0~255)是中断类型号
2)INT指令把IF和TF置0,但不影响其他标志位
标识处理指令
CLC、STC、CMC:对CF标志位清零/置位/取反
CLD、STD:字符串移动方向增/减标志
CLI、STI:开/关中断
处理机控制指令
控制CPU工作方式,用于多任务处理
- 空操作指令:NOP
延迟下一条指令的执行,不影响任何标志位
- 等待指令:WAIT
使CPU处于等待状态,直到协处理器完成运算,并用一个重启信号唤醒CPU为止,不影响任何标志位
(协处理器不算外设,而是另一个FPU,浮点运算处理器)
- 暂停指令:HLT
在等待中断信号时,使CPU处于暂停工作状态(低功耗模式),CS:IP指向下一条待执行的指令,但不进行任何操作,保持先前操作中所有寄存器的状态不变 ,当产生了中断信号,转入中断处理程序,在中断处理程序执行完后,中断返回指令IRET并唤醒CPU执行下条指令,该指令指令不影响任何标志位
- 封锁数据指令:LOCK INSTRUCTION
该指令是一个前缀指令形式,在其后面跟一个具体的操作指令,保证在该指令执行过程中,禁止协处理器修改数据总线上的数据,起到独占总线的作用,该指令不影响任何标志位