高级语言反汇编程序的函数调用过程

反汇编 还原成 汇编语言或其他 高级语言。 反汇编 通常,编写程序是利用高级语言如C,Pascal等语言进行编程的,后再经过编译程序生成可以 被计算机系统 直接执行的执行文件。反汇编即是指将这些执行文件反编译还原成 汇编语言或其他 高级语言。 立即下载

高级语言反汇编程序的函数调用过程
摘要:本文说明高级语言编译成汇编语言后,高级语言中函数调用的汇编程序过程。

正文:高级语言编译成汇编程序以后,在高级语言中的函数调用的汇编程序过程如下:

1.将函数参数入栈,第一个参数在栈顶,最后一个参数在栈底。

2.执行CALL指令,调用该函数,进入该函数代码空间。
a.执行CALL指令,将CALL指令下一行代码的地址入栈。
b.进入函数代码空间后,将基址指针EBP入栈,然后让基址指针EBP指向当前堆栈栈顶,并使用它访问存在堆栈中的函数输入参数及堆栈中的其他数据。
c.堆栈指针ESP减少一个值,如44H,向上移动一个距离,留出一个空间给该函数作为临时存储区。
{
   // 以上准备工作做好后,函数正式被执行,如下所示。
   d.将其他指针或寄存器中的值入栈,以便在函数中使用这些寄存器。
   e.执行代码。
   f.执行return()返回执行结果,将要返回的值存入EAX中。
   g.步骤2.d中的指针出栈。
}
h.将EBP的值传给堆栈指针ESP,使ESP复原为2.c之前的值。此时进入函数时EBP的值在栈顶。
i.基址指针EBP出栈,复原为2.b之前的EBP的值。
j.执行RET指令,“调用函数”的地址出栈,本函数返回到CALL指令的下一行。

3.函数返回到CALL指令下一行,将堆栈指针加一个数值,以使堆栈指针恢复到以上步骤1执行之前的值。该数值是上面第一步入栈参数的总长度。

注意:
1.堆栈指针ESP指向栈顶的新入栈数据的最低位。
2.MOV指令中偏移指针指向被“MOV”的数据的最低位。如下面指令是将ebp+8到ebp+11四个字节的内容传到eax寄存器中。
00402048   mov         eax,dword ptr [ebp+8]

一个例子如下:

高级语言代码中的函数调用如下:

117:      bR = t1(p);

汇编代码如下:

00401FB8   mov         ecx,dword ptr [ebp-8]   ;将参数放入ecx寄存器
00401FBB   push        ecx                     ;参数入栈
00401FBC   call        @ILT+10(t1) (0040100f)  ;函数调用,下一行地址00401FC1入栈
00401FC1   add         esp,4                   ;函数返回,堆栈指针加4,复原为00401FB8时的值
00401FC4   mov         dword ptr [ebp-10h],eax ;从eax中取出高级语言中的函数返回值,放入bR变量中

其中t1函数如下:

125:  BOOL t1(void* p)
126:  {
00402030   push        ebp                    ;ebp入栈
00402031   mov         ebp,esp                ;ebp指向此时堆栈的栈顶
00402033   sub         esp,44h                ;esp减少一个值,空出一段存储区
00402036   push        ebx                    ;将三个寄存器的值入栈,以便在函数中使用它
00402037   push        esi                    ;
00402038   push        edi                    ;
00402039   lea         edi,[ebp-44h]          ;
0040203C   mov         ecx,11h                ;
00402041   mov         eax,0CCCCCCCCh         ;
00402046   rep stos    dword ptr [edi]        ;
127:      int* q = (int*)p;                   ;
00402048   mov         eax,dword ptr [ebp+8]  ;ebp+8指向函数输入参数的最低位地址;
;如果是ebp+4则指向函数返回地址00401FC1的最低位,值为C1
0040204B   mov         dword ptr [ebp-4],eax  ;
128:      return 0;                           ;
0040204E   xor         eax,eax                ;返回值放入eax寄存器中
129:  }
00402050   pop         edi                    ;三个寄存器出栈
00402051   pop         esi                    ;
00402052   pop         ebx                    ;
00402053   mov         esp,ebp                ;esp复原
00402055   pop         ebp                    ;ebp出栈,它的值也复原了
00402056   ret                                ;返回到此时栈顶存储的代码地址:00401FC1
;故而如果不幸被修改了返回地址,程序就会出现意外

