锦衣卫迅雷下载:一步一步写算法(之函数堆栈显示)
来源:百度文库 编辑:中财网 时间:2024/04/28 02:00:37
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com 】
在继续图的讨论之前,我们今天开个小差,讨论一下函数堆栈的基本原理。有过编程经验的朋友都知道,堆栈调试是我们在程序开发中经常应用的一个功能。那么大家有没有想过,函数堆栈是怎么开始的啊?其实我们可以自己写一个函数堆栈输出函数分析一下。
因为一般来说,函数的压栈过程是这样的:
| 参数三 |
| 参数二 |
| 参数一 |
| address|
| ebp |
| variable | <--------------------------------- ebp
那么堆栈中的内容是怎么打印的呢?
view plaincopy to clipboardprint?
- void stack_print()
- {
- int var_ebp;
- __asm mov var_ebp, ebp;
- printf("%08x\n", *((int*)(var_ebp) + 1));
- }
view plaincopy to clipboardprint?
- 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)堆栈原理十分重要,朋友们应该好好了解一下。
C语言实现汉诺塔的移动的程序,要求动态显示塔的移动,算法和堆栈设计
写一个从散列表中删除一个关键码k的算法,散列函数为H(k),用分离的同义词子表法解决碰撞。
写一个从散列表中删除一个关键码k的算法,散列函数为H(k),用分离的同义词子表法解决碰撞。
随机函数random()的算法?
关于函数声明编写算法
有冒泡算法,怎样用主函数调用
怎样用最佳适应算法实现malloc函数
怎样才能把算法写好啊?
写者问题的算法
如何一步一步的提高写公文材料的水平?
写一个主函数
VB(自我嵌套)(堆栈空间溢出)问题
补充:VB(自我嵌套)(堆栈空间溢出)问题
请教检测局域网的误码率的算法和函数,最好提供具体程序以供参考(delphi),不胜感激
++求解++~火车入站出站(模拟堆栈)
什么是堆栈
什么是堆栈
交换机堆栈
交换机堆栈
有关堆栈
about:堆栈
“堆栈”是什么意思?
什么是堆栈??
编写判断一个字符序列是否是回文的函数,要求只使用堆栈,不使用队列