OF和CF标志位

相关概念

OF和CF的判断

OF和CF的例子

总结

 

几个概念:

真值:十进制的,我们常说的数字,一般指不同进制对应的十进制数

原码:把真值写成二进制,有时还要根据数据的宽度补0,原码没有负数的概念,不能表示负数

反码:正数的反码等于它的原码,负数的反码:先写出正数的原码,然后按位取反,最高位置1

补码:正数的补码等于它的原码,负数的补码等于它的反码+1,具体下面会说

有符号数:一个数的二进制表示形式(无论原码/反码/补码)的首位为符号位,0表示正数,1表示负数,后面那些位表示数值

无符号数:一个数的所有位数都表示数值的大小,这个数默认是正数

有符号数和无符号数的区别:有符号数少了用来表示数值的一位,多了表示正负的一位,少表示了一半的正数,多表示了一半的负数,无符号数则可以表示整个数据宽度范围内的正数。另外,也产生了分别计算有符号数和无符号数的汇编指令

 

有符号数和无符号数怎么判断?

比如,一个数0xFFFF FFFF,不给你指令你知道这是什么类型数吗?这个数是几吗?

它可能是个无符号数,代表4,294,967,295

也可能是个有符号数,代表-1,

甚至可能是个有符号数,但是下一刻就会被当成无符号数进行计算,

所以不给指令你不知道这个数是几,你只知道这是个补码。

这个数是有符号数还是无符号数是由汇编指令决定的,指令的理解方式不同,这个数代表的含义不同。数就摆在那里,看你怎么操作了。

 

关于OF和CF标志位

OF、CF和进位、溢出是分不开的。

OF和CF标志位

 (钱林松老师的《C++反汇编与逆向分析技术揭秘》)

 

有符号数或者无符号数的计算都可能引起CF和OF的变化,

但是,对于有符号数来说,CF的变化没有意义,对于无符号数来说,OF的变化也没有意义,有没有意义是对整体的代码来说的,

如果你只是想知道计算时OF和CF的变化情况,看下面的例子

 

OF和CF标志位

 

 CF可以看作结果的bit33

(1)

OF和CF标志位

 

OF和CF标志位

无符号数相加,结果为0x8000 0000,bit32为1,OF=1,bit33为0,CF为0

 

 

(2)

OF和CF标志位

 

 OF和CF标志位

无符号数相加,结果为0x0000 0000,bit32为1,OF为0,bit33为1,CF为1

 

(3)

OF和CF标志位

 

 OF和CF标志位

 

 有符号数相加,结果为0x8000 0000,bit32为1,OF为1,bit33为0,CF为0

 

(4)

OF和CF标志位

 

 OF和CF标志位

 

 有符号数相加,结果为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位,调试时注意计算的代码后面下断点,找出寄存器的窗口,右键选择“标志位”,自己比对就行。

OF和CF标志位

 

原文链接: https://www.cnblogs.com/lylhome/p/13272288.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍;

也有高质量的技术群,里面有嵌入式、搜广推等BAT大佬

    OF和CF标志位

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/364395

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年3月2日 下午3:33
下一篇 2023年3月2日 下午3:33

相关推荐