反汇编调试死循环

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

波比源码 – 精品源码模版分享 | www.bobi11.com
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
7. 本站源码并不保证全部能正常使用,仅供有技术基础的人学习研究,请谨慎下载
8. 如遇到加密压缩包,请使用WINRAR解压,如遇到无法解压的请联系管理员!

波比源码 » 反汇编调试死循环

发表评论

Hi, 如果你对这款模板有疑问,可以跟我联系哦!

联系站长
赞助VIP 享更多特权,建议使用 QQ 登录
喜欢我嘛?喜欢就按“ctrl+D”收藏我吧!♡