为什么要使用堆栈

程序运行需要使用数据,那么数据存放在哪里呢,内存中.

首选存放位置是寄存器(运行速度快),但是由于可用的太少,所以就把数据存放在堆栈中.

但是要考虑存储位置的问题,要想精准的访问到存储的数据,就需要一个固定的内存地址(栈底)

数据从一个固定的位置开始,依次排列

函数内使用的局部变量都是临时存储的,如果每次调用都要往内存中存数据并且不去删除,就会造成很大的浪费

解决方法就是给他一块临时的空间,用完之后就覆盖掉,这就是开辟堆栈

具体代码示意图

具体堆栈示意图

为什么要保证堆栈平衡(保证数据环境)

程序在读写数据的时候是通过地址查找的,如果函数调用之前的堆栈与函数调用之后的堆栈不一致,就可能导致找不到数据或找到的数据错误,那么久有可能导致程序崩溃.

为什么要使用EBP寻址

EBP在程序的运行过程中有着特定的作用,保存数据的基址,根据这个特性,EBP一般不会被更改

但是在汇编中,函数需要用到的数据都会在运行前入栈,函数可以通过栈顶找到这些数据,所以在函数运行时,EBP就暂时失去了意义,所以我们就用它来临时保存开辟的栈底

也就是说,如果有一个数据(全局变量等)能够存储要索引的位置并且在函数运行时不会被改变,那么在函数运行时就可以用它来替代ESP去索引

如有错误请指正

[原创]浅析汇编之堆栈平衡相关推荐

  1. 汇编达人视频学习6(汇编眼中的函数、CALL指令执行函数、堆栈传参、堆栈平衡、外平栈、内平栈)

    title: 汇编达人视频学习6 date: 2021年8月4日 15点15分 tags: 汇编达人 categories: 汇编达人 21.汇编眼中的函数 1.什么是函数 函数就是一系列指令的集合, ...

  2. 从汇编角度理解 ebpesp 寄存器、函数调用过程、函数参数传递以及堆栈平衡

    关于函数参数的传递及堆栈指针的变化,一直缺乏系统的认识和了解,各种博客也只是片面的讲解某个局部知识点,并没有全局的把握和对栈的深刻理解.本文试图从汇编以及整体上,讲解函数调用时,堆栈的变化,以及到底是 ...

  3. 【汇编语言与计算机系统结构笔记15】子程序设计:调用与返回,保护与恢复寄存器,子程序的参数传递,堆栈平衡,结构伪操作 STRUC

    本次笔记内容: 20.子程序设计-1-1 21.子程序设计-1-2 22.子程序设计-1-3 注:我找到了对应内容的课件,请见我于GitHub的CS笔记仓库.因此,为了节省时间,我只记录老师上课强调的 ...

  4. 堆栈平衡:估计这是最详细的讲解堆栈平衡的了 vc++6.0

    转自:https://blog.csdn.net/lixiangminghate/article/details/43195717 #include <stdio.h> #include ...

  5. 在地址随机化的操作系统环境下的堆栈平衡

    最近学习汇编以及各种和汇编有关系的课,在看汇编代码的时候发现各种对esp啊ebp的操作,最后的目的很多是为了堆栈平衡,因为如果函数调用之前和之后的堆栈不一致,就可能导致找不到数据或者找错数据.然后就想 ...

  6. 【ARM汇编的堆栈问题】压栈运用|堆栈类型测试

    [ARM汇编的堆栈问题] ☀️作者简介:大家好我是IM汤姆凯特,大家可以叫我汤姆

  7. ESP定律和堆栈平衡

    一.什么是ESP 二. 例说ESP与OD的对比 三. 正式开讲ESP定律 四. ESP定律的运行栗子 五. 堆栈平衡讲解 六.ESP定律的变形用法

  8. 了解MSIL汇编和IL汇编评估堆栈

    .assembly extern mscorlib {}.assembly Test{.ver 1:0:1:0}.module test.exe.method static void main() c ...

  9. 【原创】VB利用堆栈实现算术表达式计算

    这个抽象算法早已为人所知,只不过在VB的公开文档中鲜见示例代码.于是,为了提高自己的程序设计水平,锻炼自己的能力,我写了如下代码. [VB代码版权所有,允许转载修改用作学习目的,转载必须注明来源] [ ...

  10. [原创] PowerPC 汇编入门与优化

    PowerPC Figure – PPC入门与优化 By Skywind(2007) http://www.joynb.net/blog/ 背景介绍 PowerPC于1991年IBM/MOTO/APP ...

最新文章

  1. android ajax 跨域更新本地html,本地webapp是怎么解决跨域问题的?
  2. Beanstalkd使用
  3. db服务器作用,数据库服务器
  4. 阿里 BladeDISC 深度学习编译器正式开源
  5. 2020年上半年小程序互联网发展报告
  6. ZooKeeper 概念讲的好
  7. 378.有序矩阵中第K小的元素
  8. todo Java 并发编程
  9. 开源库TinyXML2简介及使用
  10. 富士施乐打印机DP P355d设置说明
  11. 客户关系管理系统(CRM)的开发过程中使用到的开发工具总结
  12. 2020 年最具潜力 44 个顶级开源项目,涵盖 11 类 AI 学习框架、平台(值得收藏)...
  13. []*T *[]T *[]*T 傻傻分不清楚
  14. 联想IdeaPad Z460在Win10环境下BIOS刷白名单
  15. 建木(Jianmu)----迈出建木第一步创建项目分组
  16. Portainer -- Docker可视化管理工具的安装配置及使用
  17. JUC笔记(三)多线程的核心
  18. pyspark ValueError: Some of types cannot be determined after inferring
  19. OPPO 2020届全球校园招聘启动
  20. Manifest merger failed问题:tools:replace=android:theme和tools:replace=android:icon

热门文章

  1. 明华澳汉 sle_4442 卡 读写
  2. java 输入人名输出_Java 输入汉字姓名 输出 姓名拼音 首字母缩写组合
  3. cmd复制文件到其他目录
  4. band math函数_Envi中波段运算(bandmath)常用的函数
  5. c语言课程设计,学生信息管理系统
  6. 双管道(CreatePipe)与cmd.exe进程间通信的有关问题 完美解决
  7. 计算机sense服务无法启动,workstation服务无法启动解决办法
  8. 六自由度机器人设计过程-范例
  9. C语言测量平差课程设计,测量平差课程设计-20210419024415.docx-原创力文档
  10. android 放大镜功能,Android 做一个放大镜的效果(转)