心软是病情深致命 發表於 2020-1-24 08:56:57

汇编语言:比较指令、跳转指令、JCC的使用

<p><span style="color: #ff0000"><strong>一、JMP 指令:修改EIP 当前运行的下一条指令</strong></span><br />
</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; JMP 寄存器/立即数<br />
&nbsp; &nbsp; &nbsp;&nbsp; 目标类似:&nbsp; mov&nbsp; EIP,寄存器/立即数</p>
<p>&nbsp; &nbsp; &nbsp;&nbsp; CALL指令:&nbsp; 调用函数 &nbsp;CALL 地址A/寄存器<br />
&nbsp; &nbsp; &nbsp;&nbsp; 等价:&nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; PUSH 地址B &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ;保存call的下一条指令地址,压栈,作为返回值,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;MOV EIP,地址A/寄存器 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; ; 将函数首地址作为EIP</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp;RET指令:<br />
&nbsp; &nbsp; &nbsp;&nbsp; 等价:LEA ESP, &nbsp; &nbsp; &nbsp; ; esp = esp + 4<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;MOV EIP, &nbsp; &nbsp; ;和 CALL相反,将CALL 指令的下一条指令地址赋值给EIP;<br />
</p>
<p><span style="color: #ff0000"><strong>二、比较指令</strong></span><br />
</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CMP &nbsp;R/M,R/M/IMM<br />
&nbsp; &nbsp; &nbsp; &nbsp;该指令是比较两个操作数,实际上,它相当于SUB指令,但是相减的结果并不保存到第一个操作数中。只是根据相减的结果来改变零标志位的,当两个操作数相等的时候,零标志位置1。<br />
&nbsp; &nbsp; &nbsp; &nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp;TEST指令:指令格式:TEST &nbsp;R/M,R/M/IMM<br />
&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;该指令在一定程序上和CMP指令是类似的(类似and),两个数值进行与操作,结果不保存,但是会改变相应标志位.<br />
&nbsp; &nbsp; &nbsp; &nbsp;常见用法:用这个指令,可以确定某寄存器是否等于0。(观察ZF)<br />
</p>
<p><span style="color: #ff0000"><strong>三、JCC指令&nbsp; 16种跳转</strong></span><br />
</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 比较指令之后,一般都会有分支判断。<br />
&nbsp; &nbsp; &nbsp;&nbsp; 根据标志位进行判断,下一步的分支。</p>
<p>
<table cellspacing="0">
<tbody>
    <tr>
      <td>JE, JZ</td>
      <td>结果为零则跳转(相等时跳转)</td>
      <td>ZF=1</td>
    </tr>
    <tr>
      <td>JNE, JNZ</td>
      <td>结果不为零则跳转(不相等时跳转)</td>
      <td>ZF=0</td>
    </tr>
    <tr>
      <td>JS</td>
      <td>结果为负则跳转</td>
      <td>SF=1</td>
    </tr>
    <tr>
      <td>JNS</td>
      <td>结果为非负则跳转</td>
      <td>SF=0</td>
    </tr>
    <tr>
      <td>JP, JPE</td>
      <td>结果中1的个数为偶数则跳转</td>
      <td>PF=1</td>
    </tr>
    <tr>
      <td>JNP, JPO</td>
      <td>结果中1的个数为偶数则跳转</td>
      <td>PF=0</td>
    </tr>
    <tr>
      <td>JO</td>
      <td>结果溢出了则跳转</td>
      <td>OF=1</td>
    </tr>
    <tr>
      <td>JNO</td>
      <td>结果没有溢出则跳转</td>
      <td>OF=0</td>
    </tr>
    <tr>
      <td>JB, JNAE</td>
      <td>小于则跳转 (无符号数)</td>
      <td>CF=1</td>
    </tr>
    <tr>
      <td>JNB, JAE</td>
      <td>大于等于则跳转 (无符号数)</td>
      <td>CF=0</td>
    </tr>
    <tr>
      <td>JBE, JNA</td>
      <td>小于等于则跳转 (无符号数)</td>
      <td>CF=1 or ZF=1</td>
    </tr>
    <tr>
      <td>JNBE, JA</td>
      <td>大于则跳转(无符号数)</td>
      <td>CF=0 and ZF=0</td>
    </tr>
    <tr>
      <td>JL, JNGE</td>
      <td>小于则跳转 (有符号数)</td>
      <td>SF≠ OF</td>
    </tr>
    <tr>
      <td>JNL, JGE</td>
      <td>大于等于则跳转 (有符号数)</td>
      <td>SF=OF</td>
    </tr>
    <tr>
      <td>JLE, JNG</td>
      <td>小于等于则跳转 (有符号数)</td>
      <td>ZF=1 or SF≠ OF</td>
    </tr>
    <tr>
      <td>JNLE, JG</td>
      <td>大于则跳转(有符号数)</td>
      <td>ZF=0 and SF=OF</td>
    </tr>
</tbody>
</table>
</p>
<p><span style="color: #ff0000"><strong>四、思考</strong></span><br />
</p>
<p>1、CALL执行时堆栈有什么变化?EIP有变化吗?<br />
&nbsp; &nbsp; &nbsp; Call执行时,保存了cal函数首地址到EIP,同时将Call函数的首地址压栈;&nbsp;<br />
2、RET执行时堆栈有什么变化?EIP有变化吗?<br />
&nbsp; &nbsp; &nbsp; 和Call的过程相反,将前面Call的下一条指令地址,从堆栈中取出来作为EIP。<br />
3、使用汇编指令修改标志寄存器中的某个位的值,实现JCC的十六种跳转.<br />
&nbsp; &nbsp;&nbsp;不允许在OD中通过双击的形式修改标志寄存器.<br />
&nbsp; &nbsp;&nbsp;要通过汇编指令的执行去影响标志位,能用CMP和TEST实现的优先考虑.<br />
&nbsp; &nbsp;&nbsp; 见上面的表格;&nbsp;</p>
<p>以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持琼殿技术社区。</p>
                           
                            <div class="art_xg">
                              <b>您可能感兴趣的文章:</b><ul><li>汇编跳转指令使用总结</li><li>汇编 JCC指令表与笔记</li><li>汇编指令-状态寄存器、cmp、test、jz等指令详细说明</li><li>汇编语言伪指令和汇编指令的区别</li><li>汇编语言mov指令及基本用法</li><li>详解汇编语言MOV指令</li><li>详解汇编语言 dup伪指令</li><li>汇编语言指令集之条件转移指令实现</li><li>常用的汇编指令与技巧(收藏)</li><li>汇编语言指令集之串处理指令讲解</li></ul>
                            </div>

                        </div>
                        <!--endmain-->
頁: [1]
查看完整版本: 汇编语言:比较指令、跳转指令、JCC的使用