1. 程式人生 > >for 循環的反匯編淺析

for 循環的反匯編淺析

olly 還需 title 十六 執行 cmp eight base sub

for 循環

for 循環是使用頻度最高的循環結構,我們通過 C 語言反匯編實例,來分析 for 循環結構在計算機底層的原理和構造。首先,我們編寫一個簡單的 for 循環:

技術分享圖片

為了方便觀察,我們用十六進制來表示循環變量,編譯後,我們用 OllyDBG 載入,我們可以看到對應的反匯編代碼。

禁用優化的情景

這裏的“push ecx”相當於“sub esp, 4”,為 i 變量分配空間。接著,i 被賦值成 0,並且跳轉到 004095C6 處,剛好此處是一條 cmp 指令,與 baseline 條件值(此處是 0x10)進行比較,如果大於等於則跳出循環,否則,程序會接著往下執行,執行完 printf,就會跳轉到 004095BD 處,這時將進行循環的變量的自增。如此往復直到 JGE 跳轉成立。

技術分享圖片

最小化大小的情景

當編譯器使用最小化大小(O1)編譯優化選項時,for 循環將產生體積更小更精簡的機器代碼。如下圖所示:

技術分享圖片

我們會發現有許多與前者不相同的地方,比如循環變量在此情景中變成了 ESI 寄存器,JGE 變成了 JL。

最大化速度的情景

當編譯器使用最大化速度(O2)編譯優化選項時,for 循環將產生更加高效的機器代碼。如下圖所示:

技術分享圖片

存在的諸多細微的差異,還需自己深入慢慢體會。

for 循環的反匯編淺析