跳转指令分三类:
一、无条件跳转: JMP;
二、根据 CX、ECX 寄存器的值跳转: JCXZ(CX 为 0 则跳转)、JECXZ(ECX 为 0 则跳转);
三、根据 EFLAGS 寄存器的标志位跳转, 这个太多了.
JMP 无条件转移指令
1、段内直接短转移
2、段内直接近转移
3、段内间接近转移
4、段间直接远转移
5、段间间接远转移
条件转移指令
1)根据单个条件标志的设置情况转移:
JZ(JE)   ;为 0(等于) 则跳转   jump if zero,
JNZ(JNE)  ;不为 0(等于) 则跳转
 
 
 
JS   ;结果为负则转移     sign
JNS  ;结果为正则转移
JO   ;溢出则转移    overflow
JNO  ;不溢出则转移
 
JP(JPE)     ;奇偶位为1则跳转  parity
JNP(JPO)     ;奇偶位为0则跳转
JB(或JNAE,或JC)   ;低于,或者不高于或等于,或进位为1则转移
JNB(或JAE,或JNC)  ;不低于,或者高于或等于,或进位为零则转移
 
2)比较两个无符号数,并根据比较结果转移
JB(JNAE或JC)其实就是 JNAE: jump not above and equal 低于,即不高于且不等于,或进位位为1 则转移
JB   ;无符号小于则跳转
JNB  ;无符号不小于则跳转
JBE  ;无符号小于等于则跳转
 
 
JNBE ;无符号不小于等于则跳
但执行这条语句JB  之前先用CMP来比较2个无符号数,CMP比较无符号数后影响的是CF,所以JB应该是通过CF来判断的
(注意:无符号数的比较在这里用高于和低于,有符号数的比较在这里用大于小于)
跳转相关的标志位:
| 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | 
| OF | DF | IF | TF | SF | ZF |   | AF |   | PF |   | CF | 
溢 出 | 
  | 
  | 
  | 
符 号 | 
零 | 
未 用 | 
辅 助 | 
未 用 | 
奇 偶 | 
未 用 | 
进 位 | 
 
 D16  即为及其指令中的位移量
 
 CALL  RET  都不影响条件码
 
中断指令 
INT     中断
INTO     溢出则中断
IRET     从中断返回
 
由于每个中断向量占有4个字节单元。所以中断指令中指定的类型号N需要乘以4才能取得所制定类型的中断向量
 
 
处理机控制与杂项操作指令
1、标志处理指令
CLC ; CF=0
STC ; CF=1
CMC ; CF=NOT CF
CLD ; DF=0
STD ; DF=1
CLI ; IF=0(应慎用)
STI ; IF=1
 
 
2、其它处理机控制与杂项操作指令
  NOP(NO Operation)   无操作指令  该指令不执行任何操作,其机器码占有一个字节,在调试程序时往往用这条指令占有一定的存储单元,以便在正式运行时用其他指令取代.(占位的作用,延时作用)
  HLT(halt)停机指令     该指令可使机器暂停工作,使处理机处于停机状态以便等待一次外部中断到来,中断结束后可继续执行下面的程序.
  WAIT(wait)等待指令  该指令使处理机处于空转状态,它也可以用来等待外部中断的发生,但中断结束后仍返回WAIT指令继续德行.
  ESC(escape)换码指令  其中mem指出一个存储单元,ESC指令把该存储单元的内容送到数据总线去.当然ESC指令不允许使用立即数和寄存器寻址方式.这条指令在使用协处理机(Coprocessor)执行某些操作时,可从存储器指得指令或操作数.协处理机(如8087)则是为了提高速度而可以选配的硬件.
  LOCK(lock)封锁指令  该指令是一种前缀,它可与其他指令联合,用来维持总线的锁存信号直到与其联合的指令执行完为止  . 当CPU与其他处理机协同工作时 , 该指令可避免破坏有用信息.
   这些指令可以控制处理机状态.这们都不影响条件码.
   BOUND 界限指令 
  ENTER imm16,imm8   建立堆栈帧
  LEAVE   释放堆栈帧
 
 
