程序员人生 网站导航

反汇编调试死循环

栏目:php教程时间:2015-01-15 08:29:47

在 《C圈套与缺点》中,出现以下的代码:

#include <stdio.h> int main(int argc, char *argv[]) { int i = 0; int a[10]; for(i=0; i<=10; ++i) { a[i] = 0; // 死循环 } return 0; }

作者的解释是:如果用来编译这段程序的编译器依照内存地址递减的方式来给变量分配内存,那末最后将赋值给变量 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次使用反汇编来调试程序,简单记录 。


------分隔线----------------------------
------分隔线----------------------------

最新技术推荐