王叔 發表於 2020-1-18 14:18:23

汇编语言中test和cmp有什么区别

<p>汇编语言(assembly language)是一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。在汇编语言中,用助记符代替机器指令的操作码,用地址符号或标号代替指令或操作数的地址。在不同的设备中,汇编语言对应着不同的机器语言指令集,通过汇编过程转换成机器指令。特定的汇编语言和特定的机器语言指令集是一一对应的,不同平台之间不可直接移植。下面看下汇编语言中test和cmp有什么区别,</p>
<p><strong>汇编test和cmp区别<br />
</strong></p>
<p>看过破解教程,都知道test,cmp是比较关键,可是我一直不清楚它们究竟是怎么比较的,最后下决心找了很多资料,和大家一起把它们弄清楚.</p>
<p>首先看看:状态寄存器(即标志寄存器)</p>
<p>PSW(Program Flag)程序状态字(即标志)寄存器,是一个16位寄存器,由条件码标志(flag)和控制标志构成, <br />
如下所示:</p>
<p>条件码: <br />
</p>
<p>①OF(Overflow Flag)溢出标志,溢出时为1,否则置0.标明一个溢出了的计算,如:结构和目标不匹配. <br />
②SF(Sign Flag)符号标志,结果为负时置1,否则置0. <br />
③ZF(Zero Flag)零标志,运算结果为0时置1,否则置0. <br />
④CF(Carry Flag)进位标志,进位时置1,否则置0.注意:Carry标志中存放计算后最右的位. <br />
⑤AF(Auxiliary carry Flag)辅助进位标志,记录运算时第3位(半个字节)产生的进位置。 <br />
有进位时1,否则置0. <br />
⑥PF(Parity Flag)奇偶标志.结果操作数中1的个数为偶数时置1,否则置0.</p>
<p>控制标志位: <br />
</p>
<p>⑦DF(Direction Flag)方向标志,在串处理指令中控制信息的方向。 <br />
⑧IF(Interrupt Flag)中断标志。 <br />
⑨TF(Trap Flag)陷井标志。</p>
<p>为举例方便说一下jnz和jz <br />
</p>
<p>测试条件 <br />
JZ ZF=1 <br />
JNZ ZF=0 <br />
即Jz=jump if zero (结果为0则设置ZF零标志为1,跳转) <br />
Jnz=jump if not zero</p>
<p>好,接着来看test和cmp</p>
<p>test属于逻辑运算指令</p>
<p>功能: 执行BIT与BIT之间的逻辑运算 <br />
测试(两操作数作与运算,仅修改标志位,不回送结果). <br />
Test对两个参数(目标,源)执行AND逻辑操作,并根据结果设置标志寄存器,结果本身不会保存。EST AX,BX 与 AND AX,BX 命令有相同效果</p>
<p>语法: TEST r/m,r/m/data <br />
影响标志: C,O,P,Z,S(其中C与O两个标志会被设为0)</p>
<p><strong>运用举例: <br />
</strong></p>
<p>1.Test用来测试一个位,例如寄存器:</p>
<p>test eax, 100b; b后缀意为二进制 <br />
jnz **; 如果eax右数第三个位为1,jnz将会跳转</p>
<p>我是这样想的,jnz跳转的条件是ZF=0,ZF=0意味着ZF(零标志)没被置位,即逻辑与结果为1.</p>
<p>2.Test的一个非常普遍的用法是用来测试一方寄存器是否为空:</p>
<p>test ecx, ecx <br />
jz somewhere</p>
<p>如果ecx为零,设置ZF零标志为1,Jz跳转</p>
<p>CMP属于算术运算指令</p>
<p>功能: 比较两个值(寄存器,内存,直接数值) <br />
语法: CMP r/m,r/m/data <br />
标志位: C,P,A,Z,O</p>
<p>CMP比较.(两操作数作减法,仅修改标志位,不回送结果). <br />
cmp实际上是只设置标志不保存结构的减法,并设置Z-flag(零标志). <br />
零标志很像carry,也是内部标志寄存器的一位.</p>
<p>例如: <br />
</p>
<p>Cmp eax, 2; 如果eax-2=0即eax=2就设置零标志为1 <br />
Jz **; 如果设置了零标志就跳转</p>
<p>我得出的结论 <br />
test逻辑与运算结果为零,就把ZF(零标志)置1; <br />
cmp 算术减法运算结果为零,就把ZF(零标志)置1.</p>
<p>结论很简单嘛,之前我怎么就分不清呢,真是笨哪!</p>
<p><span style="color: #ff0000"><strong>ps:汇编语言中CMP的作用是什么?</strong></span></p>
<p>mp(compare)指令进行比较两个操作数的大小。</p>
<p>1.汇编语言是面向机器的程序设计语言。在汇编语合中,用助记符代替操作码,用地址符号或标号代替地址码。这样用符号代替机器语言的二进制码,就把机器语言变成了汇编语言。于是汇编语言亦称为符号语言。使用汇编语言编写的程序,机器不能直接识别,要由一种程序将汇编语言翻译成机器语言,这种起翻译作用的程序叫汇编程序,汇编程序是系统软件中语言处理系统软件。汇编程序把汇编语言翻译成机器语言的过程称为汇编。</p>
<p>2.例:cmp oprd1,oprd2,为第一个操作减去第二个操作数,但不影响两个操作数的值,它影响flag的CF,ZF,OF,AF,PF。若执行指令后,ZF=1 则说明两个数相等,因为zero为1说明结果为0。当无符号时,CF=1 则说明了有进位或借位,cmp是进行的减操作,故可以看出为借位,所以,oprd1&lt;oprd2。</p>
<p>3.CF=0 则说明了无借位,但此时要注意ZF是否为0,若为0,则说明结果不为0,故此时oprd1&gt;oprd2,当有符号时,若SF=0,OF=0 则说明了此时的值为正数,没有溢出,可以直观的看出,oprd1&gt;oprd2,若SF=1,OF=0 则说明了此时的值为负数,没有溢出,则为oprd1&lt;oprd2,若SF=0,OF=1 则说明了此时的值为正数,有溢出,可以看出oprd1&lt;oprd2,若SF=1,OF=1则说明了此时的值为负数,有溢出,可以看出oprd1&gt;oprd2。</p>
<p><span style="color: #ff0000"><strong>总结</strong></span></p>
<p>以上所述是小编给大家介绍的汇编语言中test和cmp有什么区别,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对琼殿技术社区网站的支持!<br />
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!</p>
                           
                            <div class="art_xg">
                              <b>您可能感兴趣的文章:</b><ul><li>王爽 汇编语言学习笔记(详细)</li><li>使用汇编语言编写一条简单的贪吃蛇的实现</li><li>汇编语言lea指令使用方法解析</li><li>Windows10下利用DOSBOX和MASM32搭建汇编语言开发环境</li><li>详解汇编语言RCL(带进位循环左移)和RCR(带进位循环右移)指令</li></ul>
                            </div>

                        </div>
                        <!--endmain-->
頁: [1]
查看完整版本: 汇编语言中test和cmp有什么区别