`
javasee
  • 浏览: 926338 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

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

 
阅读更多

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


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

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

| 参数三 |

| 参数二 |

| 参数一 |

| address|

| ebp |

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

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

上面的代码只是打印当前函数的返回地址,那么如果是连续的函数打印呢?打印到main函数开始呢。

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


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


总结:

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

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

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



分享到:
评论

相关推荐

    堆栈之科学计算器算法

    堆栈 科学计算器 笔记

    C通过运行时堆栈支持递归函数的实现。递归函数就是直接或间接调用自身的函数。

    C通过运行时堆栈支持递归函数的实现。递归函数就是直接或间接调用自身的函数。 许多教科书都把计算机阶乘和菲波那契数列用来说明递归,非常不幸我们可爱的著名的老潭老师的《C语言程序设计》一书中就是从阶乘的计算...

    自适应积分算法,用于对函数积分

    自适应积分算法,适用于对函数的积分。对在不同区间变化趋势不同的函数进行积分。算法收敛迅速。占用的程序空间很小。对数组的操作采用了堆栈的思想。C语言实现,易于在DSP,ARM,单片机上移植

    操作系统 C++ 页面置换算法(含实验报告)有opt,LRU,先进先出,时钟算法,改进的时钟算法等所有算法

    整个过程,都是使用数组来实现每个算法,模拟队列,模拟堆栈的功能,实现每一个置换算法。 页面置换算法 最佳置换算法(OPT):选择永不使用或是在最长时间内不再被访问(即距现在最长时间才会被访问)的页面淘汰出...

    数据结构算法实现(严蔚敏版配套实现程序)

    ∷相关函数:Parent函数 LeftChild函数 RightChild函数 LeftSibling函数 RightSibling函数 1.4.8 中序遍历二叉树(顺序结构) 169 范例1-62 中序遍历二叉树 169 ∷相关函数:InOrderTraverse函数 1.4.9 中序遍历...

    数据结构算法实现(严蔚敏版配套实现程序)

    ∷相关函数:Parent函数 LeftChild函数 RightChild函数 LeftSibling函数 RightSibling函数 1.4.8 中序遍历二叉树(顺序结构) 169 范例1-62 中序遍历二叉树 169 ∷相关函数:InOrderTraverse函数 1.4.9 中序遍历...

    VB指针葵花宝典之函数指针的配套代码。

    此代码是《VB真是想不到系列之三:VB指针葵花宝典之函数指针》的配套代码。 本系列文章可见: http://www.csdn.net/develop/list_article.asp?author=AdamBear 本代码主要是用来谈函数指针在VB内部的应用之一...

    opengl中的堆栈操作

    本算法可以学习函数 glPushMatrix(void)和 glPopMatrix(void)的使用方法

    递归和非递归方式计算Ackerman函数

    递归和非递归方式计算Ackerman函数。非递归方法用堆栈实现。代码内部有详细的注释说明,比较适于学习。

    链接列表和堆栈:作业#1算法

    链接列表和堆栈 homework#1算法使用Java创建存储字符串的双向链表数据结构。 至少必须具有一个List类,其中包含列表功能(包括插入功能)和链接对象(“链接节点”)类。 为方便起见,可以将数据包括在链接节点对象...

    算法设计与分析第七章1

    算法设计与分析第七章学习指南视频ontent(算法设计与分析(进阶篇)第六讲)阅读算法导论(第三版) 第 17 章,第 19 章,第 21 章练习题1.请比较平

    数据结构算法与应用-C++语言描述第1-7章

    本书是关于计算机科学与工程领域的基础性研究科目之一——数据结构与算法的专著。 本书在简要回顾了基本的C++ 程序设计概念的基础上,全面系统地介绍了队列、堆栈、树、图等基本数据结构,以及贪婪算法、分而治之...

    ackermann函数的递归实现和非递归实现

    ackman函数的递归和非递归,学习数据结构的素材,非递归是使用堆栈实现的。

    C#,图论与图算法,有向图(Directed Graph)的环(Cycle)的普通判断算法与源代码

    C#,图论与图算法,有向图(Directed Graph)的环(Cycle)的普通判断算法与源代码 给定一个有向图,检查该图是否包含循环。如果给定的图形至少包含一个循环,则函数应返回true,否则返回false。 方法:深度优先...

    jaq.rar_操作系统_显示时间

    主要算法:将系统时间及日期转化成字符显示,通过堆栈来排序显示,同时涉及到 坐标位置设置的转换。时间和日期的显示都只调用了一个(函数)compute,避免了代码的冗余,尽量做到简洁,同时当一次操作过后,程序处于...

    常用算法代码

    | 堆栈 24 | 区间最大频率 24 | 取第 K 个元素 25 | 归并排序求逆序数 25 | 逆序数推排列数 25 | 二分查找 25 | 二分查找(大于等于 V 的第一个值) 25 | 所有数位相加 25 Number 数论 26 1 |递推求...

    数据结构算法与应用-C++语言描述.

    本书是关于计算机科学与工程领域的基础性研究科目之一——数据结构与算法的专著。 本书在简要回顾了基本的C++ 程序设计概念的基础上,全面系统地介绍了队列、堆栈、树、图等基本数据结构,以及贪婪算法、分而治之...

    数据结构与算法:C++描述

    本书是关于计算机科学与工程领域的基础性研究科目之一——数据结构与算法的专著。 本书在简要回顾了基本的C++ 程序设计概念的基础上,全面系统地介绍了队列、堆栈、树、图等基本数据结构,以及贪婪算法、分而治之...

    C语言通用范例开发金典.part2.rar

    ∷相关函数:Parent函数 LeftChild函数 RightChild函数 LeftSibling函数 RightSibling函数 1.4.7 双亲、孩子和兄弟节点的查询(链式结构) 162 范例1-61 双亲、孩子和兄弟节点的查询 162 ∷相关函数:Parent函数 ...

Global site tag (gtag.js) - Google Analytics