码迷,mamicode.com
首页 > 其他好文 > 详细

反汇编调试死循环

时间:2015-01-02 11:03:28      阅读:150      评论:0      收藏:0      [点我收藏+]

标签:c语言   调试   反汇编   

在 《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-2Ch], 0

其中 ecx 是 i 的数值,ebp - 2CH  = ebp - 44, 实际上就是 a[0] 的位置, i 占4个字节,a[10]占40个字节, 共44个字节。

mov  dword ptr [ebp+ecx*4-2Ch], 0 也即是 mov  dword ptr [ebp-2Ch+ecx*4], 0  

就是在a[0] 的地址上,每次加上 i 个单位的整数地址(4个字节)

当最后一个数值 i = 10 的时候, 变成了 mov dword ptr [ebp - 4], 0, 实际上就是给 i 赋值,这条语句就是第一个断点位置的反汇编代码,自然的,i 又被重新赋值为0, 陷入了死循环。


这是自己第一次使用反汇编来调试程序,简单记录 。


反汇编调试死循环

标签:c语言   调试   反汇编   

原文地址:http://blog.csdn.net/core__code/article/details/42339661

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!