年月日 發表於 2020-1-20 15:30:12

汇编 JCC指令表与笔记

<p><strong>汇编-JCC</strong></p>
<p>之前可以修改EIP寄存器的指令<br />
JMP,CALL,RETN</p>
<p>所有JCC指令的动作-&gt;根据标志寄存器修改EIP的值</p>
<p>标志寄存器 EFLAGS</p>
<p><img alt="" src="https://img.jbzj.com/file_images/article/202001/20200120152146.png" /></p>
<p><strong>CF(bit 0) C位</strong></p>
<p>若算术产生的结果在最高有效位(most-significant bit)发生进位或者借位则将其置1 反之清零</p>
<p>这个标志通常用来指示无符号证书运算的溢出状态</p>
<p>宽度溢出位。只要容器内放不下就会发生变化</p>
<blockquote>
<p>MOV AL,0xFE<br />
ADD AL,2 C =&gt; 1</p>
<p>MOV AL,0x7F<br />
SBU AL,0xFF C =&gt; 1</p>
</blockquote>
<p><strong>PF (bit 2) P位 奇偶校验位</strong></p>
<p>如果结果的最低有效字节 最后一个字节(least-significant byte)包含偶数个1位则该位置1,否则清零</p>
<p>利用PF可进行奇偶校验检查</p>
<p>需要传输1100 1110,数据中含5个1,所以其奇校验位位0,同时吧1100 1110传输给接收方,<br />
接收方收到数据后再一次计算奇偶性,1100 1110中仍然含有5个1,所以接收方计算出的奇偶验位还是0,与发送方一致,表示在此次传输过程中未发生错误。</p>
<p>例子:</p>
<blockquote>
<p>MOV AL,0xCE</p>
</blockquote>
<p><strong>AF (bit 4) 辅助进位标志器</strong></p>
<p>如果算术操作在结果的第三位发生进位或者借位则该标志置1,否则清零</p>
<p>这个标志在BCD(binary-code decimal) 算术运算中被使用</p>
<p><strong>ZF(bit 5) 用的最多 划重点。。</strong></p>
<p>若结果为0则将其置1,反之清零。<br />
经常与CMP或者TEST等指令一起使用</p>
<p><strong>例1: 判断2个值是否相等</strong></p>
<blockquote>
<p>MOV EAX,100<br />
MOV ECX,100<br />
CMP EAX,ECX</p>
</blockquote>
<p>(CMP指令相当于SUB指令,但是相减的结果并不保存到第一个操作数中 只影响标志寄存器)</p>
<p><strong>例2:判断某个值是否为0</strong></p>
<blockquote>
<p>AND EAX,EAX 0 ZF=1</p>
<p>TEST EAX,EAX</p>
</blockquote>
<p>(TEST相当于and,但是与运算的结果并不保存到第一个操作数中 只影响标志寄存器)</p>
<p><strong>SF(bit 7) </strong></p>
<p>该标志被设置为有符号整型的最高有效位<br />
(0指示结果为正,反之则为负)<br />
意思其实就是,运算完之后看下符号位 是0(正)还是1(负)</p>
<p>当然如果是无符号数运算就不用看了</p>
<p>只看容器内数字的最高位</p>
<p>例子</p>
<blockquote>
<p>MOV AL,0x7F MOV AL,0xFE<br />
ADD AL,2 ADD AL,2</p>
</blockquote>
<p><strong>OF(bit 11)</strong></p>
<p>溢出标志OF用于反应有符号数加减运算所得结果是否溢出<br />
可以这样理解:<br />
* 如果是无符号数运算,是否溢出看CF位<br />
* 如果是有符号数运算,是否溢出看OF位<br />
两个数做运算,运算完毕的结果跟运算前的数的最高位相同 OF为0<br />
最高位不同 为1</p>
<p>例子:</p>
<blockquote>
<p>MOV AL,0x7F<br />
ADD AL,2</p>
</blockquote>
<p><strong>DF(bit 10)</strong></p>
<p>这个方向标志控制字符串指令(`MOVS`,CMPS,SCAS,LODS以及`STOS`)。设置DF标志是的串指令自动递减(从高地址向低地址方向处理字符串),清楚该标志则是的串指令自动递增</p>
<p>STD以及CLD指令分别用户设置以及清除DF标志</p>
<p><strong>JCC常见指令</strong><br />
</p>
<p><img alt="" src="https://img.jbzj.com/file_images/article/202001/20200120152532.jpg" /></p>
<p>有符号和无符号的区别:</p>
<blockquote>
<p>CMP AL,CL<br />
JG 0x12345678<br />
JA 0x12345678</p>
</blockquote>
<p><strong>汇编 JCC指令表</strong></p>
<p>JCC指条件跳转指令,CC就是指条件码。</p>
<p>
<table>
<thead>
    <tr>
      <th>JCC指令</th>
      <th>中文含义</th>
      <th>英文原意</th>
      <th>检查符号位</th>
      <th>典型C应用</th>
    </tr>
