栈:一种后进先出的数据结构   比如:弹夹

函数调用的约定

传参顺序

传参媒介

如何传递返回值

平衡参数(堆栈平衡):有且只有被调方(callee)和调用方(caller)一方执行

_cdell (c约定,在C语言中 默认) <所有号称兼容C标准的编译器>

从右往左传参,通过栈传递参数,通过寄存器传递返回值,由被调方清除参数空间(平衡参数/堆栈/栈顶)

_stdcall  (标准调用约定)

从右往左传参,通过栈传递参数,通过寄存器传递返回值,由调用方清除参数空间(平衡参数/堆栈/栈顶)

_fastcall <微软,非标准>

通过寄存器传递前两个参数,其余参数从右往左通过寄存器传递,通过寄存器传递返回值,由被调方清除参数空间

函数调用的步骤

1、按被调用约定传递参数

2、保存返回地址

3、流程转移到被调函数的首地址(第一条指令的地址)

4、保存调用方的栈信息(栈底)

5、更新当前栈信息(栈底),换句话说就是指定被调方的栈底位置

6、以局部变量总大小为依据,抬高栈底,也就是说为被调方的局部变量开辟空间

*6.1 在调试选项(/Od + /Zi)时,将局部变量初始化为0xcccccccc

7、保存寄存器环境

8、执行函数体

9、恢复寄存器环境

10、释放局部变量空间

11、恢复调用方的栈信息(栈底)

12A、_cdell约定时,直接取出返回地址,并按此地址回到被调方

12B、_stdcall 和_fastcall约定时,取出返回地址后,平衡参数多占用空间,按返回地址回到调用方

*13、_cdel约定时,调用方在此时平衡参数所占用空间

其中 * 代表可选项

现在我们到具体函数中分析

#include<stdio.h>
#include<stdlib.h> int Sum(int a, int b)
{
int sum = ;
//system("pause");
sum = a + b; return sum;
} int main()
{
int nNum1 = ; int nNum2 = ; Sum(nNum1, nNum2); system("pause");
return ;
}

在Ide环境中打开内存窗口,win7 32位 vc++6.0可以直接定位18ff40

接下来我们来具体分析了解如图所示

首先看看main函数的栈结构

接下来我们再看看sum函数的栈结构

vc++6.0中查看函数栈的结构的更多相关文章

  1. [置顶] c++,vc6.0,中友元函数,无法访问私有字段(private)的问题(problem),cannot access private member declared in class 'Date'

    c++,vc6.0,中友元函数,无法访问私有字段(private)的问题(problem),cannot access private member declared in class 'Date' ...

  2. VC++6.0中ClassView中类消失 解决方案[转自网络]

    有时候在VC++6.0中编程会出现这样一个问题,由于对C...View类的操作后,在窗口左边ClassView框中的C...View类会消失,这种操作通常是在C...View类中右击点“Add Win ...

  3. VC6.0中友元函数无法访问类私有成员的解决办法

    举个例子: 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 #inclu ...

  4. VC++ 6.0中实现三叉切分窗口与多视图 [转]

    一.引用 当用户需要同时对文当的不同部分进行编辑时,常常会用到切分窗口;这些窗口可以都是相同的视,或者一个窗口为列表视,而另一个为树型视图.应用程序框架有多种方式来表示多视图,切分窗口是其中的方式之一 ...

  5. VC++ 6.0 中使用 MSComm.ocx

    很多人喜欢单独安装VC++6.0,而不是完整安装VS,这样占用空间比较少,启动也快.但是要使用某些ActiveX控件的时候却会出现许可证问题(requires a design-time licenc ...

  6. 在WinDBG中查看调用栈的命令

    命令 ========== k k命令显示的是一定数量的栈帧, 其中帧的数量是由.kframes命令来控制的, 默认值是256. kp 5 显示调用栈中前5个函数以及他们的参数. kb 5 显示调用栈 ...

  7. 介绍静态链接库和动态链接库的差别,及在VC++6.0中的建立和使用

    首先介绍一下链接库:链接库分为动态链接库和静态链接库两种 LIB是静态链接库,在程序编译连接的时候是静态链接,其相应的文件格式是.lib. 即当程序採用静态链接库的时候..lib文件里的函数被链接到终 ...

  8. wxWidgets编译和在VC 6.0中的配置

    1. 安装  运行wxMSW-2.8.3-Setup1.exe,将之安装到不带空格符号的目录中,本例为C:/wxWidgets-2.8.3:   2. 编译和配置 (1) 用VC6.0编译  进入C: ...

  9. VC++6.0中不兼容问题

    记得上次用VC++6.0已经是很长一段时间之前的事情了.这次由于需要学习计算机图形学,要开始学这写一些算法之类的,我又开始了VC++之旅. 重新安装一个vc++,我用的是Visual C++ 6.0( ...

随机推荐

  1. keras 模型简介

    keras模型在keras中主要有两种模型,顺序模型,以及模型类(类的内部有函数) model.layers 是层的列表,他们组成了模型 model.inputs 是模型输入的张量 model.out ...

  2. Raspberry Pi 4B 使用OpenCV访问摄像头picamera模块

    目录 1.OpenCV安装 (1)安装依赖 (2)下载OpenCV源码 (3)安装pip (4)安装Python虚拟机 (5)编译OpenCV (6)验证安装 2.使用OpenCV和Python控制摄 ...

  3. vue js select下拉框

    <template> <ul id="select"> <li> <div class="select-head"&g ...

  4. mongoose 安装及配置

    MongoDB是一个基于分布式文件存储的数据库.由C++语言编写.旨在为WEB应用提供可扩展的高性能数据存储解决方>案.MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据 ...

  5. ArcGIS超级工具SPTOOLS-锐角检查,获得内角并判断是否凸多边形,获得线(面)两个折点方向

    1.1  锐角检查 操作视频: https://weibo.com/tv/v/HCNNXhm5F?fid=1034:4392479009475111 可以是面.线夹角锐角检查 输出锐角点的位置和角度( ...

  6. vue单页面项目架构方案

    这里的架构方案是基于vue-cli2生成的项目应用程序产生的,是对项目应用程序或者项目模板的一些方便开发和维护的封装.针对单页面的解决方案. 主要有四个方面: 一,不同环境下的分别打包 主要是测试环境 ...

  7. 如何从社区的patchwork下载补丁并应用到当前内核源码?

    1. 下载 wget http://patchwork.ozlabs.org/series/111111/mbox 2. 打补丁 git am mbox

  8. 《Flutter 实战》开源电子书

    <Flutter 实战>开源电子书 转 https://blog.csdn.net/OQjya206rsQ71/article/details/86619630   关于 Flutter ...

  9. kotlin数据解构

    fun main(arg: Array<String>) { val person = person("tom") var (name) = person//解构 pr ...

  10. Java 实现 telnet命令 验证主机端口的连通性

    Java 实现 telnet命令 验证主机端口的连通性 1.Telnet 命令 Telnet协议是TCP/IP协议族中的一员,是Internet远程登录服务的标准协议和主要方式.它为用户提供了在本地计 ...