连海 發表於 2020-1-24 08:50:14

汇编跳转指令使用总结

<p>虽然jmp指令提供了控制转移,但是它不允许进行任何复杂的判断。80x86条件跳转指令提供了这种判断。条件跳转指令是创建循环和实现其他条件执行语句。条件跳转指令检查一个或多个标志位,判断它们是否匹配某个特殊条件(就像setcc指令):如果标志匹配成功,该指令就将控制转移到目标位置;如果匹配失败,CPU忽略该条件跳转指令而继续执行下一条指令。条件跳转指令有一个限制:目标标号的位置必须在跳转指令本身附近32768字节范围内,这通常对应着8000~32000条机器指令。一般情况下不会超过这种限制。</p>
<p>用自己的话总结:条件跳转指令是指jz,jg..等等指令,这些指令跳转方式是根据标志位的状态进行跳转,而设置这些标志的常见指令为cmp和test指令,所以他们经常搭配使用(应该是必须的)。即跳转指令前一行要吗有cmp指令要吗有test指令。</p>
<p><strong>汇编标志位:</strong></p>
<p>标志名&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;标志&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;标志&nbsp;0</p>
<p>OF&nbsp;(溢出标志)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OV&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NV</p>
<p>DF&nbsp;&nbsp;(方向标志) &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; UP&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DN</p>
<p>IF&nbsp;(中断标志)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DI&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EI</p>
<p>SF&nbsp;(符号标志位)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NG</p>
<p>ZF&nbsp;(零标志)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NZ&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ZR</p>
<p>AF&nbsp;(辅助进位标志位)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NA&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AC</p>
<p>PF&nbsp;(奇偶标志)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PO&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PE</p>
<p>CF&nbsp;(进位标志)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NC&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CY</p>
<p>反汇编窗口,对应的标志位(双击后面的数字可改变其状态)</p>
<p style="text-align: center"><img alt="" src="https://img.jbzj.com/file_images/article/202001/202012483936930.png?202002483954" /></p>
<p><strong>Test和cmp指令的区别</strong><br />
</p>
<p>test属于逻辑运算指令<br />
Test对两个参数(目标,源)执行AND逻辑操作,并根据结果设置标志寄存器,结果本身不会保存。<br />
举例:<br />
Test的一个非常普遍的用法是用来测试一方寄存器是否为空:<br />
test ecx, ecx<br />
jz somewhere<br />
如果ecx为零,设置ZF零标志为1,Jz跳转<br />
</p>
<p>--------------------------------------------<br />
</p>
<p>CMP属于算术运算指令<br />
CMP比较.(两操作数作减法,仅修改标志位,不回送结果).&nbsp;<br />
cmp实际上是只设置标志不保存结构的减法,并设置Z-flag(零标志).<br />
举例:<br />
Cmp eax, 2; &nbsp; &nbsp; &nbsp; 如果eax-2=0即eax=2就设置零标志为1<br />
Jz ****; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;如果设置了零标志就跳转</p>
<p>============================================</p>
<p>得出的结论<br />
test逻辑与运算结果为零,就把ZF(零标志)置1;<br />
cmp 算术减法运算结果为零,就把ZF(零标志)置1.</p>
<p>
<table align="center">
<tbody>
    <tr>
      <td valign="top">
      <p>指 令</p>
      </td>
      <td valign="top">
      <p>描 述</p>
      </td>
      <td valign="top">
      <p>条 件</p>
      </td>
      <td valign="top">
      <p>别 名</p>
      </td>
      <td valign="top">
      <p>相 反 指 令</p>
      </td>
    </tr>
    <tr>
      <td valign="top">
      <p>JC</p>
      </td>
      <td valign="top">
      <p>如果进位位被置位则跳转</p>
      </td>
      <td valign="top">
      <p>进位标志=1</p>
      </td>
      <td valign="top">
      <p>JB,JNAE</p>
      </td>
      <td valign="top">
      <p>JNC</p>
      </td>
    </tr>
    <tr>
      <td valign="top">
      <p>JNC</p>
      </td>
      <td valign="top">
      <p>如果进位位没有置位则跳转</p>
      </td>
      <td valign="top">
      <p>进位标志=0</p>
      </td>
      <td valign="top">
      <p>JNB,JAE</p>
      </td>
      <td valign="top">
      <p>JC</p>
      </td>
    </tr>
    <tr>
      <td valign="top">
      <p>JZ</p>
      </td>
      <td valign="top">
      <p>如果0标志被置位则跳转</p>
      </td>
      <td valign="top">
      <p>0标志=1</p>
      </td>
      <td valign="top">
      <p>JE</p>
      </td>
      <td valign="top">
      <p>JNZ</p>
      </td>
    </tr>
    <tr>
      <td valign="top">
      <p>JNZ</p>
      </td>
      <td valign="top">
      <p>如果0标志没有置位则跳转</p>
      </td>
      <td valign="top">
      <p>0标志=0</p>
      </td>
      <td valign="top">
      <p>JNE</p>
      </td>
      <td valign="top">
      <p>JZ</p>
      </td>
    </tr>
    <tr>
      <td valign="top">
      <p>指 令</p>
      </td>
      <td valign="top">
      <p>描 述</p>
      </td>
      <td valign="top">
      <p>条 件</p>
      </td>
      <td valign="top">
      <p>别 名</p>
      </td>
      <td valign="top">
      <p>相反指令</p>
      </td>
    </tr>
    <tr>
      <td valign="top">
      <p>JS</p>
      </td>
      <td valign="top">
      <p>如果符号位被置位则跳转</p>
      </td>
      <td valign="top">
      <p>符号标志=1</p>
      </td>
      <td valign="top">
      <p></p>
      </td>
      <td valign="top">
      <p>JNS</p>
      </td>
    </tr>
    <tr>
      <td valign="top">
      <p>JNS</p>
      </td>
      <td valign="top">
      <p>如果符号位没有被置位则跳转</p>
      </td>
      <td valign="top">
      <p>符号标志=0</p>
      </td>
      <td valign="top">
      <p></p>
      </td>
      <td valign="top">
      <p>JS</p>
      </td>
    </tr>
    <tr>
      <td valign="top">
      <p>JO</p>
      </td>
      <td valign="top">
      <p>如果溢出标志置位则跳转</p>
      </td>
      <td valign="top">
      <p>溢出标志=1</p>
      </td>
      <td valign="top">
      <p></p>
      </td>
      <td valign="top">
      <p>JNO</p>
      </td>
    </tr>
    <tr>
      <td valign="top">
      <p>JNO</p>
      </td>
      <td valign="top">
      <p>如果溢出标志没有置位则跳转</p>
      </td>
      <td valign="top">
      <p>溢出标志=0</p>
      </td>
      <td valign="top">
      <p>JO</p>
      </td>
      <td valign="top">
      <p></p>
      </td>
    </tr>
    <tr>
      <td valign="top">
      <p>JP</p>
      </td>
      <td valign="top">
      <p>如果奇偶校验位被置位则跳转</p>
      </td>
      <td valign="top">
      <p>奇偶校验标志=1</p>
      </td>
      <td valign="top">
      <p>JPE</p>
      </td>
      <td valign="top">
      <p>JNP</p>
      </td>
    </tr>
    <tr>
      <td valign="top">
      <p>JPE</p>
      </td>
      <td valign="top">
      <p>如果奇偶校验位为偶校验则跳转</p>
      </td>
      <td valign="top">
      <p>奇偶校验标志=1</p>
      </td>
      <td valign="top">
      <p>JP</p>
      </td>
      <td valign="top">
      <p>JPO</p>
      </td>
    </tr>
    <tr>
      <td valign="top">
      <p>JNP</p>
      </td>
      <td valign="top">
      <p>如果奇偶校验位没有被置位则跳转</p>
      </td>
      <td valign="top">
      <p>奇偶校验标志=0</p>
      </td>
      <td valign="top">
      <p>JPO</p>
      </td>
      <td valign="top">
      <p>JP</p>
      </td>
    </tr>
    <tr>
      <td valign="top">
      <p>JPO</p>
      </td>
      <td valign="top">
      <p>如果奇偶校验位为奇校验则跳转</p>
      </td>
      <td valign="top">
      <p>奇偶校验标志=0</p>
      </td>
      <td valign="top">
      <p>JNP</p>
      </td>
      <td valign="top">
      <p>JPE</p>
      </td>
    </tr>
