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