Win32程序函数调用时堆栈变化情况分析

汇编语言笔记 函数序言 esp栈顶,ebp栈底位置; 入栈 add esp, 4 出栈 sub esp, 4 这是在32位机器上运行的,一次性能够压入4个字节的数据入栈(4个字节也就是32位,同理如果是64位机器,可以入栈8个字节数据) 理解入栈,时候为什么是栈顶往是加,而不是减少。是因为在机器初期,硬件资源非常稀缺;在起始地址开始位置分配给程序段相关。 比如运行一个程序段,然后地址向前加若干字节;此时需要记录一下别的事情,比如记录一块数据,一个函数,等会再用。这时要记录在别处,为了方便可以从地址的后面往前记录。 就像做 阅读详情
在经典的汇编语言教程中,函数调用时堆栈的使用都是着重讲解的问题。如今随着高级语言的越来越完善,单纯使用汇编开发的程序已经不多了。但对函数调用时堆栈动向的了解仍有助于我们明晰程序的执行流程,从而在程序编写和调试的过程中有一个清晰的思路。

一.调用约定
在Win32中,有关函数的调用主要有两种约定。
1._stdcall
        以__stdcall方式调用的函数有以下特征:
    •  参数由右至左压栈
    • 调用返回时,堆栈由被调函数调整
2.__cdecl
__cdecl约定是C/C++函数的默认调用约定。它有以下特征:
    • 参数由右至左压栈
    • 调用返回时,堆栈由调用者调整

二.Win32函数调用过程

1.    压入参数
这里依据以上的调用方式将调用者给出的参数一一压入堆栈。

2.    压入断点
当程序执行到Call指令的时候,当前语句的地址作为断点地址压入堆栈。

3.    跳转
eip的值被重新设置为被调函数的起始地址。

4.    mov ebp, esp
这里ebp被用来在堆栈中寻找调用者压入的参数,同时作为调用者堆栈指针的一个备份。在此前还应该执行一条:
push ebp
把ebp中原来的数值保存。

5.    sub esp,N
这里N是函数内局部变量的总字节数加上一个整数,一般为40。此后esp即为被调函数的堆栈指针了。

6.    初始化esp ~ esp-N之间的N字节空间
这是对堆栈中已分配给局部变量使用的内存空间的初始化,一般全部设置为0xcc。

7.    顺序执行函数内语句。
此时函数的堆栈位于所有局部变量的内存空间之后,二者之间一般有40字节的隔离带。

8.返回
为保障调用的正常返回,函数内应当保证规范使用堆栈,使即将返回的时候esp的值恢复为执行第一条语句前的状态。说明白点,就是每一条push都要有相应的pop。
调用返回的过程如下:
mov esp, ebp
执行后,esp恢复为调用者的堆栈指针,栈顶除断点地址外,还存有原ebp的值和调用时压入的参数。
然后依次弹出ebp的值和断点地址。如果是__cdecl约定则直接返回调用者,调用者将负责调整堆栈,丢弃调先前压入的参数。如果是__stdcall则这个工作由被调函数来执行。

程序样例如下:
……
0040B8E8   push        1            压入参数
0040B8EA   call        00401028        调用函数
……
00401028   jmp         0040b7c0        跳转到函数入口
……
0040B7C0   push        ebp            保存ebp
0040B7C1   mov         ebp,esp        
0040B7C3   sub         esp,44h        设置函数的堆栈指针,此函数中有4
;字节的局部变量
0040B7C6   push        ebx
0040B7C7   push        esi        
0040B7C8   push        edi
0040B7C9   lea         edi,[ebp-44h]    
0040B7CC   mov         ecx,11h
0040B7D1   mov         eax,0CCCCCCCCh
0040B7D6   rep stos    dword ptr [edi]    初始化局部变量空间
0040B7D8   mov         eax,dword ptr [ebp+8]
0040B7DB   mov         dword ptr [ebp-4],eax
……
0040B7DE   pop         edi            弹出曾压栈的数据
0040B7DF   pop         esi
0040B7E0   pop         ebx
0040B7E1   mov         esp,ebp        恢复调用者的堆栈
0040B7E3   pop         ebp            弹出原ebp值
0040B7E4   ret         4            返回并将堆栈向上调整4字节。
;此处为__stdcall约定,所以由函数调
;整堆栈

相应的C代码如下:

void __stdcall fun(int);

int main(void)
{
    ……    
fun(1);
……
    return 0;
}

