菜鷄日記——《汇编与接口技术》第3-3章 80X86指令系统 之 控制转移指令 & 处理机控制指令

控制转移指令 

  1. 转移指令(无条件转移指令、条件转移指令)
  2. 循环指令
  3. 子程序控制和返回指令
  4. 中断与中断返回指令
  • 无条件转移指令: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

​​​​​​​该指令是一个前缀指令形式,在其后面跟一个具体的操作指令,保证在该指令执行过程中,禁止协处理器修改数据总线上的数据,起到独占总线的作用,该指令不影响任何标志位​​​​​​​

猜你喜欢

转载自blog.csdn.net/Wyatt__Liu/article/details/83055126