我試圖從一些反編譯的彙編代碼放在一起C代碼,並有一個問題。我看到以下內容:反編譯彙編代碼
SUB_L10195A01:
...
call SUB_L1019CB90
db CCh; 'Œ'
SUB_L10026990:
push FFFFFFFFh
push L101EA0C5
什麼是
db CCh; 'Œ'
呢?通常有一個前
SUB_L10026990:
我試圖從一些反編譯的彙編代碼放在一起C代碼,並有一個問題。我看到以下內容:反編譯彙編代碼
SUB_L10195A01:
...
call SUB_L1019CB90
db CCh; 'Œ'
SUB_L10026990:
push FFFFFFFFh
push L101EA0C5
什麼是
db CCh; 'Œ'
呢?通常有一個前
SUB_L10026990:
retn
這是 '對' 什麼都沒有。編譯器假定被調用的函數永遠不會返回。
此外,您的反彙編程序知道這一點。代碼0CCh
解碼爲int 3
,這通常會停止您的程序並顯示錯誤。由於代碼之前的代碼永遠不會返回(或假設),因此操作碼不是列表的一部分,因此它被寫爲db 0CCh
而不是「指令int 3
」。
代碼本身與上面的例程無關。編譯器插入這個字節以確保(1)如果程序運行超出界限,它會遇到該命令然後暫停,以及(2)將下一個函數的第一個字節對齊(最有可能)是4的倍數,所以在執行速度上有一個小的但是實際的增益。
Harold剛剛回答 - CC是int3(調試中斷)。
db
彙編程序通常使用它來指定在「常規」彙編中添加的任意字節,反彙編程序在開始查看根本沒有意義的序列時將其作爲「最後手段工具」插入;在這裏我不知道爲什麼你的反彙編器在db
中插入cc
字節,因爲cc
是通常的int 3
操作碼(它通常用於分解調試器)。
編譯器經常爲了填充/對齊/調試目的而圍繞「常規」函數發送它們; int 3
的優點是在查看反彙編和十六進制內存視圖時很容易被發現,如果意外執行,則會陷入調試器中。在call
之後找到它的事實意味着call
意味着永不退貨(請考慮exit(1)
或abort()
或類似的東西);或者(但不太可能),它可能已被程序員故意添加(例如以Visual C++中的內部函數__debugbreak
的形式)。
CC是'int3'(調試中斷) – harold
順便說一下,我檢查確保CCh不是ret或它的任何變體.. – TomJeffries