void __stdcall fun(int para)
{
    int localpara = para;
    ……
}
基于SSM框架的在线考试系统设计与实现全流程解析 在Java后端开发中,SSM框架是经典的分层架构组合,由Spring、SpringMVC和MyBatis构成,分别负责对象管理、请求分发与数据持久化,其清晰的职责划分与灵活配置使其成为企业级应用和毕业设计的热门选择。在线考试系统作为典型的业务闭环,从数据库建模到Maven工程搭建,从Spring整合MyBatis到SpringMVC控制器开发,再到前端考试交互,完整覆盖了用户管理、试题管理、试卷生成、自动评分与成绩展示等核心模块。掌握SSM框架的核心原理,有助于理解Java Web开发中的事务控制、依赖注入 阅读详情

相关推荐

SSM框架开发心理健康服务平台的技术实践

SSM框架(Spring+SpringMVC+MyBatis)是Java Web开发的经典技术栈,特别适合构建中小型管理系统。Spring通过依赖注入实现组件解耦,SpringMVC采用MVC模式分离表示层逻辑,MyBatis则提供灵活的SQL映射能力。在心理健康类平台开发中,数据安全和实时交互是关键需求,这需要合理运用Shiro权限框架实现RBAC控制,并通过WebSocket技术建立稳定通信。此类项目典型应用场景包括用户管理、在线咨询和心理测评等模块,其中敏感数据处理需要特别注意加密存储和访问控制。本案

weixin_34277853的博客 328

Win32-API函数调用的约定