1、JMP(无条件转移指令)
执行代码的跳转,分为两种,一:段内转移,即要跳过去的代码地址和当前地址在同一段,这时只要修改IP(专用寄存器--指令指针)即可;二:段间转移:即要跳过去的代码地址和当前代码地址不在同一段内,需要同时修改CS和IP的值。
写法:
1、JMP label;若label与该指令位于同一代码段内,IP=label的偏移地址,否则CS:IP=label的分段地址,简单的说,就是跳到label的地址去。
2、JMP reg16/mem16;段内转移,偏移地址=reg16/[mem16]
3、JMP mem32;段间间接转移,段地址CS=mem32高字,偏移地址IP=mem32低字。
说明:当操作数是内存操作数时,若内存操作数是双字类型,则产生段间转移,若内存操作数是字类型,则产生段内间接转移。当不能确定类型时,编译器将报错。
32、Jcc(条件转移指令)
写法:Jcc label;
作用:若条件成立,则IP=label的偏移地址,否则,CPU将忽略该条件转移,继续执行下一条指令。
条件转移有以下几种形式:
表一:测试单个标志位的Jcc指令:
| 
 Jcc指令 
 | 
 描述 
 | 
 转移条件 
 | 
| 
 JC,JB,JNAE 
 | 
 有进位时转移 
 | 
 CF=1 
 | 
| 
 JNC,JNB,JAE 
 | 
 无进位时转移 
 | 
 CF=0 
 | 
| 
 JZ,JE 
 | 
 为零(相等)时转移 
 | 
 ZF=1 
 | 
| 
 JNZ,JNE 
 | 
 非零(不等)时转移 
 | 
 ZF=0 
 | 
| 
 JS 
 | 
 为负时转移 
 | 
 SF=1 
 | 
| 
 JNS 
 | 
 为正时转移 
 | 
 SF=0 
 | 
| 
 JO 
 | 
 溢出时转移 
 | 
 OF=1 
 | 
| 
 JON 
 | 
 不溢出时转移 
 | 
 OF=0 
 | 
| 
 JP,JPE 
 | 
 ‘1’的个数为偶数时转移 
 | 
 PF=1 
 | 
| 
 JNP,JPO 
 | 
 ‘1’的个数为奇数时转移 
 | 
 PF=0 
 | 
表二:用于带符号数比较的Jcc指令(常用在CMP指令之后,以判断带符号数的大小)
| 
 Jcc指令 
 | 
 描述 
 | 
 转移条件 
 | 
| 
 JG,JNLE 
 | 
 大于(不小于等于)时转移 
 | 
 SF=OF且ZF=0 
 | 
| 
 JGE,JNL 
 | 
 大于等于(不小于)时转移 
 | 
 SF=OF 
 | 
| 
 JL,LNGE 
 | 
 小于(不大于等于)时转移 
 | 
 SF<>OF 
 | 
| 
 JLE,LNG 
 | 
 小于等于(不大于)时转移 
 | 
 SF<>OF或ZF=1 
 | 
表三:用于无符号数比较的Jcc指令(常用在CNO指令之后,以判断无符号数的大小)
| 
 Jcc指令 
 | 
 描述 
 | 
 转移条件 
 | 
| 
 JA,JNBE 
 | 
 大于(不小于等于)时转移 
 | 
 CF=0且ZF=0 
 | 
| 
 JAE,JNB,JNC 
 | 
 大于等于(不小于)时转移 
 | 
 CF=0 
 | 
| 
 JB,LNAE,JC 
 | 
 小于(不大于等于)时转移 
 | 
 CF=1 
 | 
| 
 JBE,LNA 
 | 
 小于等于(不大于)时转移 
 | 
 ZF=1或CF=1 
  
 |