</thead>
<tbody>
    <tr>
      <td>JZ/JE</td>
      <td>若为0则跳转;若相等则跳转</td>
      <td>jump if zero;jump if equal</td>
      <td>ZF=1</td>
      <td>if (i == j);if (i == 0);</td>
    </tr>
    <tr>
      <td>JNZ/JNE</td>
      <td>若不为0则跳转;若不相等则跳转</td>
      <td>jump if not zero;jump if not equal</td>
      <td>ZF=0</td>
      <td>if (i != j);if (i != 0);</td>
    </tr>
    <tr>
      <td>JS</td>
      <td>若为负则跳转</td>
      <td>jump if sign</td>
      <td>SF=1</td>
      <td>if (i &lt; 0);</td>
    </tr>
    <tr>
      <td>JNS</td>
      <td>若为正则跳转</td>
      <td>jump if not sign</td>
      <td>SF=0</td>
      <td>if (i &gt; 0);</td>
    </tr>
    <tr>
      <td>JP/JPE</td>
      <td>若1出现次数为偶数则跳转</td>
      <td>jump if Parity (Even)</td>
      <td>PF=1</td>
      <td>(null)</td>
    </tr>
    <tr>
      <td>JNP/JPO</td>
      <td>若1出现次数为奇数则跳转</td>
      <td>jump if not parity (odd)</td>
      <td>PF=0</td>
      <td>(null)</td>
    </tr>
    <tr>
      <td>JO</td>
      <td>若溢出则跳转</td>
      <td>jump if overflow</td>
      <td>OF=1</td>
      <td>(null)</td>
    </tr>
    <tr>
      <td>JNO</td>
      <td>若无溢出则跳转</td>
      <td>jump if not overflow</td>
      <td>OF=0</td>
      <td>(null)</td>
    </tr>
    <tr>
      <td>JC/JB/JNAE</td>
      <td>若进位则跳转;若低于则跳转;若不高于等于则跳转</td>
      <td>jump if carry;jump if below;jump if not above equal</td>
      <td>CF=1</td>
      <td>if (i &lt; j);</td>
    </tr>
    <tr>
      <td>JNC/JNB/JAE</td>
      <td>若无进位则跳转;若不低于则跳转;若高于等于则跳转;</td>
      <td>jump if not carry;jump if not below;jump if above equal</td>
      <td>CF=0</td>
      <td>if (i &gt;= j);</td>
    </tr>
    <tr>
      <td>JBE/JNA</td>
      <td>若低于等于则跳转;若不高于则跳转</td>
      <td>jump if below equal;jump if not above</td>
      <td>ZF=1或CF=1</td>
      <td>if (i &lt;= j);</td>
    </tr>
    <tr>
      <td>JNBE/JA</td>
      <td>若不低于等于则跳转;若高于则跳转</td>
      <td>jump if not below equal;jump if above</td>
      <td>ZF=0或CF=0</td>
      <td>if (i &gt; j);</td>
    </tr>
    <tr>
      <td>JL/JNGE</td>
      <td>若小于则跳转;若不大于等于则跳转</td>
      <td>jump if less;jump if not greater equal</td>
      <td>SF != OF</td>
      <td>if (si &lt; sj);</td>
    </tr>
    <tr>
      <td>JNL/JGE</td>
      <td>若不小于则跳转;若大于等于则跳转;</td>
      <td>jump if not less;jump if greater equal</td>
      <td>SF = OF</td>
      <td>if (si &gt;= sj);</td>
    </tr>
    <tr>
      <td>JLE/JNG</td>
      <td>若小于等于则跳转;若不大于则跳转</td>
      <td>jump if less equal;jump if not greater</td>
      <td>ZF != OF 或 ZF=1</td>
      <td>if (si &lt;= sj);</td>
    </tr>
    <tr>
      <td>JNLE/JG</td>
      <td>若不小于等于则跳转;若大于则跳转</td>
      <td>jump if not less equal;jump if greater</td>
      <td>SF=0F 且 ZF=0</td>
      <td>if(si&gt;sj)</td>
    </tr>