</tbody>
</table>
</p>
<p><span style="color: rgb(51,51,51)">使用无符号数比较的<span style="font-family: Arial">JCC</span><span style="font-family: '宋体'">指令</span></span></p>
<table align="center">
<tbody>
    <tr>
      <td valign="top">
      <p>指 令</p>
      </td>
      <td valign="top">
      <p>描 述</p>
      </td>
      <td valign="top">
      <p>条 件</p>
      </td>
      <td valign="top">
      <p>别 名</p>
      </td>
      <td valign="top">
      <p>相反指令</p>
      </td>
    </tr>
    <tr>
      <td valign="top">
      <p>JA</p>
      </td>
      <td valign="top">
      <p>如果超过(&gt;)则跳转</p>
      </td>
      <td valign="top">
      <p>进位标志=0,0标志=0</p>
      </td>
      <td valign="top">
      <p>JNBE</p>
      </td>
      <td valign="top">
      <p>JNA</p>
      </td>
    </tr>
    <tr>
      <td valign="top">
      <p>JNBE</p>
      </td>
      <td valign="top">
      <p>如果不低于或等于(不 &lt;=)则跳转</p>
      </td>
      <td valign="top">
      <p>进位标志=0,0标志=0</p>
      </td>
      <td valign="top">
      <p>JA</p>
      </td>
      <td valign="top">
      <p>JBE</p>
      </td>
    </tr>
    <tr>
      <td valign="top">
      <p>JAE</p>
      </td>
      <td valign="top">
      <p>如果超过或等于(&gt;=)则跳转</p>
      </td>
      <td valign="top">
      <p>进位标志=0</p>
      </td>
      <td valign="top">
      <p>JNC,JNB</p>
      </td>
      <td valign="top">
      <p>JNAE</p>
      </td>
    </tr>
    <tr>
      <td valign="top">
      <p>JNB</p>
      </td>
      <td valign="top">
      <p>如果不低于则跳转(不 &lt;)</p>
      </td>
      <td valign="top">
      <p>进位标志=0</p>
      </td>
      <td valign="top">
      <p>JNC,JAE</p>
      </td>
      <td valign="top">
      <p>JB</p>
      </td>
    </tr>
    <tr>
      <td valign="top">
      <p>JB</p>
      </td>
      <td valign="top">
      <p>如果低于(&lt;)则跳转</p>
      </td>
      <td valign="top">
      <p>进位标志=1</p>
      </td>
      <td valign="top">
      <p>JC,JNAE</p>
      </td>
      <td valign="top">
      <p>JNB</p>
      </td>
    </tr>
    <tr>
      <td valign="top">
      <p>JNAE</p>
      </td>
      <td valign="top">
      <p>如果不超过或等于(不&gt;=)则跳转</p>
      </td>
      <td valign="top">
      <p>进位标志=1</p>
      </td>
      <td valign="top">
      <p>JC,JB</p>
      </td>
      <td valign="top">
      <p>JAE</p>
      </td>
    </tr>
    <tr>
      <td valign="top">
      <p>JBE</p>
      </td>
      <td valign="top">
      <p>如果低于或等于(&lt;=)则跳转</p>
      </td>
      <td valign="top">
      <p>进位标志=1或0标志=1</p>
      </td>
      <td valign="top">
      <p>JNA</p>
      </td>
      <td valign="top">
      <p>JNBE</p>
      </td>
    </tr>
    <tr>
      <td valign="top">
      <p>JNA</p>
      </td>
      <td valign="top">
      <p>如果不超过(不&gt;)则跳转</p>
      </td>
      <td valign="top">
      <p>进位标志=1或0标志=1</p>
      </td>
      <td valign="top">
      <p>JBE</p>
      </td>
      <td valign="top">
      <p>JA</p>
      </td>
    </tr>
    <tr>
      <td valign="top">
      <p>JE</p>
      </td>
      <td valign="top">
      <p>如果相等(=)则跳转</p>
      </td>
      <td valign="top">
      <p>0标志=1</p>
      </td>
      <td valign="top">
      <p>JZ</p>
      </td>
      <td valign="top">
      <p>JNE</p>
      </td>
    </tr>
    <tr>
      <td valign="top">
      <p>JNE</p>
      </td>
      <td valign="top">
      <p>如果不相等(&lt;&gt;)则跳转</p>
      </td>
      <td valign="top">
      <p>0标志=0</p>
      </td>
      <td valign="top">
      <p>JNZ</p>
      </td>
      <td valign="top">
      <p>JE</p>
      </td>
    </tr>
