cmp是比较指令cmp是比较指令,cmp的功能相当于减法指令,只是不保存结果。cmp指令执行后,将对标志寄存器产生影响。其他相关指令通过识别这些被影响的标志寄存器位来得知比较结果。比如:movax,8movbx,3cmpax,bx执行后:ax=8,ZF=0,PF=1,SF=0,CF=0,OF=0.通过cmp指令执行后,相关标志位的值就可以看出比较的结果。cmpax,bx的逻辑含义是比较ax,bx中的值。如果执行后:ZF=1则AX=BXZF=0则AX!=BXCF=1则AXCF=0则AX=BXCF=0并ZF=0则AXBXCF=1或ZF=1则AX80X86标志寄存器及比较和跳转指令zfpfsfcfofdfcmpjejnejbjnbjajna标志寄存器80X86的标志寄存器的结构如下部分标志位说明ZFZF==ZeroFlag,是零标志位,记录指令执行结果是事为零。如果一条指令执行后结果为零,ZF置位,也就是ZF的值为1,否则为0。比如[csharp]viewplaincopy1.movax,12.subax,1ax-1=0,所以ZF=0。PFPF==ParityFlag,奇偶标志位,相关指令执行后,结果寄存器是所bit位中的1的个数是否为偶数,如果为偶数,PF=1,如果为奇数,PF=0。比如[csharp]viewplaincopy1.moval,12.oral,2执行后,al中的结果为00000011B,有2个1,为偶数,所以PF=1。SFSF==SignFlage,符号标志位,记录相关指令执行后,结果是否为负。如果为负,SF=1;如果非负,SF=0。CFCF==CarryFlage,进位标志位,无符号运算后是否向更高位进位或借位。如果进位或者借位,CF=1;否则CF=0。如果把指令看作有符号运算,则该标志会无意义。OFOF==OverFlage,溢出标志位,有符号运算后,结果寄存器中的值是否超出其所能表达的范围。如果超出,则OF=1;如果没有超出,则OF=0。比如[csharp]viewplaincopy1.moval,982.addal,99如果把上面两条指令看作有符号运算的话,那么执行结果将溢出,也就是OF=1,因为98+99=197超出8位有符号的范围:-128~127。如果把寄存器al改为ax,则不会溢出,也就是执行后OF=0。如是把上面两条指令看作无符号运算的话,则不用理会OF标志会,因为OF只有对有符号运算才有意义。注意CF和OF的区别:CF是对无符号数运算有意义的标志位,而OF是对有符号数运算有意义的标志位。比如,如果把上面两条指令看无符号运算,去看CF标志位才意义。DFDF=DirectionFlage,方向标志位,在串处理指令中,控制每次操作后si、di的增减。DF=0每次操作后,si、di递增;DF=1每次操作后,si、di递减。可用cld指令将DF位置0,用std指令将DF位置1。比如指令movsb,是将一个字节从源地址复制到目标地址,指令最后一个字母b代表byte,指令执行过程如下1、从si所指向的地址复制一个字节放到di所指向的地址;2、如果DF=0,将寄存器si和寄存器di中的值加1;如果DF=1,将寄存器si和寄存器di中的值减1。比较指令cmpcmp==compare,cmp是比较指令,功能相当于减法指令,但是不保存结果,只是执行后对标志寄存器产生影响,其他相关指令可以根据标志寄存器得知比较结果。比如[csharp]viewplaincopy1.cmpax,bx如果我们把ax和bx中的值看作有符号数,那么只查看SF标志(也可认为是结果负号标志位)位并不能得出两个数的大小关系,因为两个有符号数相减有可能溢出,得出的结果相反。比如执行如下指令[csharp]viewplaincopy1.cmpax,bx如果SF=1,OF=0,也就是没有溢出的情况下,结果为负,(ax)