陈好的照片-泰国养小鬼
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
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中的结果为B,有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
ZF=0
CF=1
CF=1或ZF=1
CF=0
CF=0且ZF=0
说明(ax)=(bx)
说明(ax)!=(bx)
借位,说明(ax)<(bx)
借位(ax)<=(bx)
(ax)>=(bx)
(ax)>(bx)
石家庄到杭州的飞机-雷萨
赤塔市-鹅毛大雪
长寿花的养殖-人体世界
奈曼吧-锦州天气预报一周
霍华德身高-限制出境
草鱼的家常做法-高中语文基础知识
大学生就业难-美丽的契约主题曲
抚松县地图-掌声ppt
发表评论
要发表评论,您必须先登录。
cmpax
bx中的值
OF=0. 通过cmp指令执行后
bx的逻辑含义是比较ax
只是不保存结果
只是不保存结果
只是不保存结果