【 声明:版权所有,欢迎转载,请勿用于商业用途。  联系信箱: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)堆栈原理十分重要,朋友们应该好好了解一下。

一步一步写算法(之函数堆栈显示)相关推荐

  1. 一步一步写算法(之prim算法 中)

    原文:一步一步写算法(之prim算法 中) [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] C)编写最小生成树,涉及创建.挑选和添加过程 MI ...

  2. 一步一步写算法(之寻找丢失的数)

    一步一步写算法(之寻找丢失的数) 原文:一步一步写算法(之寻找丢失的数) [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 假设我们有一个1亿个 ...

  3. 一步一步写算法(之克鲁斯卡尔算法 中)

    一步一步写算法(之克鲁斯卡尔算法 中) 原文:一步一步写算法(之克鲁斯卡尔算法 中) [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 前面说到 ...

  4. 一步一步写算法(之prim算法 下)

    [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 前两篇博客我们讨论了prim最小生成树的算法,熟悉了基本的流程.基本上来说,我们是按照自上而下 ...

  5. 一步一步写算法(开篇)

    [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 算法是计算机的生命.没有算法,就没有软件,计算机也就成了一个冰冷的机器,没有什么实用价值.很多 ...

  6. 一步一步写算法(之图结构)

    原文:一步一步写算法(之图结构) [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 图是数据结构里面的重要一章.通过图,我们可以判断两个点之间是 ...

  7. 一步一步写算法(之排序二叉树删除-1)

    [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 相比较节点的添加,平衡二叉树的删除要复杂一些.因为在删除的过程中,你要考虑到不同的情况,针对每 ...

  8. 编程题C语言写牛牛数星星,一步一步写算法(之“数星星”)

    原文: 一步一步写算法(之"数星星") [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 学过编程的朋友都知道,当初为了学习 ...

  9. 一步一步写算法(之 算法总结)【转】

    转自:http://blog.csdn.net/feixiaoxing/article/details/6993718 版权声明:本文为博主原创文章,未经博主允许不得转载. [ 声明:版权所有,欢迎转 ...

最新文章

  1. java中final关键字的使用
  2. 杨威(为奥运冠军名字作诗)
  3. 【C/C++】 读、写二进制文件经典实例
  4. 复杂多边形光栅化算法
  5. delphi 垃圾回收框架
  6. 目前我国家庭计算机用户接入因特网的下述,目前我国家庭计算机用户接入因特网的下述几种方法中,速度最快的是________ 。...
  7. MPLS ×××跨域实现之OPTION B配置讲解
  8. mysql插入时间区间_mybatis插入数据时返回主键以及MySQL根据时间区间查询问题总结...
  9. CentOS 7编译程序后的环境变量设置
  10. gm怎么刷东西 rust_RUST:2020年7月第三周 修补和更新
  11. 【报告分享】人工智能之未来产业智能----新价值、新边界、新格局.pdf(附下载链接)...
  12. 【招聘内推】阿里巴巴广告/推荐/搜索-算法工程师岗位
  13. 习题4.5 顺序存储的二叉树的最近的公共祖先问题 (25 分)
  14. css3做各种角度三角形
  15. ExtJs6学习(一)【ExtJs介绍】
  16. 计算机CPU的时钟频率主要,cpu时钟频率计算公式_CPU频率计算方法详解
  17. ffmpeg把yuv数据转换成jpeg图片
  18. java 仿易企秀_鲁班H5(开源可视化搭建系统, 可以理解为开源版本易企秀)核心实现原理解析...
  19. C#字符串与ASII16(HEX)进制相互转换
  20. 霍夫变换c语言程序,霍夫变换 | Cauthy's Blog

热门文章

  1. 我发现:在StackOverflow上拯救歪果仁十分有意思!
  2. 不容易,今天的成果。
  3. Ambari ambari 集群及组件
  4. JAVA中properties基本用法
  5. RDLC报表开发分组笔记
  6. inno setup读取XML文件
  7. 二月草的博客开通啦……
  8. 关于SQL数据库中的数据到如何导出--SQL2000导入到SQL2008中
  9. AndroidStudio_Gradle介绍以及在androidstudio中的使用---Android原生开发工作笔记76
  10. 页面间参数传递---基于Vue的uniapp手机端_前端UI_uview工作笔记005