一步一步写算法(之函数堆栈显示)
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱: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)堆栈原理十分重要,朋友们应该好好了解一下。
一步一步写算法(之函数堆栈显示)相关推荐
- 一步一步写算法(之prim算法 中)
原文:一步一步写算法(之prim算法 中) [ 声明:版权所有,欢迎转载,请勿用于商业用途. 联系信箱:feixiaoxing @163.com] C)编写最小生成树,涉及创建.挑选和添加过程 MI ...
- 一步一步写算法(之寻找丢失的数)
一步一步写算法(之寻找丢失的数) 原文:一步一步写算法(之寻找丢失的数) [ 声明:版权所有,欢迎转载,请勿用于商业用途. 联系信箱:feixiaoxing @163.com] 假设我们有一个1亿个 ...
- 一步一步写算法(之克鲁斯卡尔算法 中)
一步一步写算法(之克鲁斯卡尔算法 中) 原文:一步一步写算法(之克鲁斯卡尔算法 中) [ 声明:版权所有,欢迎转载,请勿用于商业用途. 联系信箱:feixiaoxing @163.com] 前面说到 ...
- 一步一步写算法(之prim算法 下)
[ 声明:版权所有,欢迎转载,请勿用于商业用途. 联系信箱:feixiaoxing @163.com] 前两篇博客我们讨论了prim最小生成树的算法,熟悉了基本的流程.基本上来说,我们是按照自上而下 ...
- 一步一步写算法(开篇)
[ 声明:版权所有,欢迎转载,请勿用于商业用途. 联系信箱:feixiaoxing @163.com] 算法是计算机的生命.没有算法,就没有软件,计算机也就成了一个冰冷的机器,没有什么实用价值.很多 ...
- 一步一步写算法(之图结构)
原文:一步一步写算法(之图结构) [ 声明:版权所有,欢迎转载,请勿用于商业用途. 联系信箱:feixiaoxing @163.com] 图是数据结构里面的重要一章.通过图,我们可以判断两个点之间是 ...
- 一步一步写算法(之排序二叉树删除-1)
[ 声明:版权所有,欢迎转载,请勿用于商业用途. 联系信箱:feixiaoxing @163.com] 相比较节点的添加,平衡二叉树的删除要复杂一些.因为在删除的过程中,你要考虑到不同的情况,针对每 ...
- 编程题C语言写牛牛数星星,一步一步写算法(之“数星星”)
原文: 一步一步写算法(之"数星星") [ 声明:版权所有,欢迎转载,请勿用于商业用途. 联系信箱:feixiaoxing @163.com] 学过编程的朋友都知道,当初为了学习 ...
- 一步一步写算法(之 算法总结)【转】
转自:http://blog.csdn.net/feixiaoxing/article/details/6993718 版权声明:本文为博主原创文章,未经博主允许不得转载. [ 声明:版权所有,欢迎转 ...
最新文章
- java中final关键字的使用
- 杨威(为奥运冠军名字作诗)
- 【C/C++】 读、写二进制文件经典实例
- 复杂多边形光栅化算法
- delphi 垃圾回收框架
- 目前我国家庭计算机用户接入因特网的下述,目前我国家庭计算机用户接入因特网的下述几种方法中,速度最快的是________ 。...
- MPLS ×××跨域实现之OPTION B配置讲解
- mysql插入时间区间_mybatis插入数据时返回主键以及MySQL根据时间区间查询问题总结...
- CentOS 7编译程序后的环境变量设置
- gm怎么刷东西 rust_RUST:2020年7月第三周 修补和更新
- 【报告分享】人工智能之未来产业智能----新价值、新边界、新格局.pdf(附下载链接)...
- 【招聘内推】阿里巴巴广告/推荐/搜索-算法工程师岗位
- 习题4.5 顺序存储的二叉树的最近的公共祖先问题 (25 分)
- css3做各种角度三角形
- ExtJs6学习(一)【ExtJs介绍】
- 计算机CPU的时钟频率主要,cpu时钟频率计算公式_CPU频率计算方法详解
- ffmpeg把yuv数据转换成jpeg图片
- java 仿易企秀_鲁班H5(开源可视化搭建系统, 可以理解为开源版本易企秀)核心实现原理解析...
- C#字符串与ASII16(HEX)进制相互转换
- 霍夫变换c语言程序,霍夫变换 | Cauthy's Blog