汇编跳转指令使用总结
作者:H-KING
虽然jmp指令提供了控制转移,但是它不允许进行任何复杂的判断。80x86条件跳转指令提供了这种判断。条件跳转指令是创建循环和实现其他条件执行语句。条件跳转指令检查一个或多个标志位,判断它们是否匹配某个特殊条件(就像setcc指令):如果标志匹配成功,该指令就将控制转移到目标位置;如果匹配失败,CPU忽略该条件跳转指令而继续执行下一条指令。条件跳转指令有一个限制:目标标号的位置必须在跳转指令本身附近32768字节范围内,这通常对应着8000~32000条机器指令。一般情况下不会超过这种限制。
用自己的话总结:条件跳转指令是指jz,jg..等等指令,这些指令跳转方式是根据标志位的状态进行跳转,而设置这些标志的常见指令为cmp和test指令,所以他们经常搭配使用(应该是必须的)。即跳转指令前一行要吗有cmp指令要吗有test指令。
汇编标志位:
标志名 标志 1 标志 0
OF (溢出标志) OV NV
DF (方向标志) UP DN
IF (中断标志) DI EI
SF (符号标志位) PL NG
ZF (零标志) NZ ZR
AF (辅助进位标志位) NA AC
PF (奇偶标志) PO PE
CF (进位标志) NC CY
反汇编窗口,对应的标志位(双击后面的数字可改变其状态)

Test和cmp指令的区别
test属于逻辑运算指令
Test对两个参数(目标,源)执行AND逻辑操作,并根据结果设置标志寄存器,结果本身不会保存。
举例:
Test的一个非常普遍的用法是用来测试一方寄存器是否为空:
test ecx, ecx
jz somewhere
如果ecx为零,设置ZF零标志为1,Jz跳转
--------------------------------------------
CMP属于算术运算指令
CMP比较.(两操作数作减法,仅修改标志位,不回送结果). 
cmp实际上是只设置标志不保存结构的减法,并设置Z-flag(零标志).
举例:
Cmp eax, 2;       如果eax-2=0即eax=2就设置零标志为1
Jz ****;          如果设置了零标志就跳转
============================================
得出的结论
test逻辑与运算结果为零,就把ZF(零标志)置1;
cmp 算术减法运算结果为零,就把ZF(零标志)置1.
| 
       指 令  | 
      
       描 述  | 
      
       条 件  | 
      
       别 名  | 
      
       相 反 指 令  | 
    
| 
       JC  | 
      
       如果进位位被置位则跳转  | 
      
       进位标志=1  | 
      
       JB,JNAE  | 
      
       JNC  | 
    
| 
       JNC  | 
      
       如果进位位没有置位则跳转  | 
      
       进位标志=0  | 
      
       JNB,JAE  | 
      
       JC  | 
    
| 
       JZ  | 
      
       如果0标志被置位则跳转  | 
      
       0标志=1  | 
      
       JE  | 
      
       JNZ  | 
    
| 
       JNZ  | 
      
       如果0标志没有置位则跳转  | 
      
       0标志=0  | 
      
       JNE  | 
      
       JZ  | 
    
| 
       指 令  | 
      
       描 述  | 
      
       条 件  | 
      
       别 名  | 
      
       相反指令  | 
    
| 
       JS  | 
      
       如果符号位被置位则跳转  | 
      
       符号标志=1  | 
      
       JNS  | 
    |
| 
       JNS  | 
      
       如果符号位没有被置位则跳转  | 
      
       符号标志=0  | 
      
       JS  | 
    |
| 
       JO  | 
      
       如果溢出标志置位则跳转  | 
      
       溢出标志=1  | 
      
       JNO  | 
    |
| 
       JNO  | 
      
       如果溢出标志没有置位则跳转  | 
      
       溢出标志=0  | 
      
       JO  | 
      |
| 
       JP  | 
      
       如果奇偶校验位被置位则跳转  | 
      
       奇偶校验标志=1  | 
      
       JPE  | 
      
       JNP  | 
    
| 
       JPE  | 
      
       如果奇偶校验位为偶校验则跳转  | 
      
       奇偶校验标志=1  | 
      
       JP  | 
      
       JPO  | 
    
