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

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

 
阅读更多

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


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

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

| 参数三 |

| 参数二 |

| 参数一 |

| address|

| ebp |

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

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

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

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


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


总结:

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

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

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



分享到:
评论

相关推荐

    一步一步写算法

    本篇文章主要介绍了算法的基本概念以及在编程中的具体应用,以一步一步学习写算法的思路,从基础的循环和递归,到复杂的数据结构处理。 1. 循环和递归是编程中常用的基本控制结构,用于处理重复的操作。循环利用...

    堆栈之科学计算器算法

    堆栈 科学计算器 笔记

    基于TIA博途的堆栈算法(先进后出)SCL语言程序(V15版本).docx

    这种特性使得堆栈在许多计算任务中,如函数调用、表达式求解和内存管理等场景中具有重要作用。 在TIA博途中,我们可以创建一个功能块(Function Block, FB)来实现堆栈操作。首先,我们需要定义FB的输入输出接口...

    堆栈算法的JAVA迷宫

    7. **优化策略**:为了避免无效的搜索,可以采用宽度优先搜索(BFS)或A*算法,其中A*引入了启发式函数,能更高效地找到最优路径。 8. **代码实现**:编写Java类,包括迷宫类、节点类和堆栈类,实现相应的功能。在...

    TIA博途SCL语言_堆栈算法_FB库文件.rar

    综上所述,"TIA博途SCL语言_堆栈算法_FB库文件.rar"是一个包含堆栈算法实现的SCL函数块库,适用于TIA博途环境,旨在帮助用户快速构建基于堆栈的数据处理功能。通过理解和应用这个库,开发者可以更高效地解决涉及堆栈...

    西南交通大学数据结构实验报告黑白棋.doxc递归算法设计及堆栈消除递归

    在本实验报告中,主要涉及了两个核心知识点:1)递归算法的设计,以及2)如何利用堆栈消除递归。 首先,我们来看第一个知识点——递归算法设计。实验要求实现一个黑白棋子交换的游戏,游戏的目标是通过有限步数将...

    汉诺塔堆栈算法.pdf

    该算法的优点是可以使用堆栈来存储圆盘的信息,从而减少了递归函数的调用次数。然而,该算法的缺点是需要使用循环来实现圆盘的移动,这可能会增加算法的复杂度。 汉诺塔递归算法的复杂度也为 O(2^n),其中 n 是圆盘...

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

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

    汉诺塔堆栈算法.docx

    汉诺塔算法的堆栈实现和递归实现 汉诺塔算法是计算机科学中的一种经典算法,用于解决汉诺塔问题,即将一堆盘子从一个柱子移到另一个柱子。该算法有多种实现方式,本文将详细介绍汉诺塔算法的堆栈实现和递归实现。 ...

    JavaScript实现显示函数调用堆栈的方法

    在IE6这样的旧浏览器中,由于缺少内置的堆栈追踪工具,开发者需要自己实现函数调用堆栈的显示。可以通过编写一段JavaScript代码,这段代码能够递归地查找调用者,并将它们的名称收集到一个数组中。例如,上述提供的...

    C语言数据结构中的堆栈函数

    最后,我们可以通过包含`stack.h`并在主程序中使用`stack_create`、`stack_push`等函数来创建和操作堆栈,如处理表达式求值或实现递归等算法。 总结来说,C语言中的堆栈函数涉及了数据结构、内存管理和函数设计等多...

    数据结构堆栈算法的实现

    - **函数调用**:在执行递归或函数调用时,系统会使用堆栈来保存每次调用的状态。 - **表达式求值**:后缀表达式(也称为逆波兰表示法)的计算中,堆栈用于存储运算符和操作数。 - **网页浏览历史**:浏览器的...

    基于堆栈的计算器实现算法

    ### 基于堆栈的计算器实现算法 #### 概述 在计算机科学领域,堆栈(Stack)是一种特殊的线性数据结构,它遵循“后进先出”(Last In, First Out, LIFO)的原则。堆栈在计算器程序的设计中扮演着至关重要的角色,...

    一个不会出现堆栈溢出的快速排序算法

    当递归深度过大,即函数调用过多时,堆栈空间会被耗尽,从而引发堆栈溢出错误。这个问题在处理大型数组时尤为突出,因为快速排序在最坏情况下需要O(n²)的递归深度,尽管平均情况下的时间复杂度是优秀的O(n log n)。...

    阿克曼函数非递归实现

    这个函数是不可计算的,也就是说,它不能通过有限步骤的算法来解决,但是可以通过其他方法如迭代或堆栈来模拟其计算过程。 阿克曼函数通常定义为三个参数的函数A(m, n, p),其中m、n、p是非负整数。它的基本形式...

    数据结构小程序(排序算法比较、递归、堆栈)

    对于学习者而言,掌握数据结构中的排序算法、递归以及堆栈操作对于成为优秀的程序员来说,是必不可少的一步。本文将围绕“数据结构小程序(排序算法比较、递归、堆栈)”这一项目,对这三个关键概念进行深入剖析,并...

    堆栈计算器,支持各级运算,采用边计算边压栈的算法

    在计算机科学中,堆栈常用于实现许多基础功能,如函数调用、表达式求值、内存管理等。在这个项目中,“堆栈计算器”是一个能够处理数学表达式的程序,它利用堆栈来解决复杂的运算问题,包括优先级运算和括号处理。 ...

    数据结构之堆栈的使用

    堆栈在计算机科学中有多种应用,如表达式求值(后缀表达式或逆波兰表示法)、函数调用栈、深度优先搜索(DFS)等。理解堆栈的工作原理和操作,对于提升编程技能和解决实际问题至关重要。在实际编程中,可以使用各种...

    TIA博途堆栈算法-先进后出LIFO全局FB库文件-GF-stack-LIFO.zip

    这种特性使得堆栈在处理逆序操作或者临时存储数据等问题时非常有效,比如在函数调用中的调用栈、浏览器的历史记录等。 在TIA博途中,全局FB(Function Block)库文件是一种可复用的程序模块,它可以被多个项目共享...

    好用的VC队列与堆栈算法类

    堆栈的应用广泛,例如在表达式求值(如后缀表达式计算)、递归调用、内存管理(如函数调用时的局部变量存储)等方面都有重要角色。队列则常用于任务调度、打印机队列、操作系统进程管理等场景。 在实际编程中,使用...

Global site tag (gtag.js) - Google Analytics