一步一步写算法(之函数堆栈显示)

【 声明:版权所有,欢迎转载,请勿用于商业用途。  联系信箱:feixiaoxing @163.com 】


    在继续图的讨论之前,我们今天开个小差,讨论一下函数堆栈的基本原理。有过编程经验的朋友都知道,堆栈调试是我们在程序开发中经常应用的一个功能。那么大家有没有想过,函数堆栈是怎么开始的啊?其实我们可以自己写一个函数堆栈输出函数分析一下。

    因为一般来说,函数的压栈过程是这样的:

              |    参数三  |

              |    参数二  |

              |    参数一  |

              |   address|

              |      ebp     |

              |   variable |     <--------------------------------- ebp

      那么堆栈中的内容是怎么打印的呢?

void stack_print()
{
	int var_ebp;

	__asm mov var_ebp, ebp;

	printf("%08x\n", *((int*)(var_ebp) + 1));
}
    上面的代码只是打印当前函数的返回地址,那么如果是连续的函数打印呢?打印到main函数开始呢。

void stack_print()
{
	int var_ebp;
	
	__asm mov var_ebp, ebp;

	do{
        printf("%08x\n", *((int*)(var_ebp) + 1));
        var_ebp = *(int*)(var_ebp);

	}while(var_ebp != 0x0);
}
    上面的代码可看到一对地址,那么怎么把这些地址和函数名称对应起来了,那就只能查表了。函数对应的表在哪里呢?不着急,看了下面的一个截图,朋友们就明白怎么回事了。

                                   

    大家这样在VC编译的时候把Generate mapfile选上,就可以生成对应的*.map文件了。文件中包含了当前文件中主要函数的起始地址,而且是按照从低到高依次排序的。所以只要寻找到对应的函数起始,判断我们的函数返回地址是不是在这个函数中间,那么就可以找到对应的函数名称了。


总结:

    (1)今天总结了一下函数堆栈显示的基本原理;

    (2)知道函数的基本原理之后,方便我们从本质上理解很多问题。即使很多CPU的处理方式和X86不同,我们也可以通过类似的方法快速掌握;

    (3)堆栈原理十分重要,朋友们应该好好了解一下。



  • 6
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 9
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嵌入式-老费

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值