zoukankan      html  css  js  c++  java
  • 汇编语言常用的标志寄存器

    如下6个状态标志位

     1O标志(溢出标志) (OverFlow Flag)

    O标志表示溢出。溢出位是用来表示带符号数的运算结果超出有限字长的表示范围的标志。它是根据两个操作数的符号及其变化来设置的。如两个操作数符号相同而运算结果的符号与之相反时 则O标志=1,反之,O标志=0。 如果两个符号相反的数 相加 不可能出现溢出

    在32位汇编中  十六进制的2位 表示1byte   32位=8位十六进制的值

    正数 0-7FFFFFFF 负数 80000000-FFFFFFFF(-1)

    假设 EAX 的值改为 7FFFFFFF,即最大的正数。现在使其加 1 inc EAX,其和将超过最大正数,80000000对应的是一个负数

    执行后  O标志被设置为 1


      2P 标志(奇偶标志)(Parity Flag)

    如果指令的结果用二进制表示,该二进制数中的的 1 的总个数为偶数时,P 标志被设置1。例 如:101011001111000.


    3) 标志(零标志)(Zero Flag)

    当运算产生的结果为 时被设置。

    ADD EAX1     先设置 EAX 的 值为 FFFFFFFF,即十进制-1,运行指令 ADD EAX使,结果为-1+1,等于 0

    Z标志被设置1。

    4)S标志(符号标志)(Sign Flag)

    这个标志在运算结果为负时设置为 1

    设置 mov EAX,FFFFFFF8   如果 inc,1 执行了运算并且结果是负数  S标志被设置了1  

       5)C 标志进位标志(Carry Flag)

      Cy位是进位位,用来表示本次无符号数运算结果的溢出溢出。由于无符号数的最高有效位只有数位意义而无符号意义,所以该位所产生的进位应该是本次运算结果的实际进位值。所以说:进位位Cy是在给定二进制数的位数范围内,代表了本次运算结果的溢出情况。另一方面,它所保存的进位值有时也是有用的。例如,双字长运算时,可以利用进位值把低位字的进位计入高位字。

    无符号运算的结果)在超过最大数值时设置,可能是寄存器的值,例如,将EAX设为

    FFFFFFFF,然后加 1,我们会看到,进位标志位设为1.   因为FFFFFFFF 已经是最大的8位16进制 在加1 超过了eax的最大值

    比如 al是 0BBH 加入 0BBH =176 超过了al的1byte的限制 所有CF标志为1

    6)A标志 辅助进位标志(Auxiliary Flag)

    49H + 6DH=B6H,D3有进位:AF = 1
    1001001+
    1101101=

    这里2进制中D3位也就是右边倒数第4位因为从0开始 也叫做低半字节 两个1 所以进位

    这里详细解释下 C和O的区别

    什么是位:33-16 个位减个位,十位减十位,3-6不够,那就要向十位的3借1
    什么是位:再如16+17 个位回个位,十位加十位,6+7达上10了就要向十位进1


    比如 用字节来说明 

    比如 无符号位 也就是没有负数  

    最大的无符号 数 就是  11111111=2的8次方 等于256 最小的为00000000 等于0

    比如 按无符号数来相加

    00001001+

    01111000=10000001 

    这里计算的结果为10000001 对于无符号来说 是 129小于256 没有进位 c标志0 

    如果 11111111+1 结果变成 100000000 超过了1byte的8位 此时第9位被剔除  结果变成了0  这里第八位已经满2进1

    了 这就表示 进位到 超过了 1byte的8位此时 就表示进位异常  c标志为1

    还有借位出现异常情况下 c标志也会被置为1

    减法 2-4

    00000010-00000100 第三位为0不够减去1 往上借1位 一直到 第8位都没借到 所以 出现借位异常   c标志1

    但是按照有符号来相加 最高位是符号位 0表示正数  最高位 为1 表示负数 (参考原码和补码 http://blog.csdn.net/liaomin416100569/article/details/7332897)

    最大的数为 127 和最小数为 -128


     这里最高位 第8位是符号位 下面例子 第8位为0 表示两个正数相加

    (+)00001001+

    (+)01111000=10000001 

    这里 两个正数相加后 最高位变成了 1 也就是变成了一个负数  此时 o标志1 表示溢出了



    进位C和溢出O更详细区别 参考 http://blog.csdn.net/liaomin416100569/article/details/45166085

  • 相关阅读:
    grails框架中在使用domain的save方法保存时保存不成功
    模块的循环导入问题、包、json与pickle模块、time与datetime模块、random模块
    模块
    迭代器、生成器、函数的递归调用、二分法
    叠加多个装饰器、有参装饰器、三元表达式、列表生成式、字典生成式、匿名函数
    函数、名称空间与作用域、闭包函数、装饰器
    函数详解
    文件处理
    字符编码
    列表、元祖、字典、集合
  • 原文地址:https://www.cnblogs.com/liaomin416100569/p/9331280.html
Copyright © 2011-2022 走看看