2015-09-23 308 views
-1

我試圖從一些反編譯的彙編代碼放在一起C代碼,並有一個問題。我看到以下內容:反編譯彙編代碼

SUB_L10195A01: 
    ... 
    call SUB_L1019CB90 
    db CCh; 'Œ' 

SUB_L10026990: 
    push FFFFFFFFh 
    push L101EA0C5 

什麼是

db CCh; 'Œ' 

呢?通常有一個前

SUB_L10026990: 
+2

CC是'int3'(調試中斷) – harold

+0

順便說一下,我檢查確保CCh不是ret或它的任何變體.. – TomJeffries

回答

3

retn

這是 '對' 什麼都沒有。編譯器假定被調用的函數永遠不會返回。

此外,您的反彙編程序知道這一點。代碼0CCh解碼爲int 3,這通常會停止您的程序並顯示錯誤。由於代碼之前的代碼永遠不會返回(或假設),因此操作碼不是列表的一部分,因此它被寫爲db 0CCh而不是「指令int 3」。

代碼本身與上面的例程無關。編譯器插入這個字節以確保(1)如果程序運行超出界限,它會遇到該命令然後暫停,以及(2)將下一個函數的第一個字節對齊(最有可能)是4的倍數,所以在執行速度上有一個小的但是實際的增益。

0

Harold剛剛回答 - CC是int3(調試中斷)。

4

db彙編程序通常使用它來指定在「常規」彙編中添加的任意字節,反彙編程序在開始查看根本沒有意義的序列時將其作爲「最後手段工具」插入;在這裏我不知道爲什麼你的反彙編器在db中插入cc字節,因爲cc是通常的int 3操作碼(它通常用於分解調試器)。

編譯器經常爲了填充/對齊/調試目的而圍繞「常規」函數發送它們; int 3的優點是在查看反彙編和十六進制內存視圖時很容易被發現,如果意外執行,則會陷入調試器中。在call之後找到它的事實意味着call意味着永不退貨(請考慮exit(1)abort()或類似的東西);或者(但不太可能),它可能已被程序員故意添加(例如以Visual C++中的內部函數__debugbreak的形式)。