以上汇编代码由VC++6.0编译得到。

堆栈在EBP入栈后的情况:

       低位          高位
        ↓            ↓
内存地址      堆栈
        ┆            ┆
0012F600├──────┤← edi = 0012F600
        │            │
0012F604├─┄┄┄┄─┤
        │            │
        │            │
        ┆ 44h的空间  ┆
        ┆            ┆
        │            │
        │            │
0012F640├─┄┄┄┄─┤
        │            │
0012F644├──────┤← ebp被赋值后指向该单元,此时ebp=0012F644
        │AC F6 12 00 │ebp赋值为esp之前的值
0012F648├──────┤
        │C1 1F 40 00 │返回地址
0012F64C├──────┤← ebp + 8
        │A0 F6 12 00 │函数实参p的值
0012F650├──────┤
        │            │
        ├──────┤
        ┆            ┆

注:存储器存储空间堆栈按从高到低的排列,左边标注的地址是其右下方存储单元的最低位地址。如0012F644指向0012F6AC的AC字节,AC在栈顶。图中存储器中的内容按从低到高位书写,“AC F6 12 00”= 0x0012F6AC

superpowers-中文使用说明 《obra/superpowers:AI辅助开发的流程纪律工具集》 摘要:obra/superpowers是一套面向AI辅助软件开发的系统化流程规范,包含14个核心技能,强调"先理解后行动"的纪律性开发方法。该工具集定义了从头脑风暴到代码评审的完整工作流,要求严格遵循测试驱动开发、子代理隔离执行等原则。核心特色包括:1) 任何实现前必须完成设计和评审;2) 采用红-绿-重构的TDD循环;3) 复杂任务通过独立子代理串行处理;4) 所有产出需经过双重验证(规格合规+代码质量)。该工具集特别注重文档化和可验证性 阅读详情

相关推荐

sysrepo 开发者指南(一个基于libyang与支持rpc的数据库)

sysrepo 开发者指南(一个基于libyang与支持rpc的数据库) 日志记录 默认情况下,所有 Sysrepo 日志记录都处于关闭状态。如果启用,日志消息有 3 种输出。它们可以写入stderr、由 处理syslog或简单地传递给回调。 请务必注意,启用 Sysrepo 日志记录也会修改libyang日志记录设置。错误消息被视为标准 Sysrepo 错误,其他严重性较低的消息完全隐藏。要更改此行为,只需在启用 Sysrepo 日志记录后调整libyang日志记录设置。 此外,几乎每个 Sysrepo

weixin_43489394的博客 9231

C++中函数调用的整个过程内存堆栈分配详解

c++

u011555996的博客 4346

使用VS Code创建第一个Flutter工程

你可以使用任意文本编辑器结合命令行工具来开发Flutter应用。然而,我们推荐使用本文介绍的编辑器插件以获取更好的开发体验。这些插件提供了代码补全、代码高亮、widget辅助编辑等功能,以及为项目的运行和调试提供支持。推荐的开发工具有VS Code、Android Studio、IntelliJ。本文将重点介绍如何使用VS Code进行Flutter应用开发。

2501_91373349的博客 2129

C语言函数调用栈(一)

程序的执行过程可看作连续的函数调用。当一个函数执行完毕时,程序要回到调用指令的下一条指令(紧接call指令)处继续执行。函数调用过程通常使用堆栈实现,每个用户态进程对应一个调用栈结构(call stack)。编译器使用堆栈传递函数参数、保存返回地址、临时保存寄存器原有值(即函数调用的上下文)以备恢复以及存储本地局部变量。不同处理器和编译器的堆栈布局、函数调用方法都可能不同,但堆栈的基本概念是一样的。

