真值:十進制的,我們常說的數字,一般指不同進制對應的十進制數
原碼:把真值寫成二進制,有時還要根據數據的寬度補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位,調試時注意計算的代碼后面下斷點,找出寄存器的窗口,右鍵選擇“標志位”,自己比對就行。