80X86标志寄存器及比较和跳转指令 zf pf sf cf of df cmp je jne jb jnb ja jna

来源:互联网 发布:rete算法源码 编辑:程序博客网 时间:2024/06/06 21:52

目录(?)[-]

  1. 标志寄存器
    1. ZF
      1. ZFZero Flag
    2. PF
      1. PFParity Flag
    3. SF
      1. SFSign Flage
    4. CF
      1. CFCarry Flage
    5. OF
      1. OFOver Flage
    6. DF
      1. DFDirection Flage
    7. 比较指令cmp
    8. 条件跳转指令

标志寄存器

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(ax)<(bx)


条件跳转指令

跳转指令一般和cmp指令配合使用,cmp指令修改标志位,跳转指令检测相关的标志位,根据检测结果来决定是否修改IP寄存器从而实现跳转。
由于可以根据需要把cmp指令看作两种比较:无符号数比较和有符号数比较,所以根据cmp指令的比较结果进行比较的指令也分为两种:
1、根据无符号数的比较结果进行跳转的指令,检测ZF和CF标志位;
2、根据有符号数的比较结果进行跳转的指令,检测ZF、SF和OF标志位。

下面是一些缩写字母说明
jjump跳转eequal等于nenot  equal不等于bbelow小于nbnot below不小于aabove大于nanot above不大于
下面是常用的根据无符号数的比较结果进行转移的条件转移指令说明
指令英文含义中文含义标志位jejump if equal等于则跳转ZF=1jnejump if not equal不等于则跳转ZF=0jbjump if below小于则跳转CF=1jnbjump if not below不小于则跳转CF=0jajump if above大于则跳转CF=0且ZF=0jnajump if not above不大于则跳转CF=1或ZF=1



参考 王爽 《汇编语言》第2版 清华大学出版社
原创粉丝点击