slivelight的博客 1191

共轭梯度法(Conjugate Gradient Method)

我们要求解线性方程组 Ax=bAx=b 其中AA 是对称正定矩阵(spd),给定RnR^n中n个线性无关的向量r0,r1,⋯,rn−1r_0,r_1,\cdots,r_{n-1}, 我们想要构造另外的一组基p0,p1,⋯,pn−1p_0,p_1,\cdots,p_{n-1}, 并满足 ⟨pi,pj⟩=0,∀i≠j\langle p_i, p_j\rangle=0,\quad \forall i

Liang_Ling的博客 1万+

BurpSuite工具HaE插件好用正则收集

数据集合面板里面直接查询捕获到的相关数据内容,省去一个个翻找数据包内容的烦恼。插件捕获到匹配正则表达式的数据包后,可以在。可以对正则条目进行添加、编辑、删除。规则信息管理,我们点击。

墨痕诉清风的博客 657

汇编对sp指针进行修改_从汇编理解函数调用的过程

平时,绝大部分时间我们都基本是使用C语言进行程序的编写。而在C语言中,函数的调用是很简单:只需要把函数名写好,参数填好,然后放在需要调用的地方就行了。但是如果用汇编来写的话就不会这么简单了。下面我们从汇编的方式上对函数的调用进行一下理解。 我们知道PC寄存器的值是指向当前执行指令的地址,但往往调用函数和被调用函数他们的地址是不相连的,这里就引出了第一点--需要将PC的值进行更改,让其指向被调...

weixin_39633455的博客 1117

RK3588开发笔记-Buildroot编译Qt5WebEngine-5.15.10

Rockchip RK3588是一款强大的多核处理器,广泛应用于边缘计算、人工智能、嵌入式系统等领域。为了在RK3588上运行自定义的Linux系统,并使用Qt5WebEngine进行Web内容渲染,Buildroot是一个非常合适的工具。本文将详细介绍如何使用Buildroot编译并配置Qt5WebEngine-5.15.10。Qt5WebEngine是Qt框架中的一个模块,它提供了一个功能强大的Web浏览器引擎,允许开发者在Qt应用程序中嵌入和显示现代网页内容。

flypig has a dream! 1159

C语言 函数

函数的返回值类型 函数名 (函数的形参列表)函数体;return 表达式;

y2706586063的博客 131

金融数字化——详解2025年金融智能体深度应用报告【附全文阅读】

《2025年金融智能体深度应用报告》显示,金融智能体已实现80%部署率,推动行业效率提升30%-50%。报告指出智能体通过"感知-推理-规划-执行-进化"机制突破大模型局限,在风控、客服、投研等100+场景实现自动化。典型案例显示,工商银行信贷审批效率提升60%,蚂蚁数科智能客服解决80%问题。尽管面临系统协同、标准缺失等挑战,未来趋势将向多模态交互、自主进化和ESG投资等方向拓展。

cdfunlove的博客 207

YOLOv11涨点改进 | 全网独家下采样改进、细节涨点篇 | TGRS 2025 | 引入PWD参数化小波下采样模块,减少下采样过程中小目标的关键细节丢失,即插即用,助力高效涨点发论文

本文提出了一种改进YOLOv11小目标检测性能的参数化小波下采样(PWD)模块。PWD通过小波变换保留目标细节信息,增强频率域特征表达,有效解决了传统下采样导致的小目标信息丢失问题。该模块采用双分支设计,结合自适应频率选择和空间补偿机制,在红外图像和低光场景中表现出更强的抗干扰能力。实验表明,PWD能显著提升YOLOv11对弱纹理和低对比度目标的检测精度,同时保持计算效率。文章详细介绍了PWD的结构原理、实现代码及在YOLOv11中的集成方法,为小目标检测提供了有效的改进方案。

Ai缝合怪、助力小伙伴高效发论文 241

[转]高级语言反汇编程序的函数调用过程

