cmp是比较命令,cmp的功能相当于减法命令,只是不保存结果。 执行cmp指令时,会影响标志寄存器。 其它相关指令通过识别这些受影响的标志寄存器中的位来知道比较结果。
cmp命令格式: cmp操作对象1、操作对象2
功能:计算运算对象1-运算对象2,但不保存结果。 仅根据计算结果设定标志寄存器。
例如,指令cmp ax、ax,进行ax )-) ax )的运算,结果为0,但不保存在ax中,只影响flag的相关人员。 指令执行后:zf=1.pf=1、sf=0、cf=0、of=0。
下一个命令:
mov ax,8mov bx,3cmp ax,bx运行后:ax )=8,zf=0,pf=1,sf=0,cf=0,of=0。
其实,用cmp指令执行后,从相关标志位的值可以看出比较的结果。
cmp ax,bx
ax )=bx )时,) ax )-) bx )=0,因此zf=1;
ax ) ) bx )时,) ax )-) bx0,所以) zf=0;
ax ) ) bx )时,) ax )-) bx )产生借位,因此) cf=1;
ax ) ) bx )时,) ax )-) bx )不需要借位,所以) cf=0;
ax ) ) bx )时,ax )-) bx )不需要借位,结果也不是0,所以cf=0且zf=0;
对于ax) bx ),ax )-bx )可能是借位的,结果可能是0,因此cf=1或zf=1;
命令cmp ax、bx的逻辑含义是比较ax和bx的值,执行后:
zf=1,说明ax )=bx ) )。
zf=0,说明ax ) ) bx )
cf=1,说明ax ) ) )。
cf=0,说明ax ) ) bx ) ) ) ) ) )。
cf=0且zf=0,说明ax ) ) bx ) ) ) )。
cf=1或zf=0,说明ax) bx ) ) ) )。
上述是使用cmp进行编码数的比较时在比较结果中的相关联标志位的记录。 在cmp中进行带符号数的比较时,CPU用哪个标志位记录比较结果? 例如
在cmp ah,bhah )=BH )的情况下,) ah )-BH )=0,因此:zf=1
ah ) ) BH )时,ah )-) bh0,因此:zf=0;
从而,根据执行cmp命令后的zf的值,能够知道两个数据是否相等。
最后以cmp ah、bh为例,总结CPU执行cmp指令后,sf和of值如何说明比较的结果。
1 ) sf=1,of=0时
of=0表示没有溢出,逻辑上真结果的正负=实际结果的正负
sf=1,实际结果为负,所以逻辑上真正的结果为负,所以ah ) ) bh )。
2 ) sf=1,of=1时
of=1表示存在溢出,逻辑上真结果的正负实际结果的正负
因为sf=1,所以实际结果为负。
实际结果为负且存在溢出,表明溢出会导致实际结果为负。 简单地分析一下,如果溢出导致实际结果为负,那么逻辑上真正的结果必然为正。
因此,sf=1,of=1表示ah ) ) bh )。
3 ) sf=0,of=1时
of=1表示存在溢出,逻辑上真结果的正负实际结果的正负
因为sf=0,所以实际结果不是负的。 另一方面,of=1表示存在溢出,实际结果为正,因为结果不是0。
实际结果为正,存在溢出,表明溢出不会导致实际结果为负。 简单地分析一下,如果溢出导致实际结果为正,那么逻辑上真正的结果必然为负。
因此,sf=0,of=1表示ah ) ) bh )。
4 ) sf=0,of=0时
of=0表示没有溢出,逻辑上真结果的正负=实际结果的正负
因为sf=0,所以实际结果不是负的,所以逻辑上真结果不是负的,ah ) ) BH )。
转载于:https://www.cn blogs.com/gkp 307/p/9945151.html