vc++6.0中查看函数栈的结构
栈:一种后进先出的数据结构 比如:弹夹
函数调用的约定
传参顺序
传参媒介
如何传递返回值
平衡参数(堆栈平衡):有且只有被调方(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中查看函数栈的结构的更多相关文章
- [置顶] 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' ...
- VC++6.0中ClassView中类消失 解决方案[转自网络]
有时候在VC++6.0中编程会出现这样一个问题,由于对C...View类的操作后,在窗口左边ClassView框中的C...View类会消失,这种操作通常是在C...View类中右击点“Add Win ...
- 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 ...
- VC++ 6.0中实现三叉切分窗口与多视图 [转]
一.引用 当用户需要同时对文当的不同部分进行编辑时,常常会用到切分窗口;这些窗口可以都是相同的视,或者一个窗口为列表视,而另一个为树型视图.应用程序框架有多种方式来表示多视图,切分窗口是其中的方式之一 ...
- VC++ 6.0 中使用 MSComm.ocx
很多人喜欢单独安装VC++6.0,而不是完整安装VS,这样占用空间比较少,启动也快.但是要使用某些ActiveX控件的时候却会出现许可证问题(requires a design-time licenc ...
- 在WinDBG中查看调用栈的命令
命令 ========== k k命令显示的是一定数量的栈帧, 其中帧的数量是由.kframes命令来控制的, 默认值是256. kp 5 显示调用栈中前5个函数以及他们的参数. kb 5 显示调用栈 ...
- 介绍静态链接库和动态链接库的差别,及在VC++6.0中的建立和使用
首先介绍一下链接库:链接库分为动态链接库和静态链接库两种 LIB是静态链接库,在程序编译连接的时候是静态链接,其相应的文件格式是.lib. 即当程序採用静态链接库的时候..lib文件里的函数被链接到终 ...
- wxWidgets编译和在VC 6.0中的配置
1. 安装 运行wxMSW-2.8.3-Setup1.exe,将之安装到不带空格符号的目录中,本例为C:/wxWidgets-2.8.3: 2. 编译和配置 (1) 用VC6.0编译 进入C: ...
- VC++6.0中不兼容问题
记得上次用VC++6.0已经是很长一段时间之前的事情了.这次由于需要学习计算机图形学,要开始学这写一些算法之类的,我又开始了VC++之旅. 重新安装一个vc++,我用的是Visual C++ 6.0( ...
随机推荐
- keras 模型简介
keras模型在keras中主要有两种模型,顺序模型,以及模型类(类的内部有函数) model.layers 是层的列表,他们组成了模型 model.inputs 是模型输入的张量 model.out ...
- Raspberry Pi 4B 使用OpenCV访问摄像头picamera模块
目录 1.OpenCV安装 (1)安装依赖 (2)下载OpenCV源码 (3)安装pip (4)安装Python虚拟机 (5)编译OpenCV (6)验证安装 2.使用OpenCV和Python控制摄 ...
- vue js select下拉框
<template> <ul id="select"> <li> <div class="select-head"&g ...
- mongoose 安装及配置
MongoDB是一个基于分布式文件存储的数据库.由C++语言编写.旨在为WEB应用提供可扩展的高性能数据存储解决方>案.MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据 ...
- ArcGIS超级工具SPTOOLS-锐角检查,获得内角并判断是否凸多边形,获得线(面)两个折点方向
1.1 锐角检查 操作视频: https://weibo.com/tv/v/HCNNXhm5F?fid=1034:4392479009475111 可以是面.线夹角锐角检查 输出锐角点的位置和角度( ...
- vue单页面项目架构方案
这里的架构方案是基于vue-cli2生成的项目应用程序产生的,是对项目应用程序或者项目模板的一些方便开发和维护的封装.针对单页面的解决方案. 主要有四个方面: 一,不同环境下的分别打包 主要是测试环境 ...
- 如何从社区的patchwork下载补丁并应用到当前内核源码?
1. 下载 wget http://patchwork.ozlabs.org/series/111111/mbox 2. 打补丁 git am mbox
- 《Flutter 实战》开源电子书
<Flutter 实战>开源电子书 转 https://blog.csdn.net/OQjya206rsQ71/article/details/86619630 关于 Flutter ...
- kotlin数据解构
fun main(arg: Array<String>) { val person = person("tom") var (name) = person//解构 pr ...
- Java 实现 telnet命令 验证主机端口的连通性
Java 实现 telnet命令 验证主机端口的连通性 1.Telnet 命令 Telnet协议是TCP/IP协议族中的一员,是Internet远程登录服务的标准协议和主要方式.它为用户提供了在本地计 ...