高级语言反汇编程序的函数调用过程  Jim Chan高级语言编译成汇编程序以后,在高级语言中的函数调用的汇编程序过程如下:1.将函数参数入栈,第一个参数在栈顶,最后一个参数在栈底。2.执行CALL指令,调用该函数,进入该函数代码空间。a.执行CALL指令,将CALL指令下一行代码的地址入栈。b.进入函数代码空间后,将基址指针EBP入栈,然后让基址指针EBP指向当前堆栈栈顶,并使用它访问存在堆栈中的

jx_kingwei的专栏 1518

2026基金本子新规必看!聚焦四大底层问题,利用AI辅助分别破解提升中标率

我拟申报的研究主题为【明确的研究主题或关键词组合】。选题方向也是评审专家关注的核心之一,申报前可以检索近五年领域前人中标项目,分析现有研究的空白与不足,并结合自身研究基础选择 “人无我有、人有我优” 的细分方向,如果是交叉学科选题,则要阐述不同学科的融合逻辑与创新点。“推动国家战略”、“带来行业发展”等宏观表述,有很多同仁都喜欢用这类话术开篇,但实际上宏大叙事无法替代具体的真实科学问题,明确不了研究要解决的核心痛点,更没有说明问题的现实针对性,评审看了往往抓不到研究的核心价值。

智能AI让学术科研更容易 295

堆栈作用--高级语言反汇编程序的函数调用过程

转的他人的文章 【来源: 作者:iiprogram 2006-04-27 出处:pcdog.com】摘要:本文说明高级语言编译成汇编语言后,高级语言中函数调用的汇编程序过程。正文:高级语言编译成汇编程序以后,在高级语言中的函数调用的汇编程序过程如下:1.将函数参数入栈,第一个参数在栈顶,最后一个参数在栈底。 2.执行CALL指令,调用该函数,进入该函数代码空间。a.

1231

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

高级语言反汇编程序的函数调用过程[z]

摘要:本文说明高级语言编译成汇编语言后,高级语言中函数调用的汇编程序过程。正文:高级语言编译成汇编程序以后,在高级语言中的函数调用的汇编程序过程如下:1.将函数参数入栈,第一个参数在栈顶,最后一个参数在栈底。2.执行CALL指令,调用该函数,进入该函数代码空间。a.执行CALL指令,将CALL指令下一行代码的地址入栈。b.进入函数代码空间后,将基址指针EBP入栈,然后让基址指针EBP指向当前堆栈栈

379

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

高级语言反汇编程序的函数调用过程 (转)

高级语言反汇编程序的函数调用过程 (转)[@more@]高级语言反汇编程序的函数调用过程Jim Chan10/25/2001查看:字体:宋体 字形:常规 大小:小五 字符集:CHINESE_GB2312━━━━━━━━━━...

csd3176的博客 136

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

高级语言函数调用过程-bp,sp

sp作为基址指针访问函数的参数和函数中得局部变量,sp是栈顶指针,栈的方向是由大到小。 临时存储区做为函数局部变量的存储区域。 VC6.0中默认是40h大小,当函数中包含局部变量时,临时存储区会相应的扩充,局部变量占多少字节,临时存储区就增加多少字节。比如函数中有临时变量int a,则临时存储区扩充为44h大小。 摘要:本文说明高级语言编译成汇编语言后,高级语言中函数调用的汇

BlueMood1986的专栏 1735

用call和ret指令 来解释高级语言是如何执行函数调用的

今天汇编语言学到了 call指令和ret 指令,然后解决了一直以来c/c++(高级语言)是如何执行递归的过程。 首先我们来看一个简单的样例: C/C++ 程序 #include<iostream> using namespace std; void clac(int a,int b) { int ans=a+b; cout<<a+b<<endl; return; } int main() { clac(2,3); return 0; } 反汇编程序 D

yangzijiangac的博客 411
上一篇: 举例说明在汇编语言中,"[]"的用法
下一篇: 挂接CreateProcessW实现对进程创建的完全控制
普通网友
博客等级 码龄22年 1万+粉丝 3156原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值