在 《C圈套與缺點(diǎn)》中,出現(xiàn)以下的代碼:
作者的解釋是:如果用來編譯這段程序的編譯器依照內(nèi)存地址遞減的方式來給變量分配內(nèi)存,那末最后將賦值給變量 i ,墮入死循環(huán)。
將程序在VC6.0 運(yùn)行,查看反匯編代碼:
從結(jié)果中,可知內(nèi)存的分配結(jié)果是依照地址遞減的方式給變量分配內(nèi)存的:
結(jié)果中,a[i] = 0 的反匯編代碼是 mov dword ptr [ebp+ecx*4⑵Ch], 0
其中 ecx 是 i 的數(shù)值,ebp - 2CH = ebp - 44, 實(shí)際上就是 a[0] 的位置, i 占4個字節(jié),a[10]占40個字節(jié), 共44個字節(jié)。
mov dword ptr [ebp+ecx*4⑵Ch], 0 也即是 mov dword ptr [ebp⑵Ch+ecx*4], 0
就是在a[0] 的地址上,每次加上 i 個單位的整數(shù)地址(4個字節(jié))
當(dāng)最后1個數(shù)值 i = 10 的時候, 變成了 mov dword ptr [ebp - 4], 0, 實(shí)際上就是給 i 賦值,這條語句就是第1個斷點(diǎn)位置的反匯編代碼,自然的,i 又被重新賦值為0, 墮入了死循環(huán)。
這是自己第1次使用反匯編來調(diào)試程序,簡單記錄 。