【C++】汇编分析

news2024/11/23 22:00:38

传参

有的是用寄存器传参,有的用push传参
我在MSVC编译测出来的是PUSH传参(debug模式),具体过程如下

long func(long a, long b, long c, long d,
    long e, long f, long g, long h) {
    long sum;
    sum = (a + b + c + d + e + f + g + h);
    return sum;
}

int main() {
    long sum;
    sum = func(1, 2, 3, 4, 5, 6, 7, 8);
    std::cout << sum << std::endl;
    return 0;
}

调用方:

汇编
在这里插入图片描述

push 是将操作数压到栈顶,然后移动栈顶(esp)
push前:
在这里插入图片描述
push一次后:
在这里插入图片描述
call前:
在这里插入图片描述

进入函数func

汇编
在这里插入图片描述
分析:

  1. 前3条是经典的移动堆栈
    移动后:
    在这里插入图片描述
    注意这个ebp = 00ff68c, 理论上它应该是等于call前的esp即00ff694,为何相差8.
    首先push ebp让esp向下移动4,剩下的4是函数返回地址,即call指令的下一条指令地址
    具体栈信息如图:
    在这里插入图片描述
    可以看到栈从下往上,先压入了参数,后压入了call前的ebp。

返回值

在这里插入图片描述

可见是通过eax寄存器返回的。

总结

可以回答以下几个问题:

  1. 如何传参,通过push指令将参数压入栈,然后call
  2. 参数放在哪:因为调用是先push再call, 进入函数后参数在栈下面,也就是不在[ebp, esp)这个范围内,通过ebp+x来取得参数。
  3. 局部变量在哪:进入函数后的3条指令开辟了新的栈空间即[ebp, esp), 局部变量在栈空间内,通过ebp-x来取值。
  4. 函数执行完恢复调用方的堆栈信息:进入函数后先将调用方的ebp压入栈,然后移动堆栈,调用方的ebp就存在当前栈底,即ebp指向的就是,退出函数时有个mov esp, ebp;pop ebp 动作就是将栈底的值给ebp寄存器。就恢复了调用方的堆栈
  5. 返回值,返回值简单时通过寄存器返回。
  6. 为什么参数的入栈信息总是从右到左:栈是向上增长的,先入栈的参数处于高位地址,压栈完后从低地址往高地址看,参数顺序就是从左向右了。
  7. ret指令: 跳转到当前栈顶的地址,然后esp-4
  8. call指令:将下一条指令地址压入栈,然后esp+4
  9. 调用函数栈信息如下:
//func的栈
-esp
...
-ebp   ----- 调用方的ebp
-ebp-4  返回地址
- ebp-8 参数1
- ...
- 参数 n

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2087257.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

《机器学习》文本数据分析之关键词提取、TF-IDF、项目实现 <上>

目录 一、如何进行关键词提取 1、关键词提取步骤 1&#xff09;数据收集 2&#xff09;数据准备 3&#xff09;模型建立 4&#xff09;模型结果统计 5&#xff09;TF-IDF分析 2、什么是语料库 3、如何进行中文分词 1&#xff09;导包 2&#xff09;导入分词库 3&#xff09…

智能优化特征选择|基于鲸鱼WOA优化算法实现的特征选择研究Matlab程序(SVM分类器)

智能优化特征选择|基于鲸鱼WOA优化算法实现的特征选择研究Matlab程序&#xff08;SVM分类器&#xff09; 文章目录 一、基本原理鲸鱼智能优化特征选择&#xff08;WOA&#xff09;结合SVM分类器的详细原理和流程原理流程 二、实验结果三、核心代码四、代码获取五、总结 智能优化…

js | XMLHttpRequest

是什么&#xff1f; 和serve交互数据的对象&#xff1b;能够达到页面部分刷新的效果&#xff0c;也就是获取数据之后&#xff0c;不会使得整个页面都刷新&#xff1b;虽然名字是XML&#xff0c;但不限于XML数据。 怎么用&#xff1f; function reqListener() {console.log(thi…

理解数据库系统的内部结构

数据库系统在我们的数字世界中扮演着关键角色。本文将介绍数据库系统的内部结构&#xff0c;帮助初学者了解其基本概念。 数据库系统的三级模式 数据库系统内部采用三级模式二级映像结构&#xff0c;包括外模式、模式和内模式。这种结构确保了数据的逻辑独立性和物理独立性。…

全能型AI vs 专业型AI:未来是草莓味的AI吗?

草莓&#xff1a;全能型AI的新宠儿&#xff1f; 根据最近的消息&#xff0c;OpenAI的“草莓”模型据说是一个全能型AI&#xff0c;无论是解数学题还是搞定主观营销策略&#xff0c;它都能轻松驾驭。这个AI不仅仅是能解决问题&#xff0c;更是能够跨越多个领域&#xff0c;展现出…

C++学习/复习补充记录 --- 图论(深搜,广搜)

数据结构与算法 | 深搜&#xff08;DFS&#xff09;与广搜&#xff08;BFS&#xff09;_深搜广搜算法-CSDN博客 深度优先搜索理论基础 深搜和广搜的区别&#xff1a; &#xff08;通俗版&#xff09; dfs是可一个方向去搜&#xff0c;不到黄河不回头&#xff0c;直到遇到绝境了…

消费电子钛时代到来!天工股份抢占发展高地,业绩爆发式增长、前景广阔

