3.堆栈的理解

堆栈是同一段进行插入删除的线性表 (先入后出)

栈式最基础的常见的数据结构之一

进入一个新的函数的时候 会开辟一个空间,存放需要的数据

int add(int a,int b,int c)
{
  return a+b+c
}
int main()
{
  add(1,2,3)
}

//add(1,2,3)反汇编中的代码
push 3  //将3压栈 ESP栈顶减少4个字节 相当于将3压入栈后 栈顶向上提升
push 2  //将2压栈 ESP栈顶减少4个字节 相当于将2压入栈后 栈顶向上提升
push 1  //将1压栈 ESP栈顶减少4个字节 相当于将1压入栈后 栈顶向上提升
call 00E0142E //将下一行地址压栈,并且跳转  简单理解保存函数的内存地址方便跳回,看到这个代码就是执行函数
//F11跳转进函数  jmp 00S002 //跳转到函数中
add esp,0Ch // 还原数据走这一句 将栈顶跳转到 push之后 增加 12 个字节 3 2 1 每一个整形是4字节加起来是12



//跳到这里
//ESP EBP 栈的寄存器  S栈顶  B栈底 
//EAX EBX ECX EDX 是存基础变量的一些数据
//EIP 是存放即将运行下一行代码的地址
push ebp //将栈底的地址放入栈中,栈底的地址是上一个方法的底部,在压入栈底的同时,栈顶也向上提升
mov ebp,esp //将esp赋值给ebp  将栈顶的值赋值给栈底 把栈底拉上来,方便开辟新空间
sub esp,0C0H //在将栈顶的值拉高
push ebx //备份寄存器 保存多少看编译器 栈顶提升
push esi //备份寄存器 保存多少看编译器 栈顶提升
push edi //备份寄存器 保存多少看编译器 栈顶提升


//下面的语句是运算过程
lea edi,[ebp+FFFFF4 0h]
nov ecx,30h
nov eax,0CCCCCCCCh
rep stos  dvord ptr es:[edi]
mov ecx,0E0F027h
call 00E01280
//下面是运算的代码
mov eax,dword ptr [ebp+8] //dword ptr 相当于4字节  可以不写,ebp+8是参数1
add eax,dword ptr [ebp+0Ch] //ebp+8是参数2 第一个参数加第二个参数
add eax,dword ptr [ebp+10h] //ebp+8是参数3 第一个参数和第二个参数的和在加第三个参数
mov dword ptr [ebp-8],eax //将和复制给局部变量
mov eax,dword ptr [ebp-8]  //再将值赋值给eax 当作返回值,eax经常会被用当返回值

//执行完后还原的操作
pop edi //将备份的寄存器 弹出 并且栈顶下降
pop esi //将备份的寄存器 弹出 并且栈顶下降
pop ebx //将备份的寄存器 弹出 并且栈顶下降
add esp,0C0H //将栈顶还原位置 这个时候 栈顶与栈底相同
pop ebp //弹出栈底 ebp变回上一次方法的栈底地址,栈底下降一级
ret  //返回call保存的地址 并且栈顶下降一级,跳转到刚进入的add esp,0Ch 语句


在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Redis 线程控制 总结

前言 相关系列 《Redis & 目录》(持续更新)《Redis & 线程控制 & 源码》(学习过程/多有漏误/仅作参考/不再更新)《Redis & 线程控制 & 总结》(学习总结/最新最准/持续更新)《Redis &a…

https://huggingface.co/上的模型无法用linux服务器clone怎么办(只需要稍微改一下网址,就可以切换到镜像下载)

问题描述: 在ubuntu系统上,使用如下命令,克隆仓库,报无法访问错误: git clone https://huggingface.co/distilbert/distilroberta-base通用解决方案: 把下面部分更换: https://huggingface.…

Scrapy框架原理与使用流程

一.Scrapy框架特点 框架(Framework)是一种软件设计方法,它提供了一套预先定义的组件和约定,帮助开发者快速构建应用程序。框架通常包括一组库、工具和约定,它们共同工作以简化开发过程。scrapy框架是python写的 为了爬…

为什么有0.35/Tr这一信号带宽定义

从频域幅值函数可以近似认为这是一个低通滤波器模型,可以采用RC网络模型来处理,根据电路理论计算电压10%到90%所需上升时间,再根据滤波器频域特性计算幅值在-3db处的频率极限,通过两个关系式可以计算出频率极大值和上升时间关系&a…

<<机器学习实战>>15-26节笔记:逻辑回归参数估计、梯度下降及优化、模型评价指标

