如下6个状态标志位
1)O标志(溢出标志) (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
2) P
标志(奇偶标志)(Parity Flag)
如果指令的结果用二进制表示,该二进制数中的的 1 的总个数为偶数时,P 标志被设置1。例 如:1010,1100,1111000.
3) Z 标志(零标志)(Zero Flag)
当运算产生的结果为 0 时被设置。
ADD EAX,1 先设置 EAX 的 值为 FFFFFFFF,即十进制-1,运行指令 ADD EAX,1 使,结果为-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