当前位置:天才代写 > tutorial > C语言/C++ 教程 > 小览call stack(挪用栈) (一)

小览call stack(挪用栈) (一)

2017-11-03 08:00 星期五 所属: C语言/C++ 教程 浏览:576

副标题#e#

栈在计较机规模中是个常常提到的名词,数据布局中有栈;网络传输中有协 议栈。本日我们接头的挪用栈(call stack),指的是在措施的执行进程中存储函 数挪用信息的动态数据布局。

这个界说大概太抽象了一些,在给出详细的例子之前,请各人先思考一个问 题,哪些信息是函数挪用进程中所需要的?可能这么问,一个编译器,在面临一 个函数的挪用指令时,该生成哪些代码?

首先,函数的返回地点要生存下来。就仿佛你和你的小狗玩仍飞碟游戏,每 一个函数挪用比如扔一个飞碟,当你的狗狗哼兹哼兹的捡来飞碟,函数完执行的 时候,它必然得知道去那边把飞碟还给你。

小览call stack(调用栈) (一)

然后,函数的参数是个必不行少的元素,这个很直观,就不多罗嗦了。第三 ,被挪用的函数的局部变量也要存储在栈上。因为按照局部标量的界说,对沟通 函数的差异挪用,局部变量有差异的存储空间,不会相互影响,所以这些数据也 是跟函数挪用息息相关的信息。

下面,我们通过一个例子,来看看函数的挪用栈中的信息:

对付下面一段c++措施

   [Ctrl+A 全部选择 提示:你可 先修改部门代码,再按运行]


#p#副标题#e#

编译之,Cl /Zi a.cpp (/Zi生成pdb,调试的时候利用)

各人选用熟悉的调试器,在这里,笔者用的是windbg 各人可以去这个地点下 载(http://www.microsoft.com/whdc/devtools/debugging/installx86.Mspx)

从调试器中启动措施:Windbg a.exe

然后在第4行配置一个断点(F9)。开始执行这个措施(F5),直到措施间断在断 点处

找到措施的挪用栈:

1.察看当前的ebp,在command窗口中应该已经看到。不然的话,在command中 输入r

2.在memory察看窗口中,virtual栏中输入ebp-10的值,而且把display format改成long hex,以利于调查栈中的值

我把我的windbg截图粘贴如下,并和各人一起调查几个处所

小览call stack(调用栈) (一)

1.返回地点0040106b。拜见反汇编的功效,0040106b正是main调完 SumFromOne之后的那条指令。

2.参数。主措施传给他的是10,(0xa),在memory窗口ebp+8的位置找到他。

3.局部变量,我在措施中存心将sum初始化为0xabcd,各人可以在memory窗口 ebp-4的位置找到他。

有乐趣地同学可以按F5,在下一个断点中察看相关信息。

好,本日的这片博客中我们对换用栈有了感性的认识,在ebp周围找到了返回 地点,参数以及局部变量。下一片博客中,我将表明为什么这些信息存储在这些 位置,敬请等候。

 

    关键字:

天才代写-代写联系方式