反彙編學習之整數型別

2021-06-22 08:58:26 字數 1774 閱讀 1013

c++提供的整數型別包括short、int和long,每種型別都分為有符號和無符號兩種型別,在筆者另一篇文章中敘述過,在不同的編譯器下實現不同,三種型別在記憶體中所佔的大小也不統一。在vc和gcc下,short佔2位元組,int佔4位元組,long佔4位元組,long long佔8位元組。下面的講解中都以用得較多的int型別為例。

1.  無符號整數

unsigned int在記憶體中佔4位元組,並且所有的32位都用來表示數值,可以表示的範圍為0x00000000~0xffffffff,也就是0~4294967295。可以表示的正數範圍為有符號數的兩倍,當無符號數不足32位時,高位補0。

計算機儲存的單位是位元組,這四個位元組在記憶體中如何存放就有兩種方法了,也就是常聽到的大端和小端的概念了,即big-endian和little-endian(endian意思為位元組儲存次序)。小端模式即低位資料排在低端,高位資料排在高階,大端即相反。對於0x12345678來說,從記憶體位址0x40000000開始存,如果是小端模式,則從0x40000000~0x40000003四個位址分別為78、56、34、12,大端模式的話,為12、34、56、78。記憶體位址是從低到高的,大端就是大的(即高位)在最頭面,小端即小的(即低位)在最頭面。

int main(void)

檢視i的記憶體空間有如下顯示:

可以看到i從0x28ff1c單元開始存放,為小端模式。

2. 有符號整數

有符號整數用最高位表示符號,0為正數,1為負數。因為最高位不能表示數值,所以表示整數的範圍為0x80000000~0x7fffffff,即-2147483648~2147483647,正數的表示區間為0x00000000~0x7fffffff,負數的表示區間為0x80000000~0xffffffff。看到這裡,你可能會產生疑惑正數範圍還好說,負數就有點看不懂了。下面先來複習一下原碼、反碼和補碼的知識,上面的負數範圍就很好理解了。

因為計算機只會做加法,所以需要把減法轉換為加法,至於為什麼計算機只會做加法,沒有查到權威的解釋,意思就是所有的運算都轉換為加法再計算。

負數在記憶體中都是以補碼形式存放的,補碼的規則是對這個數值取反加1。對於任何4位元組的數值x,都有x + x(反)= 0xffffffff,於是x + x(反) + 1 = 0,x = -(x(反) +1)。對於0xffffffff,取反後為0x00000000,加1再乘以-1後為-1。對於0x80000000,可以表達的意義可以是負數0,也可以是0x80000001減去1,由於0的正負值相等,沒有必要再來負數0,所以規定為0x80000001(-2147483647)減去1,這樣0x8000000也就成為4位元組負數的最小值。這就是為什麼有符號整數的取值範圍中,負數總比整數多乙個最小值的原因。

補碼也定義為用0減去這個數的絕對值,即x(絕對值) + x(補碼) = 0, 對於-1,補碼為0 - 1,即0xffffffff + 0x00000001 = 0,所以-1的補碼為0xffffffff。

3. 總結

在對整數的記憶體進行分析時,只通過記憶體中的數值是不能夠判斷是有符號還是無符號數,需要檢視指令或者已知函式如何操作此記憶體位址,根據操作方式或函式相關定義得出該位址的資料型別,如api呼叫messagebox,它有4個引數,檢視幫助得知,第四個引數為乙個無符號整數,從而再進行數值的分析。

彙編與反彙編之小技巧

大家都知道,對於位於當前除錯目標中的指令,可以使用windbg的u命令進行反彙編。u命令的引數是要反彙編 的位址值或者符號,如果不指定,那麼windbg會使用當前程式指標暫存器所指向的 例如 0 001 u ntdll dbgbreakpoint 7c901230 cc int 3 7c901231...

反彙編學習日記2010 11 14

昨天的第乙個例子是 windows api 這本書裡的,天書夜談 第一章講的是彙編指令與c語言。這是一本好書!乙個最簡單的c程式反彙編後會是什麼樣子呢?debug和release的區別是編譯出來的彙編 是不一樣的。一些彙編小知識 call的本質是push jmp,ret本質是pop jmp xor ...

學習筆記 2011 07 03 反彙編

include using namespace std int main 00c514e6 jmp main 27h 0c514a7h int a 0 00c514e8 mov dword ptr a 0 return 0 00c514ef xor eax,eax 00c514f1 pop edi ...