X86架构CPU的状态标识位有以下的几个:

CF:反映无符号运算是否产生进位或借位,是则CF=1,否则CF=0。
PF:反映运算结果低8位中1的个数,1的个数为偶数,则PF=1,否则PF=0。
AF:在字节操作时低半字节向高半字节进位或借位时,字操作时低字节向高字节进位或借位时,AF=1,否则AF=0。
ZF:反映运算结果是否为0,结果为0时ZF=1,否则ZF=0。
SF:反映运算结果是否为负,结果为负时SF=1,否则SF=0。
OF:反映有符号运算结果是否溢出,结果溢出时OF=1,否则OF=0。
IF:中断标志。

CF 是对于无符号数来讲, 运算过程中(看的是运算过程, 不关心结果)如果有进位(Add)或有借位(Sub)则 CF=1, 否则CF=0
对于加法相信很好理解, 我们来看看减法:
label1: mov eax, 2
cmp eax, 5
jc label1
上面的示例中, cmp 执行的是 eax - 5, 因为eax < 5 所以需要借位, 于是CF=1 JC 满足跳转到label1
所以 cmp R1, R2 与 JC结合, 判断的是 R1 < R2, 与 JNC 结合 则是判断 R1 >= R2
C 在减法中表示的是 < 的满足,  减数 < 被减数 则 CF 置 1

OF 溢出标记把操作数以有符号数看待: OF=1或0,表示运算结果(看的是结果, 不关心过程)有无溢出。当算术运算的结果超出了带符号数的范围
(8位带符号数的范围是-128 ~ +127,16位的是-32768 ~ +32767, 32位为 -0x80000000 ~ 0x7FFFFFFF)
一个简单分辨OF的方法如下:
①加法
十进制角度,如果两有符号数相加,结果不在-2^(n-1)~2^(n-1)-1内,则OF=1,否则OF=0;
二进制角度,如果两有符号数同号,而相加结果与之异号,则OF=1,否则OF=0。

②减法
十进制角度,如果有符号数相减结果在-2^(n-1)~2^(n-1)-1内,则OF=1,否则OF=0;
二进制角度,如果两个数异号,而相减结果与被减数符号相反,则OF=1,否则OF=0。

我们以几个例子来说明一下OF标记的作用:

add   eax,ecx//eax=0xFFFFFFFF,ecx=0x00000001
结果 eax应该=0x100000000 肯定是容纳不下溢出了。
但实际并不是如此 即使如上计算OF任然是0  并未置1

add eax,ecx//eax=0x7FFFFFFF,ecx=0x00000001
结果 eax应该=0x80000000 eax绝对容纳得下这个数据。
但OF=1了;

SUB eax,ecx//eax=0x80000000,ecx=1;
结果 eax应该=0x7FFFFFFF eax容纳得下这个数据。
结果又 OF=1了;

总结规律的时候来了:

如果我们将 eax都当着有符号型的数来看 (最高位为符号位)
add   eax,ecx//eax=0x7FFFFFFF,ecx=0x00000001
这个 正数+正数=负数了!

SUB  eax,ecx//eax=0x80000000,ecx=1;
这个  负数-正数=正数了!

表示了计算结果不合常理了(溢出), 则OF=1

转载请注明转自: 听风 , 本文固定链接: ASM基础-汇编标识位