</tbody>
</table>
<p><span style="color: rgb(51,51,51)">使用有符号数比较的<span style="font-family: Arial">JCC</span><span style="font-family: '宋体'">指令</span></span></p>
<table align="center">
<tbody>
    <tr>
      <td valign="top">
      <p>指 令</p>
      </td>
      <td valign="top">
      <p>描 述</p>
      </td>
      <td valign="top">
      <p>条 件</p>
      </td>
      <td valign="top">
      <p>别 名</p>
      </td>
      <td valign="top">
      <p>相反指令</p>
      </td>
    </tr>
    <tr>
      <td valign="top">
      <p>JG</p>
      </td>
      <td valign="top">
      <p>如果大于(&gt;)则跳转</p>
      </td>
      <td valign="top">
      <p>符号标志=溢出标志或0标志=0</p>
      </td>
      <td valign="top">
      <p>JNLE</p>
      </td>
      <td valign="top">
      <p>JNG</p>
      </td>
    </tr>
    <tr>
      <td valign="top">
      <p>JNLE</p>
      </td>
      <td valign="top">
      <p>如果小于或等于(&lt;=)则跳转</p>
      </td>
      <td valign="top">
      <p>符号标志=溢出标志或0标志=0</p>
      </td>
      <td valign="top">
      <p>JG</p>
      </td>
      <td valign="top">
      <p>JLE</p>
      </td>
    </tr>
    <tr>
      <td valign="top">
      <p>JGE</p>
      </td>
      <td valign="top">
      <p>如果大于或等于(&gt;=)则跳转</p>
      </td>
      <td valign="top">
      <p>符号标志=溢出标志</p>
      </td>
      <td valign="top">
      <p>JNL</p>
      </td>
      <td valign="top">
      <p>JGE</p>
      </td>
    </tr>
    <tr>
      <td valign="top">
      <p>JNL</p>
      </td>
      <td valign="top">
      <p>如果不小于(不&lt;)则跳转</p>
      </td>
      <td valign="top">
      <p>符号标志=溢出标志</p>
      </td>
      <td valign="top">
      <p>JGE</p>
      </td>
      <td valign="top">
      <p>JL</p>
      </td>
    </tr>
    <tr>
      <td valign="top">
      <p>JL</p>
      </td>
      <td valign="top">
      <p>如果小于(&lt;)则跳转</p>
      </td>
      <td valign="top">
      <p>符号标志&lt;&gt;溢出标志</p>
      </td>
      <td valign="top">
      <p>JNGE</p>
      </td>
      <td valign="top">
      <p>JNL</p>
      </td>
    </tr>
    <tr>
      <td valign="top">
      <p>JNGE</p>
      </td>
      <td valign="top">
      <p>如果大于或等于(&gt;=)跳转</p>
      </td>
      <td valign="top">
      <p>符号标志&lt;&gt;溢出标志</p>
      </td>
      <td valign="top">
      <p>JL</p>
      </td>
      <td valign="top">
      <p>JGE</p>
      </td>
    </tr>
    <tr>
      <td valign="top">
      <p>JLE</p>
      </td>
      <td valign="top">
      <p>如果小于或等于(&lt;=)跳转</p>
      </td>
      <td valign="top">
      <p>符号标志&lt;&gt;溢出标志或0标志=1</p>
      </td>
      <td valign="top">
      <p>JNG</p>
      </td>
      <td valign="top">
      <p>JNLE</p>
      </td>
    </tr>
    <tr>
      <td valign="top">
      <p>JNG</p>
      </td>
      <td valign="top">
      <p>如果不大于(不&gt;)则跳转</p>
      </td>
      <td valign="top">
      <p>符号标志&lt;&gt;溢出标志或0标志=1</p>
      </td>
      <td valign="top">
      <p>JLE</p>
      </td>
      <td valign="top">
      <p>JG</p>
      </td>
    </tr>
    <tr>
      <td valign="top">
      <p>JE</p>
      </td>
      <td valign="top">
      <p>如果等于(=)则跳转</p>
      </td>
      <td valign="top">
      <p>0标志=1</p>
      </td>
      <td valign="top">
      <p>JZ</p>
      </td>
      <td valign="top">
      <p>JNE</p>
      </td>
    </tr>
    <tr>
      <td valign="top">
      <p>JNE</p>
      </td>
      <td valign="top">
      <p>如果不等于(&lt;&gt;)则跳转</p>
      </td>
      <td valign="top">
      <p>0标志=0</p>
      </td>
      <td valign="top">
      <p>JNZ</p>
      </td>
      <td valign="top">
      <p>JE</p>
      </td>
    </tr>
</tbody>
</table>
<p>以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持琼殿技术社区。</p>
                           
                            <div class="art_xg">
                              <b>您可能感兴趣的文章:</b><ul><li>汇编语言rep movsd 的使用详解</li><li>汇编语言常见错误信息中文注解</li><li>从汇编看c++中默认构造函数的使用分析</li><li>从汇编看c++的默认析构函数的使用详解</li><li>汇编语言无效指令错误概述</li><li>汇编语言超浓缩教程</li><li>汇编语言 口算异或xor小结</li><li>从汇编看c++函数的默认参数的使用说明</li></ul>
                            </div>

                        </div>
                        <!--endmain-->
頁: [1]
查看完整版本: 汇编跳转指令使用总结