逆向 1 彙編 0x02 原碼補碼反碼

2021-10-01 17:10:44 字數 1774 閱讀 8435

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 判...