| 
       JNP  | 
      
       如果奇偶校验位没有被置位则跳转  | 
      
       奇偶校验标志=0  | 
      
       JPO  | 
      
       JP  | 
    
| 
       JPO  | 
      
       如果奇偶校验位为奇校验则跳转  | 
      
       奇偶校验标志=0  | 
      
       JNP  | 
      
       JPE  | 
    
使用无符号数比较的JCC指令
| 
       指 令  | 
      
       描 述  | 
      
       条 件  | 
      
       别 名  | 
      
       相反指令  | 
    
| 
       JA  | 
      
       如果超过(>)则跳转  | 
      
       进位标志=0,0标志=0  | 
      
       JNBE  | 
      
       JNA  | 
    
| 
       JNBE  | 
      
       如果不低于或等于(不 <=)则跳转  | 
      
       进位标志=0,0标志=0  | 
      
       JA  | 
      
       JBE  | 
    
| 
       JAE  | 
      
       如果超过或等于(>=)则跳转  | 
      
       进位标志=0  | 
      
       JNC,JNB  | 
      
       JNAE  | 
    
| 
       JNB  | 
      
       如果不低于则跳转(不 <)  | 
      
       进位标志=0  | 
      
       JNC,JAE  | 
      
       JB  | 
    
| 
       JB  | 
      
       如果低于(<)则跳转  | 
      
       进位标志=1  | 
      
       JC,JNAE  | 
      
       JNB  | 
    
| 
       JNAE  | 
      
       如果不超过或等于(不>=)则跳转  | 
      
       进位标志=1  | 
      
       JC,JB  | 
      
       JAE  | 
    
| 
       JBE  | 
      
       如果低于或等于(<=)则跳转  | 
      
       进位标志=1或0标志=1  | 
      
       JNA  | 
      
       JNBE  | 
    
| 
       JNA  | 
      
       如果不超过(不>)则跳转  | 
      
       进位标志=1或0标志=1  | 
      
       JBE  | 
      
       JA  | 
    
| 
       JE  | 
      
       如果相等(=)则跳转  | 
      
       0标志=1  | 
      
       JZ  | 
      
       JNE  | 
    
| 
       JNE  | 
      
       如果不相等(<>)则跳转  | 
      
       0标志=0  | 
      
       JNZ  | 
      
       JE  | 
    
使用有符号数比较的JCC指令
| 
       指 令  | 
      
       描 述  | 
      
       条 件  | 
      
       别 名  | 
      
       相反指令  | 
    
| 
       JG  | 
      
       如果大于(>)则跳转  | 
      
       符号标志=溢出标志或0标志=0  | 
      
       JNLE  | 
      
       JNG  | 
    
| 
       JNLE  | 
      
       如果小于或等于(<=)则跳转  | 
      
       符号标志=溢出标志或0标志=0  | 
      
       JG  | 
      
       JLE  | 
    
| 
       JGE  | 
      
       如果大于或等于(>=)则跳转  | 
      
       符号标志=溢出标志  | 
      
       JNL  | 
      
       JGE  | 
    
| 
       JNL  | 
      
       如果不小于(不<)则跳转  | 
      
       符号标志=溢出标志  | 
      
       JGE  | 
      
       JL  | 
    
| 
       JL  | 
      
       如果小于(<)则跳转  | 
      
       符号标志<>溢出标志  | 
      
       JNGE  | 
      
       JNL  | 
    
| 
       JNGE  | 
      
       如果大于或等于(>=)跳转  | 
      
       符号标志<>溢出标志  | 
      
       JL  | 
      
       JGE  | 
    
| 
       JLE  | 
      
       如果小于或等于(<=)跳转  | 
      
       符号标志<>溢出标志或0标志=1  | 
      
       JNG  | 
      
       JNLE  | 
    
| 
       JNG  | 
      
       如果不大于(不>)则跳转  | 
      
       符号标志<>溢出标志或0标志=1  | 
      
       JLE  | 
      
       JG  | 
    
| 
       JE  | 
      
       如果等于(=)则跳转  | 
      
       0标志=1  | 
      
       JZ  | 
      
       JNE  | 
    
| 
       JNE  | 
      
       如果不等于(<>)则跳转  | 
      
       0标志=0  | 
      
       JNZ  | 
      
       JE  | 
    
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。
