0x00 有符號數 - 負數
最高位為1,代表負數
除去最高位剩餘位以無符號數解析,符號為負 -> 原碼
計算機以補碼儲存有符號數
0x01 原碼
最高位為符號位,其餘位為數值
0 001 0011 -> 0x13 -> 19
1 001 0011 -> -0x13 -> -19
0x02 反碼
正數的反碼是原碼
負數反碼 -> 最高位不變,其餘取反
1 001 0011
1 110 1100 -> 反碼
----------
0xec
0x03 補碼
正數的補碼是原碼
負數補碼 -> 負數反碼+1
1 110 1100 -> 反碼
1 110 1101 -> 補碼
----------
0xed
-19 -> 原碼 0x13 -> 反碼 0xec -> 補碼 0xed
以上補碼反碼以8bit為例
0x04 總結
原碼、反碼、補碼針對有符號數,且針對的是負數
正數的反碼、補碼都是其原碼本身
原碼是人類理解的有符號數形式
反碼是原碼轉為補碼的中間碼
補碼是有符號數最終儲存在計算機內的形式
個人理解:
以8位暫存器為例
0xff + 1 = 0 -> 0 - 1 = 0xff (借位)
看成有符號數則 0xff 對應 -1 ,因為我們的認知中 -1 + 1 = 0, 0 - 1 = -1
0xed + 19 = 0 -> 0 - 19 = 0xed (借位)
看成有符號數則 0xed 對應 -19
以16位暫存器為例
0xffff + 1 = 0 -> 0 - 1 = 0xffff (借位)
看成有符號數則 0xffff 對應 -1
以32位暫存器為例
0xffffffff + 1 = 0 -> 0 - 1 = 0xffffffff (借位)
看成有符號數則 0xffffffff 對應 -1
通過以上規律計算-5
8位 -5 = 0 - 5 = 0xfb
16位 -5 = 0 - 5 = 0xfffb
32位 -5 = 0 - 5 = 0xfffffffb
負數即小於0的數,向0後面數數,根據以上規則可知0向後數1則變為了1111 1111 ...,最高位0 1則為邊界
計算機對於負數的理解就是我們所說的補碼.原碼只是為了方便我們人類閱讀
0xfb -> 1111 1011 -> 1111 1010 -> 1 000 0101 -> -5 補碼轉原碼
加減法也就是從這個數開始向前或向後數數.所以減去乙個數,也可以看成負數加上幾個數,因為是相對的
1 - 2 = -2 + 1 = fe(0向後數2個數) + 1 = ff(fe向前數乙個數) = -1
出現這種情況的原因是受到了資料寬度的制約,其實是硬體約束
最高位0 1為正負數邊界,計算機本身就以補碼來儲存負數,原碼只是為了方便人類閱讀
計算機以指定的資料寬度儲存0、1, 如何看待儲存的0、1由使用者來定義.可以將其看為有符號/無符號數、文字檔案、音訊檔案等等
計算機不識別正負數,由於受到資料寬度的制約,比0小的數則從ffff(16位)開始,這樣可以看成ffff表示-1,但人類看起來不是很直觀,於是原碼、反碼、補碼便出現,將補碼轉為原碼便於人類理解
有不對的地方,請各位大佬指點
逆向工程 0x02
常用的彙編指令 指令示例 含義說明 movmov eax,ecx eax ecx 將ecx的值存入eax addadd eax,ecx eax ecx 將eax的值加上ecx的值 subsub eax,ecx eax ecx 將eax的值減去ecx的值 incinc eax eax 將eax的值加1...
逆向 1 彙編 0x09 JCC
0x00 常用標誌位 狀態標誌 位 標誌 含義 通途 0 cf 進製標誌 無符號數最高位進製 借位 進製 借位 1 2 pf 奇偶標誌 常用於資料傳遞,奇偶校驗 最低位元組偶數個1 1 4 af 輔助進製 bcd算術運算中使用 算術操作結果第三位進製 借位 1 6 zf 0標誌 常與cmp test...
逆向 1 彙編 0x04 加減乘除
0x00 加法運算 4 50000 0100 0000 0101 xor 0000 0001 沒有進製的結果 0000 0100 0000 0101 and 0000 0100 不為0,有進製 1 0000 1000 進製值 0000 0001 沒有進製的結果 0000 1000 進製值 xor 判...