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

函数调用的约定

传参顺序

传参媒介

如何传递返回值

平衡参数(堆栈平衡):有且只有被调方(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. python3 django连接mysql数据库

    在django中将模型类中的数据迁移到mysql数据库中,首先使用pip install pymysql安装pymysql库, 然后在项目中的__init__.py中添加 import pymysql ...

  2. 查询Oracle正在执行的sql语句及kill被锁的表

    查询Oracle正在执行的sql语句及执行该语句的用户SELECT b.sid oracleID, b.username 登录Oracle用户名, b.serial#, spid 操作系统ID, pa ...

  3. 通过JDBC API访问数据库的基本步骤

    1.获取要访问的数据库的JDBC驱动程序的类库文件,把它放到classpath中. 2.在程序中加载并注册JDBC驱动程序.例如,以下代码用于加载并注册MySQL驱动程序: //加载MySQL Dri ...

  4. MySQL索引选择及添加原则

    索引选择性就是结果个数与总个数的比值. 用sql语句表示为: SELECT COUNT(*) FROM table_name WHERE column_name/SELECT COUNT(*) FRO ...

  5. react native Expo适配全面屏/Expo识别全面屏和正常屏

    一.最新版本的expo已经默认支持了全面屏,即不会像react native cli一样出现底部黑边 二.但是全面屏通过Dimensions.get('window')获取的高度还是不准确,因为全面屏 ...

  6. 遍历日期的Linux Shell脚本

    #! /bin/bash date=$1 eddt=$2 while [ $date -le $eddt ]; do echo $date date=$(date -d "${date}+1 ...

  7. [System Design] Design a distributed key value caching system, like Memcached or Redis

    https://www.interviewbit.com/problems/design-cache/ Features: This is the first part of any system d ...

  8. MongoDB可视化工具Studio 3T的使用

    原文地址:https://blog.csdn.net/weixin_39999535/article/details/81383196 studio3T 永久使用方法 新建文件studio3t.bat ...

  9. Java工程师学习指南第3部分:Spring与SpringMVC源码解析

    本文整理了微信公众号[Java技术江湖]发表和转载过的Spring全家桶优质文章,想看到更多Java技术文章,就赶紧关注吧. 前后端分离,我怎么就选择了 Spring Boot + Vue 技术栈? ...

  10. jackson 实体转json 为NULL或者为空不参加序列化【转载】

    原博客:https://www.cnblogs.com/yangy608/p/3936848.html 1.实体上 /** * 将该标记放在属性上,如果该属性为NULL则不参与序列化 * 如果放在类上 ...