</tbody>
</table>
</p>
<p><strong>汇编JCC笔记</strong></p>
<p><strong>1. JMP指令:</strong></p>
<p>唯一作用是无条件修改EIP的值,没有对栈和寄存器产生影响。</p>
<p>JMP 寄存器/立即数<br />
本质是MOV EIP,寄存器/立即数,EIP只能由JMP指令修改</p>
<p><strong>2. CALL指令:</strong></p>
<p>第一个作用和JMP一样,MOV EIP,寄存器/立即数。<br />
第二个作用,把CALL指令的写一个指令地址push到栈顶(修改ESP)<br />
CALL指令还没执行,怎么知道下一行指令的地址?<br />
根据CALL指令占用的数据宽度,加偏移量去算,比如CALL这条指令,地址0X004183D7中数据为E8 21 00 00 00,有5个字节,下一行指令的地址就是地址偏移5</p>
<p><strong>3.RET</strong></p>
<p>本质是POP EIP<br />
RET指令通常和CALL成对出现,把CALL压栈的地址POP EIP,让程序回归原来的流程</p>
<p><strong>4. CMP指令:该指令是比较两个操作数是否相同</strong></p>
<p>指令格式:CMP R/M,R/M/IMM<br />
相当于SUB指令,但是只会用两个数相减来比较是否相同,相减的结果并不保存在第一个操作数中。<br />
只会根据相减的结果来改变标志位的,当两个操作数相等的时候,零标志位置为1.<br />
MOV EAX,100<br />
MOV ECX,100<br />
CMP EAX,ECX&nbsp; //只相减比较,判断并修改零标志寄存器,不会把EAX修改为相减结果。<br />
CMP AX,WORD PTR DS:<br />
CMP AL,BYTE PTR DS:<br />
CMP EAX,DWORD PTR DS:</p>
<p><strong>4. TEST指令:</strong></p>
<p>指令格式:TEST R/M,R/M/IMM<br />
该指令和CMP有一定的相似性,两个数值进行与操作,结果也不保存,但是会改变相应标志位。<br />
与操作:1 and 1 =1;1 and 0 = 0; 0 and 1 = 0; 0 and 0 = 0<br />
常见用法:用这个指令,可以确定某寄存器是否等于0,如果EAX的二进制某些位为 1 的话,那么运算的结果就不为零。</p>
<blockquote>
<p>TEST EAX,EAX</p>
</blockquote>
<p>5.<br />
1. JE,JZ -------jump if equal结果为零则跳转(相等时跳转)-------ZF = 1</p>
<p>例:</p>
<blockquote>
<p>CMP EAX,ECX<br />
JZ 0x413f9</p>
</blockquote>
<p>1、 &nbsp;JE, JZ&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;-------------结果为零则跳转(相等时跳转)----------------ZF=1<br />
2、 &nbsp;JNE, JNZ&nbsp; &nbsp;-------------结果不为零则跳转(不相等时跳转)----------------ZF=0<br />
3、 &nbsp;JS&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; -------------结果为负则跳转----------------SF=1<br />
4、 &nbsp;JNS&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;-------------结果为非负则跳转----------------SF=0<br />
5、 &nbsp;JP, JPE&nbsp; &nbsp; &nbsp;-------------结果中1的个数为偶数则跳转----------------PF=1<br />
6、 &nbsp;JNP, JPO&nbsp; -------------结果中1的个数为偶数则跳转----------------PF=0<br />
7、 &nbsp;JO&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; -------------结果溢出了则跳转----------------OF=1<br />
8、 &nbsp;JNO&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;-------------结果没有溢出则跳转----------------OF=0<br />
9、 &nbsp; JB, JNAE-------------小于则跳转 (无符号数)----------------CF=1<br />
10、 JNB, JAE-------------大于等于则跳转 (无符号数)----------------CF=0<br />
11、 &nbsp;JBE, JNA-------------小于等于则跳转 (无符号数)----------------CF=1 or ZF=1<br />
12、 JNBE, JA-------------大于则跳转(无符号数)----------------CF=0 and ZF=0<br />
13、 JL, JNGE-------------小于则跳转 (有符号数)----------------SF≠ OF<br />
14、 JNL, JGE-------------大于等于则跳转 (有符号数)----------------SF=OF<br />
15、 JLE, JNG-------------小于等于则跳转 (有符号数)----------------ZF=1 or SF≠ OF<br />
16、 JNLE, JG-------------大于则跳转(有符号数)----------------ZF=0 and SF=OF</p>
<p>好了这篇关于汇编 JCC指令表与笔记的文章就介绍到这了,希望大家以后多多支持琼殿技术社区。</p>
                           
                            <div class="art_xg">
                              
                            </div>

                        </div>
                        <!--endmain-->
頁: [1]
查看完整版本: 汇编 JCC指令表与笔记