梯度下降缺点:有可能有鞍点(如果不是凸函数的时候),不一定能找到最小值解决方法:随机梯度下降(选一条数据)和小批量梯度下降(选几条数据这两个解决方法又会带来新问题,比…

51单片机完全学习——LCD1602液晶显示屏

一、数据手册解读 通过看数据手册我们需要知道,这个屏幕每个引脚的定义以及如何进行发送和接收。通过下面这张图我们就可以知道,这些引脚和我们的编程是有关的,需要注意的是,这里我们在接线的时候,一定要把DB0-DB7接到…

变流升压一体机:能源领域的新兴力量与优秀品牌

在当今能源转型的大背景下,变流升压一体机作为一种创新型的电力设备,正逐渐成为新能源领域的关键角色。 变流升压一体机是一种综合性很强的光伏箱式变电站设备,它将储能变流器、升压变压器、高压环网柜、低压配电箱等多种设备集成在一个集装箱…

LeetCode.冗余连接(并查集以及广度优先搜索)

684.冗余连接| 传送门:. - 力扣(LeetCode) 树可以看成是一个连通且 无环 的 无向 图。 给定往一棵 n 个节点 (节点值 1~n) 的树中添加一条边后的图。添加的边的两个顶点包含在 1 到 n 中间,且这条附加的边不属于树中…

上线 24 小时,爆了!

产研团队(兼客服)已爆单🔥🚀💥!(bushi) 在此由衷感谢各位小伙伴的信任🤩! 还没有试用的小伙伴赶紧去围观👇️👇️👇️ …

高效数据集成案例:从聚水潭·奇门到MySQL

聚水潭奇门数据集成到MySQL的技术案例分享 在企业信息化建设中,数据集成是实现业务流程自动化和数据统一管理的关键环节。本文将分享一个具体的系统对接集成案例:如何将聚水潭奇门平台上的销售出库单数据高效、可靠地集成到MySQL数据库中,以…

AUTOSAR-Com模块

COM 文章目录 COMCOM 基础介绍COM主要功能AUTOSAR COM 模块 发送模型Signal 信号/信号组发送信号属性—Triggered属性Pending属性信号的初始化信号的对齐方式(大小端)信号的收发发送接收 字节序转换和符号扩展信号的过滤机制过滤处理信号传输模式信号流和…

【十进制转十六进制数】

【十进制转十六进制数】 C语言版本C 版本Java版本Python版本 💐The Begin💐点点关注,收藏不迷路💐 从键盘接收一个整数,编程实现将其转换成十六进制数。 输入 一个整数 输出 十六进制数 样例输入 100样例输出 6…

day01-ElasticStack+Kibana

ElasticStack-数据库 #官网https://www.elastic.co/cn/ #下载7.17版环境准备 主机名IP系统版本VMware版本elk110.0.0.91Ubuntu 22.04.417.5.1elk210.0.0.92Ubuntu 22.04.417.5.1elk310.0.0.93Ubuntu 22.04.417.5.1 单机部署ES 1.下载ES软件包,放到/usr/local下 […

HTML3D旋转相册

文章目录 序号目录1HTML满屏跳动的爱心(可写字)2HTML五彩缤纷的爱心3HTML满屏漂浮爱心4HTML情人节快乐

react18中react-thunk实现公共数据仓库的异步操作

redux及react-redux都只能实现数据的同步修改更新,有点类似于vue中的mutation,只能做同步操作,异步的话不用actions来实现。由于在项目始终不可避免要实现的异步数据的更新,这明显不够用了。是时候引入我们的异步中间件redux-thun…

计算机组成原理笔记9(指令系统,立即寻址,直接寻址,间接寻址.....)

指令操作码 操作码的位数决定了不同功能指令的多少,位数越多,所能表示的操作功能就越丰富。指令的操作码通常有两种编码格式: 定长操作码 定长操作码对于简化硬件设计,减少指令译码时间非常有利,例如IBM370指令系统&a…

Matlab 火焰识别技术

课题介绍 森林承担着为人类提供氧气以及回收二氧化碳等废弃气体的作用,森林保护显得尤其重要。但是每年由于火灾引起的事故不计其数,造成重大的损失。如果有一款监测软件,从硬件处获得的图像中监测是否有火焰,从而报警&#xff0…

uv: 一个统一的Python包管理工具

uv是由Astral公司开发的一个极其快速的Python包管理器,完全用Rust编写。它最初在2月份发布,作为pip工作流的替代品。现在,uv已经扩展成为一个端到端的解决方案,可以管理Python项目、命令行工具、单文件脚本,甚至Python本身。可以说,uv就像是Python界的Cargo:一个快速、可靠、易…

XQT_UI 组件|03 |加载组件 XQtLoading

XQtLoading 使用文档 简介 XQtLoading 是一个自定义的加载动画组件,旨在为用户提供可配置的旋转花瓣动画效果。它可以在应用程序中用于指示加载状态,提升用户体验。 特征 可配置性:用户可以根据需求调整旋转周期、缩放周期、最大/最小缩放…

置换环模板题E - Permute K times 2

输入样本 1 6 3 5 6 3 1 2 4样本输出 1 6 1 3 2 4 5每次操作后, P P P 都会发生如下变化: 第一次操作后, P P P 为 ( 2 , 4 , 3 , 5 , 6 , 1 ) (2,4,3,5,6,1) (2,4,3,5,6,1) 。第二次操作后, P P P 为 ( 4 , 5 , 3 , 6 , …