OF和CF标志位
真值:十进制的,我们常说的数字,一般指不同进制对应的十进制数
原码:把真值写成二进制,有时还要根据数据的宽度补0,原码没有负数的概念,不能表示负数
反码:正数的反码等于它的原码,负数的反码:先写出正数的原码,然后按位取反,最高位置1
补码:正数的补码等于它的原码,负数的补码等于它的反码+1,具体下面会说
有符号数:一个数的二进制表示形式(无论原码/反码/补码)的首位为符号位,0表示正数,1表示负数,后面那些位表示数值
无符号数:一个数的所有位数都表示数值的大小,这个数默认是正数
有符号数和无符号数的区别:有符号数少了用来表示数值的一位,多了表示正负的一位,少表示了一半的正数,多表示了一半的负数,无符号数则可以表示整个数据宽度范围内的正数。另外,也产生了分别计算有符号数和无符号数的汇编指令
有符号数和无符号数怎么判断?
比如,一个数0xFFFF FFFF,不给你指令你知道这是什么类型数吗?这个数是几吗?
它可能是个无符号数,代表4,294,967,295
也可能是个有符号数,代表-1,
甚至可能是个有符号数,但是下一刻就会被当成无符号数进行计算,
所以不给指令你不知道这个数是几,你只知道这是个补码。
这个数是有符号数还是无符号数是由汇编指令决定的,指令的理解方式不同,这个数代表的含义不同。数就摆在那里,看你怎么操作了。
OF、CF和进位、溢出是分不开的。
(钱林松老师的《C++反汇编与逆向分析技术揭秘》)
有符号数或者无符号数的计算都可能引起CF和OF的变化,
但是,对于有符号数来说,CF的变化没有意义,对于无符号数来说,OF的变化也没有意义,有没有意义是对整体的代码来说的,
CF可以看作结果的bit33
(1)
无符号数相加,结果为0x8000 0000,bit32为1,OF=1,bit33为0,CF为0
(2)
无符号数相加,结果为0x0000 0000,bit32为1,OF为0,bit33为1,CF为1
(3)
有符号数相加,结果为0x8000 0000,bit32为1,OF为1,bit33为0,CF为0
(4)
有符号数相加,结果为0xffff fffe,bit32为1,OF为0,bit33为1,CF为1
所以,你可以说结果的bit33和CF的值相同,但你不能说结果的bit32和OF的值相同,原因可能是因为加法器的设计使得有符号数做加法时并不是简单的二进制进位,可能会对OF的信号进行处理。(我猜的)
上面用加法举了OF和CF变化的例子,如果想要看减法,乘除等计算的OF和CF变化,可以自己动手写代码,
我当时学汇编的时候都不知道VS2019可以看内存数据、汇编代码和寄存器信息,直到后来学逆向才知道IDE为什么叫IDE
上面用的环境是VS2019,里面的int类型变量是32位,调试时注意计算的代码后面下断点,找出寄存器的窗口,右键选择“标志位”,自己比对就行。