函数调用原理: win32 api的函数调用方式是stdcall,其过程操作如下: 调用函数的代码: 1.调用函数的逻辑代码 2.函数调用代码    a.将参数存入栈 (从右向左入栈)   b.跳转  call 入口地址     push eip (压入返回地址,即函数调用返回后要执行的下一条指令的地址)      mv eip 函数的地址 (将eip设置为被调用函数的

LUCKYOJ 2030

Java Web网上购物系统实战:Spring Boot+MyBatis-Plus课程设计指南

在Java Web开发领域,掌握主流框架技术栈是构建企业级应用的基础。其核心原理在于通过分层架构(如MVC)实现关注点分离,提升代码的可维护性和扩展性。Spring Boot作为当前Java生态的绝对主流,通过自动配置和起步依赖极大简化了项目搭建和部署流程,其技术价值在于让开发者能快速聚焦业务逻辑而非环境配置。结合MyBatis-Plus这类增强工具,可以高效完成数据持久层操作,这对于电商、管理等需要大量CRUD操作的应用场景至关重要。本文以“网上购物系统”这一经典课程设计项目为具体载体,深入解析如何运用S

weixin_33676492的博客 457

函数调用栈 剖析+图解

栈: 在函数调用时,第一个进栈的是主函数中函数调用后的下一条指令(函数调用语句的下一条可执行语句)的地址,然后是函数的各个参数,在大多数的C编译器中,参数是由右往左入栈的,然后是函数中的局部变量。注意静态变量是不入栈的。 当本次函数调用结束后,局部变量先出栈,然后是参数,最后栈顶指针指向最开始存的地址,也就是主函数中的下一条指令,程序由该点继续运行。 当发生函数调用的时候,栈空

wangyezi19930928的专栏 5万+

基于Spring Boot与微信小程序构建乡村政务平台的开发实战解析

毕业设计选题如何避开同质化陷阱?项目实战与技术选型是计算机专业学生必须面对的核心问题。Spring Boot作为Java后端主流框架,以自动配置、内嵌容器等特性极大简化了企业级应用开发流程;微信小程序则凭借免安装、跨平台优势成为轻量级应用的首选载体。前后端分离架构、RESTful API设计、权限控制与接口联调,这些技术点共同构成了现代Web开发的实践基石。本文从技术原理出发,探讨如何将Spring Boot后端与小程序前端有机结合,落地于乡村政务这一真实业务场景——围绕公告发布、在线审批、意见反馈等核心功

weixin_33863087的博客 401

基于微信小程序的Java餐厅点餐系统设计与实现全解析

在数字化转型浪潮中,Java与微信小程序已成为餐饮行业构建轻量级服务的热门技术组合。微信小程序凭借即用即走、免安装的体验优势,成为餐厅点餐场景的理想载体;而Spring Boot作为Java后端的核心框架,通过自动化配置与内嵌服务器,大幅降低了系统搭建与部署门槛。二者结合可实现从用户浏览菜单、加购下单、在线支付到商家接单出餐的完整业务闭环。本文从工程实践视角出发,系统梳理了基于微信小程序的Java点餐系统的核心设计思路,涵盖数据库表结构、订单状态机、JWT登录态、微信支付回调以及真机调试等关键技术点,并针对

weixin_34221112的博客 274

【WIN32】C++在打印Windows中调用堆栈信息

伪句柄是一个特殊常量,当前 (HANDLE) -1,被解释为当前进程句柄。每当需要进程句柄时,调用进程都可以使用伪句柄来指定自己的进程。指向 SYMBOL_INFO 结构的指针,该结构提供有关符号的信息。用于搜索符号文件的路径或用分号分隔的路径系列。如果地址位于符号的开头之后和符号的末尾之前,则会找到该符号。如果为 TRUE,则枚举进程的加载模块,并有效地为每个模块调用 SymLoadModule64 函数。此值是根据 BackTrace 数组中返回的指针的值计算的。符号开头的位移,或零。

Joeyshaw的博客 1196

基于SpringBoot+Vue的课程作业管理系统:毕业设计实战指南

在软件工程实践中,前后端分离架构已成为构建现代Web应用的主流范式。其核心原理在于将用户界面(前端)与业务逻辑及数据(后端)解耦,通过API进行通信,从而提升开发效率与系统可维护性。这种架构模式的技术价值在于支持团队并行开发、技术栈灵活选型以及更好的用户体验。典型的应用场景包括各类后台管理系统、电商平台及在线协作工具。本文聚焦于一个具体的实现案例——一个功能完整的课程作业管理系统,它精准地解决了毕业设计中常见的选题空洞、技术栈混乱等典型难题,并提供了从权限设计到文件上传等关键功能的实现范本,为基于Java和

weixin_34347651的博客 423

windows环境下C++代码打印函数堆栈调用情况

文章目录前言查看函数堆栈的作用实现打印堆栈信息的函数显示堆栈调用信息总结程序源码 前言 程序运行的过程中,函数之间的是会相互调用的,在某一时刻函数之间的调用关系,可以通过函数调用堆栈表现出来,这个调用堆栈所展现的就是函数A调用了函数B,而函数B又调用了函数C,这些调用关系在代码中都是静态的,不需要程序运行就可以知道。 既然函数之间的调用关系可以通过分析代码就可以知道,那么查看函数调用的堆栈是不是...

AlbertS Home of Technology 1万+

SpringBoot+Vue学生读书笔记共享平台毕设项目全解析

在前后端分离架构成为主流开发范式的今天,SpringBoot与Vue的组合凭借高开发效率和灵活交互体验,广泛应用于各类Web系统构建。SpringBoot以“约定大于配置”简化服务端搭建,Vue提供组件化响应式视图层,配合MySQL存储数据和MyBatis-Plus提升持久层效率,已成为Java全栈开发者的必备技能链。登录认证、RESTful接口设计、跨域处理与Axios封装等关键技术,贯穿于业务系统从设计到联调的每一环节。本文以学生读书笔记共享平台为实例,完整拆解功能模块划分、数据库表结构设计、后端接口文

weixin_34274029的博客 231

SpringBoot+Vue图书商城管理系统:前后端分离架构与实战部署详解

前后端分离架构已成为现代Web开发的主流范式,它将后端接口服务与前端交互界面解耦,显著提升了系统的可维护性与扩展性。在Java技术体系中,SpringBoot凭借约定优于配置的特性,快速构建RESTful服务;Vue则通过组件化与双向绑定,高效实现动态页面。接合MyBatis动态SQL,可灵活应对多条件筛选、关联查询等复杂业务场景,MySQL提供稳定可靠的数据存储。这一技术组合被广泛应用于电商、企业管理系统等中小型项目。从用户浏览、购物车、订单流转到后台维护,完整的业务闭环是检验工程能力的试金石。本文基于一

weixin_33860528的博客 438

SpringBoot + LayUI 实战:从零构建一个简易内容管理后台(附源码)

本文详细介绍了如何使用SpringBoot和LayUI从零构建一个简易内容管理后台(CMS)。通过实战案例,展示了文章管理、用户权限控制等核心功能的实现,并提供了完整的源码和部署指南。这套技术组合特别适合快速开发中小型后台管理系统,具有开发效率高、维护简单的特点。

weixin_33984032的博客 336

基于SpringBoot+Vue的论文管理系统完整实现方案

在高校教务与毕业设计管理中,流程类信息系统的核心在于理清业务状态流转。从管理系统的基础概念出发,选题、提交、评阅、答辩等闭环流程的设计原理得到系统性剖析,SpringBoot+Vue前后端分离架构的技术价值也随之凸显。针对开发中常见的MyBatis单个数字字符比较陷阱、Vue打包后布局异常等热点问题,提供了可落地的解决方案。同时涵盖数据库设计、权限拦截、文件上传等工程实践,适合毕业设计选题及企业级工具搭建参考。

weixin_34335458的博客 457

【汇编】32位汇编常用的指令

这是因为这时候我们的EFL标志寄存器中的DF位是0,如果改成1,那么操作完esi和edi之后,esi和edi中的值就会减,这里就不测试了,知道有这么回事就行。JMP指令就是用来修改EIP的值的,我们知道寄存器EIP中存放着下一次将会执行指令的地址,所以我们可以通过JMP指令修改程序下一次执行的内容。

qq_52572621的博客 5825

基于SpringBoot+Vue的乡村旅游预约系统设计与实现

预约系统看似只是简单的增删改查,实则核心在于资源名额控制与订单状态流转。对于乡村旅游这类多业态、小体量的场景,更需要一套灵活可靠的资源预约体系。本文从系统设计的基础概念出发,讲解如何利用SpringBoot的自动装配与Vue的组件化开发构建前后端分离架构,并重点剖析了库存扣减中的乐观锁原理、事务处理与状态机设计,确保并发场景下不超卖、不丢单。技术选型匹配业务体量,通过数据库优化、接口安全、部署方案等实践,为景区预约、民宿预订、活动报名等类似场景提供完整的工程参考。无论是理解CRUD背后的业务逻辑,还是从零搭

weixin_34413103的博客 298

AIR780E二次开发点灯(LuatOS)

Air780E的LuatOS点灯教程,二次开发教程,可用于所有ec618平台,无需SDK

rootuseres的博客 1万+

反汇编分析函数传参,调用,执行过程中堆栈变化。

eip保存的是将要执行的下条指令的地址 esp 栈顶指针 保存栈顶地址 ebp 栈底指针 保存栈底地址 push 2 : sub esp,4 mov dword ptr ss:[esp],2 执行完call 指令后有三处变化,说明我们上述分析没有错误。 push ebp :可...

zdy8023的博客 1174

Colab虚拟环境配置全攻略:从安装到实战应用

本文详细介绍了在Google Colab中配置Python虚拟环境的完整流程与实战技巧。通过安装Anaconda、创建独立环境、解决常见错误及结合深度学习项目应用,帮助用户有效管理依赖、避免冲突,并利用环境持久化策略提升在Colab中的开发效率与项目可复现性。

weixin_29204121的博客 339

通过汇编寻址方式修改数据

比如说有这么一条记录 这些数据在内存中存放的位置如下所示 如果这个时候这个公司的情况发生了改变,情况如下所示 这个时候我们需要去对这些数据利用汇编指令进行修改,我们可以这么做 mov ax,seg mov ds,ax mov bx,60h ;确定了记录的地址 ds:bx mov word ptr [bx+0ch],38 add word p...

rv0p111 1657

UDS19 03 和19 04服务--答疑

UDS 1903服务(reportDTCSnapshotIdentification)用于获取ECU中存储的故障码快照标识信息。该服务返回DTC编号及对应的快照记录编号,为后续使用1904服务读取详细快照数据提供依据。请求报文为"1903",响应报文格式为"5903"后接DTC编号和记录编号列表。该服务需在非默认会话模式下执行,且清除诊断信息会删除相关快照记录。1903服务是读取DTC快照数据的基础步骤,可帮助确定ECU中存储的故障快照情况。

汽车软件开发 454

Android 13.0 USB 麦克风音频采集优化:解决延时、杂音和无声问题

摘要:本文针对Android智能会议设备中USB麦克风存在的三大问题(录音延时、概率性杂音和无声)进行了深入分析和优化。通过预填充静音帧降低90%启动延时,分离采集/播放互斥锁消除杂音,采用持久化配置解决无声问题,并新增状态通知机制提升用户体验。优化后测试显示:录音延时从1200-2000ms降至100-200ms,故障率降至0%,CPU占用降低30%。该方案适用于各类USB音频设备和视频会议系统,为低延时音频采集提供了可靠解决方案。

ip0417的博客 229

【C++引用超详细笔记, 引用、指针和值传递的汇编级辨析,对象、继承和引用】

C++引用的超详细笔记,讲清楚引用的本质,引用、指针和值传递方式在汇编语言层面的对比 ,对象,继承和引用的具体使用。

m0_57721815的博客 1131

从养殖场到科技前沿:YOLOv11+OpenCV精准计数鸡蛋与鸡

YOLOv11结合OpenCV技术,精准识别和计数鸡蛋与鸡,广泛应用于养殖场、市场监控和自动化包装。通过深度学习与计算机视觉,提升农业生产效率,让智能化管理更简单高效。

专注于深入研究多种编程语言,以实战为导向,逐步拓展开发技能,提升工程化编码和思维能力,展现无敌技术实力。 1205
上一篇: Prof-UIS 2.50
下一篇: 探究Windows2000/XP原型PTE
iiprogram
博客等级 码龄25年 1068粉丝 1515原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值