zoukankan      html  css  js  c++  java
  • 汇编之标志寄存器(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位。

  • 相关阅读:
    PhotoshopCS6中文版图像处理实战从入门到精通
    Web安全开发指南
    OpenStack运维指南
    Word/Excel/PPT 2016高效办公实战从入门到精通
    UG NX 8.5中文版基础教程
    Moldflow 2018模流分析从入门到精通:升级版
    数据库与数据处理:Access 2010实现
    iOS开发网络数据之AFNetworking使用1
    AFNetworking2.5使用2
    iOS项目的完整重命名方法图文教程
  • 原文地址:https://www.cnblogs.com/codexlx/p/13245935.html
Copyright © 2011-2022 走看看