开发学院软件开发C++ Call Stack简介 阅读

Call Stack简介

 2010-11-04 08:44:04 来源:WEB开发网   
核心提示:假设和说明本文以32Bit的X86 Windows为原型进行说明,栈的增长方向为高地址向低地址,Call Stack简介,开发环境为Visual Studio,语言是C++,所以不管下面代码是否实际使用,都保留上,没有涉及到Delphi、Borland C++、Visual Basic等,文中的任何栈地址、寄存器值以及

假设和说明

本文以32Bit的X86 Windows为原型进行说明。栈的增长方向为高地址向低地址。

开发环境为Visual Studio,语言是C++。没有涉及到Delphi、Borland C++、Visual Basic等。

文中的任何栈地址、寄存器值以及内存址,都会与大家的环境不同。这些值是基于笔者当前环境的当前镜像。

另外一篇文章会介绍C call、Standard call、Fast call和This call。本文默认基于C call。

示例代码

C++代码

int FuncOne(int a, int b)

{

int sum;

sum = a + b;

return sum;

}

void main()

{

FuncOne(0x100, 0x200);

}

对应的汇编代码

clip_image001

操作方式

· 用Visual Studio建立一个Visual C++的Win32 Console工程,在主文件中,删除所有代码,把上述C++代码粘贴上。

· 设置端点在main下面的左括号上,如下图

clip_image002

· 按F5运行程序,当断点触发时,如下图

clip_image003

· 点击Visual Studio的主菜单“Debug”,点击Windows子菜单,然后分别选择Memory1、Disassembly和Registers。如下图红色部分。

clip_image005

· 修改你的Visual Studio窗口布局,如下图(这是我喜好的风格)

clip_image007

首先修改右上角的Columns列,这里我修改为4,以便于每次stack的操作,我们能更清楚地看到。

其次在Address对应的那个输入框上,输入@esp,然后按回车。

clip_image009

上面的窗口为Disassembly窗口,当前断点所在处为push ebp

clip_image011

上面的窗口为Registers窗口,显示几个重要的寄存器。

代码说明

代码由Prologue、代码call和Epilogue组成。

Prologue

PUSH EBP

保存old Frame Pointer地址到栈上

MOV EBP,ESP

保存当前栈地址,因为下面要修改栈地址

SUB ESP, 0C0H

预留出C0个字节的空间,供本地变量及其他使用。如编译器的对栈的检查,如Edit & Continue。后面我们修改这些设置,就会发现预留空间的变化。

PUSH EBX

这三个寄存器经常用,所以不管下面代码是否实际使用,都保留上。这是编译器的行为。

PUSH ESI

PUSH EDI

1 2 3  下一页

Tags:Call Stack 简介

编辑录入:爽爽 [复制链接] [打 印]
[]
  • 好
  • 好的评价 如果觉得好,就请您
      0%(0)
  • 差
  • 差的评价 如果觉得差,就请您
      0%(0)
赞助商链接