国内最全IT社区平台 联系我们 | 收藏本站
华晨云阿里云优惠2
您当前位置:首页 > php开源 > php教程 > 反汇编调试死循环

反汇编调试死循环

来源:程序员人生   发布时间:2015-01-15 08:29:47 阅读次数:2734次

在 《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次使用反汇编来调试程序,简单记录 。


生活不易,码农辛苦
如果您觉得本网站对您的学习有所帮助,可以手机扫描二维码进行捐赠
程序员人生
------分隔线----------------------------
分享到:
------分隔线----------------------------
关闭
程序员人生