cmp是比较指令,cmp的功能相当于减法指令,只是不保存结果。cmp指令执行后,将对标志寄存器产生影响。其他相关指令通过识别这些被影响的标志寄存器位来得知比较结果。
比如:mov ax,8
mov bx,3
cmpax,bx
执行后:ax=8,ZF=0,PF=1,SF=0,CF=0,OF=0.
通过cmp指令执行后,相关标志位的值就可以看出比较的结果。
cmpax,bx的逻辑含义是比较ax,bx中的值。如果执行后:
ZF=1则AX=BX
ZF=0则AX!=BX
CF=1则AX<BX
CF=0则AX>=BX
CF=0并ZF=0则AX>BX
CF=1或ZF=1则AX<=BX
80X86标志寄存器及比较和跳转指令 zf pf sf cf of df cmp je jne jb jnb ja jna
标志寄存器
80X86的标志寄存器的结构如下
部分标志位说明
ZF
ZF==Zero Flag,
是零标志位,记录指令执行结果是事为零。如果一条指令执行后结果为零,ZF置位,也就是ZF的值为1,否则为0 。比如
[csharp] view plaincopy
1. mov ax,1
2. sub ax,1
ax-1=0,所以ZF=0 。
PF
PF==Parity Flag,
奇偶标志位,相关指令执行后,结果寄存器是所bit位中的1的个数是否为偶数,如果为偶数,PF=1,如果为奇数,PF=0。比如
[csharp] view plaincopy
1. mov al,1
2. or al,2
执行后,al中的结果为00000011B,有2个1,为偶数,所以PF=1。
SF
SF==Sign Flage,
符号标志位,记录相关指令执行后,结果是否为负。如果为负,SF=1;如果非负,SF=0 。
CF
CF==Carry Flage,
进位标志位,无符号运算后是否向更高位进位或借位。如果进位或者借位,CF=1;否则CF=0 。如果把指令看作有符号运算,则该标志会无意义。
OF
OF==Over Flage,
溢出标志位,有符号运算后,结果寄存器中的值是否超出其所能表达的范围。如果超出,则OF=1;如果没有超出,则OF=0 。比如
[csharp] view plaincopy
1. mov al,98
2. add al,99
如果把上面两条指令看作有符号运算的话,那么执行结果将溢出,也就是OF=1,因为98+99=197超出8位有符号的范围:-128~127。如果把寄存器al改为ax,则不会溢出,也就是执行后OF=0。
如是把上面两条指令看作无符号运算的话,则不用理会OF标志会,因为OF只有对有符号运算才有意义。
注意CF和OF的区别:CF是对无符号数运算有意义的标志位,而OF是对有符号数运算有意义的标志位。比如,如果把上面两条指令看无符号运算,去看CF标志位才意义。
DF
DF=Direction Flage,
方向标志位,在串处理指令中,控制每次操作后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。
比较指令cmp
cmp==compare,cmp是比较指令,功能相当于减法指令,但是不保存结果,只是执行后对标志寄存器产生影响,其他相关指令可以根据标志寄存器得知比较结果。比如
[csharp] view plaincopy
1. cmp ax,bx
相当于作(ax)-(bx)运算,结果不保存,只影响标志寄存器。
如果我们把ax和bx中的值看作无符号数,那么指令执行后,根据标志寄存器可作如下判断:
ZF=1 | 说明(ax)=(bx) |
ZF=0 | 说明(ax)!=(bx) |
CF=1 | 借位,说明(ax)<(bx) |
CF=1或ZF=1 | 借位(ax)<=(bx) |
CF=0 | (ax)>=(bx) |
CF=0且ZF=0 | (ax)>(bx) |
如果我们把ax和bx中的值看作有符号数,那么只查看SF标志(也可认为是结果负号标志位)位并不能得出两个数的大小关系,因为两个有符号数相减有可能溢出,得出的结果相反。比如执行如下指令
[csharp] view plaincopy
1. cmp ax,bx
如果SF=1,OF=0,也就是没有溢出的情况下,结果为负,(ax)<(bx),但如果溢出,即OF=1时,结果相反,(ax)>(bx) 。
SF=1且OF=0 | (ax)<(bx) |
SF=1且OF=1 | (ax)<(bx) |
SF=0且OF=0 | (ax)>(bx) |
SF=0且OF=1 比较指令cmp怎么用 | (ax)<(bx) |
条件跳转指令
跳转指令一般和cmp指令配合使用,cmp指令修改标志位,跳转指令检测相关的标志位,根据检测结果来决定是否修改IP寄存器从而实现跳转。
由于可以根据需要把cmp指令看作两种比较:无符号数比较和有符号数比较,所以根据cmp指令的比较结果进行比较的指令也分为两种:
1、根据无符号数的比较结果进行跳转的指令,检测ZF和CF标志位;
2、根据有符号数的比较结果进行跳转的指令,检测ZF、SF和OF标志位。
下面是一些缩写字母说明
j | jump | 跳转 |
e | equal | 等于 |
ne | not equal | 不等于 |
b | below | 小于 |
nb | not below | 不小于 |
a | above | 大于 |
na | not above | 不大于 |
下面是常用的根据无符号数的比较结果进行转移的条件转移指令说明
指令 | 英文含义 | 中文含义 | 标志位 |
je | jump if equal | 等于则跳转 | ZF=1 |
jne | jump if not equal | 不等于则跳转 | ZF=0 |
jb | jump if below | 小于则跳转 | CF=1 |
jnb | jump if not below | 不小于则跳转 | CF=0 |
ja | jump if above | 大于则跳转 | CF=0且ZF=0 |
jna | jump if not above | 不大于则跳转 | CF=1或ZF=1 |
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论