汇编之标志寄存器(flag)——EFL

标志寄存器是按位起作用的,也就是说,它的每一位都有专门的含义,记录特定的信息。

如一个flag寄存器为:

   0000 0206    (16进制)

拆成(2进制):

  0000 0000 0000 0000 0000 0010 0000 0110

(1)CF位(第0位——Carry flag)

作用:若(无符号数)算数操作产生的结果在最高有效位发生进位或借位则将其置1,反之清零。

  这个标志通常用来指示无符号整型运算的溢出状态。

运算相关的指令都会影响到标志寄存器。

例:在AL中执行加法,且超出FF。

执行前:

  

执行结束:

  

(2)PF位/奇偶校验位(第二位)

    如果结果的最低有效字节包含偶数个1位则该位置1,否则清零

  例: 0000 0001 0001 1000   :最低有效字节(即最后一个字节,最后8个二进制数)有2个1,是偶数个,此时PF位就是1

 PF位的作用:

  

(3)AF位:

  主要在BCD运算中

(4)ZF位(Zero flag)——使用较多

  若结果为0则将其置1,反之置零。

  经常与CMP或者TEST等指令一起用

例:

  (1)判断两个值是否相等:  

      使用SUB EAX,ECX用于判断EAX和ECX的值是否相等,但是使用SUB的话,EAX的值会被改成相减的结果

      可以使用CMP指令:CMP指令相当于SUB,但是相减的结果并不会保存到第一个操作数中

  (2)判断某个值是否为0

      如使用 AND EAX,EAX 0——>ZF=1

      又或者使用TEST指令(TEST指令比较的结果并不会保存到第一个操作数中)

(5)SF位(Sign flag)

  设置有符号整型的最高有效位——0表示为正,1表示为负

  作用:看一个运算结束的SF位即可判断结果是正的还是负的

(6)OF位(Overflow flag)

  溢出标志OF用于反映有符号数加减运算所得结果是否溢出

可以理解为:

  无符号数运算,是否溢出看CF位

  有符号数运算,是否溢出看OF位

(7)DF位/方向位(第十位):

第10位从下标开始算:

  0000 0000 0000 0000 0000 0010 0000 0110

DF位如果是0的时候,每次执行完MOVS指令后,ESI和EDI的地址都会发生变化。

当DF位是0的时候,ESI和EDI的值都会  +1或者+2或者+4(加几取决于移动了1、2、4个字节)
当DF位是1的时候,ESI和EDI的值都会  -1或者-2或者-4(加几取决于移动了-1、-2、-4个字节)

 Debug工具中双击D即可修改:

例:MOVS指令复制内容:MOVS DWORD PTR ES:[EDI],DWORD PTR DS:[ESI]

正常执行结束,ESI和EDI的值应该变成98和78

ESI和EDI存的地址:,且DF位设置为1。正

ESI&EDI存的地址的值:

F8执行完结果:可见94位置的数据两个字的数据已经被全数复制到了74位置。

这时再看ESI和EDI的变化:,原本的94和74已经变成了90和70。两个的值都向后退了4位。

Published by

风君子

独自遨游何稽首 揭天掀地慰生平

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注