消费电子“钛时代”正加速到来。 27日凌晨&#xff0c;苹果正式定档iPhone 16系列新品的发布会日期。据悉&#xff0c;本次iPhone 16 Pro系列将全系标配钛金属中框&#xff0c;继续沿用并升级此前在iPhone 15 Pro系列上应用的钛金属材质。 回看去年9月秋季新品发布会&#xf…

三秒学会--百度网盘下载提速10倍的小tip

开启优化速率 从2mb-->20mb 纵享新丝滑~

PHP安装扩展包时忽略依赖强制安装

正常安装时会检查依赖包&#xff0c;比如是否安装了reids扩展&#xff0c;是否安装了gd库等&#xff0c;卖到依赖包安装失败。 如下提示&#xff1a; 这样会导致你的包安装不上。 使用下面命令&#xff0c;强制安装&#xff0c;如下&#xff1a; 加上 --ignore-platform-req…

常见概念 -- dBm, mW,dB之间的关系

dBm与mW dBm&#xff08;毫瓦分贝&#xff09;与mW&#xff08;毫瓦&#xff09;都是光功率的单位。 两者之间的换算关系&#xff1a;dBm10xlgP。其中P为功率&#xff0c;单位为mW。 如&#xff1a;1mW可换算为0dBm。 dBm与dB dBm为光功率的单位&#xff0c;d…

GraphPad Prism下载安装教程怎样中文汉化

GraphPad Prism下载安装教程怎样中文汉化&#xff1a; GraphPad Prism 是一款集生物统计、曲线拟合和科技绘图于一体的软件&#xff0c;主要用于医学和生物科学领域的数据分析和绘图&#xff0c;具有高效、简便、多功能和高质量的特点&#xff0c;被广泛应用于科研、教育和业界…

告别繁琐,拥抱简单!用户好评如潮的录屏软件

不论你是有游戏过程录制的需求&#xff0c;还是教学片段录制的需求肯定都需要电脑屏幕录制工具吧。除了小巧便捷的ocam录屏之外还有不少类似工具可供我们选择。这次我就给你介绍几款我用过的录屏工具吧。 1.福昕录屏大师 链接&#xff1a;www.foxitsoftware.cn/REC/ 这款录屏…

智慧猪场实训中心解决方案

一、引言 随着科技的飞速发展&#xff0c;传统养猪业正经历着前所未有的变革。为了提高养猪效率、降低生产成本并保障猪只健康&#xff0c;智慧养猪场的概念应运而生。唯众特此推出《智慧猪场实训中心解决方案》&#xff0c;旨在通过先进的技术与管理手段&#xff0c;为养猪业培…

MQ专题:延迟消息的通用方案

一、主要内容 本文将实现一个MQ延迟消息的通用方案。 方案不依赖于MQ中间件&#xff0c;依靠MySQL和DelayQueue解决&#xff0c;不管大家用的是什么MQ&#xff0c;具体是RocketMQ、RabbitMQ还是kafka&#xff0c;本文这个方案你都可以拿去直接使用&#xff0c;可以轻松实现任…

【安规电容】

安规电容&#xff08;Safety Capacitors&#xff09;是一种专门设计用于电气设备中的电容器&#xff0c;主要用于确保电气安全&#xff0c;特别是用于交流电路中的滤波、降噪以及跨接隔离等功能。它们必须符合特定的安全标准&#xff0c;以确保电气设备在各种运行条件下都能保持…

MySQL:简述数据库的主从复制

MySQL主从复制是指数据可以从一个MySQL数据库主节点复制到一个或多个从节点。 MySQL默认采用异步复制方式&#xff0c;这样从节点不用一直访问主节点来更新自己的数据&#xff0c;数据的更新可以在远程连接上进行&#xff0c;从节点可以复制主节点中的所有数据库或者特定的数据…

FastJson序列化驼峰-下划线转换问题踩坑记录

背景 问题描述 在MySQL数据表中&#xff0c;存在一个JSON结构的扩展字段&#xff0c;通过updateById进行更新写入操作。更新写入的同一个字段名出现了混合使用了驼峰命名和下划线命名两种格式。 ps: FastJson版本是1.2.83 问题影响 数仓同学离线统计数据时发现字段名有两种…

【生命之树】

题目 思路 求联通区域中的最大和值 代码 #include <bits/stdc.h> using namespace std; const int N 1e510, M N << 1; const int null -0x3f3f3f3f; long long w[N]; int h[N], e[M], ne[M], idx; void add(int a, int b) // 添加一条边a->b {e[idx] b,…

虚幻5|(1)技能栏快捷格子的制作|(2)如何在游戏进行的时候显示鼠标,使用鼠标操作UI||(3)改进技能释放

一.创建技能栏格子UI 1.创建一个UI控件蓝图&#xff0c;命名为技能栏格子&#xff08;如何创建我就不多说了&#xff0c;学到这了基础知识应该有所掌握了&#xff09; 2.添加一个边界和垂直框 3.选中边界&#xff0c;右侧细节栏更改如下 4.再拖入一个文本块&#xff0c;做垂直…

java同步概念

同步&#xff08;Synchronization&#xff09;在Java多线程编程中是一个既重要又复杂的概念。它涉及到如何确保多个线程在访问共享资源时能够保持数据的一致性和完整性&#xff0c;避免出现竞态条件&#xff08;Race Condition&#xff09;等问题。 同步的基本概念 同步的主要目…