文章目录

  • 前言
  • 环境
  • 函数
    • 构架模型
    • 编写代码:
  • 堆栈传参
    • ESP寻址
    • 堆栈平衡
    • EBP寻址

前言

本文汇总五个重点,为了学起来更加方便我将他们按照递进关系重新排列。分别是:

函数、传参、ESP寻址、堆栈平衡、EBP寻址。

看完本文就能感受到我这么安排的用意。

环境

为了更加深入理解,先假设你接到了一项任务:用汇编语言实现一个两数相加求结果的功能,并且要多次使用。

函数

因为要多次使用该功能,所以我们要选择函数来解决。和c语言差不多,汇编的函数也是在一个“模块”中调用另一个“模块”。这只是笼统的介绍,下面演示一下实际操作:

构架模型

函数外部:

1、将第一个数存入寄存器;

2、将第二个数存入另一个寄存器;

函数内部:

3、将他们两个相加,返回值会覆盖第一个寄存器的数据。

4、将返回值复制到EAX寄存器(为了规范,返回值默认存入EAX)

编写代码:

MOV ECX,1             //第一个数存入ECXMOV EDX,2             //第二个数存入EDXADD ECX,EDX           //相加,返回值覆盖ECXMOV EAX,ECX

F8单步执行,观察寄存器数值变化。

执行完结果应如图所示:

这里为了直观,进行了简写,将函数外部的赋值也加了进来,实际上只有3、4实在函数里的;

函数内部功能已经实现了,如果要调用这个函数使用CALL指令和JMP指令都可以,如果忘了这两个指令的区别,再去看一下我前面的博客。

CALL 271000

相必很多人都发现了,假如要求二十个数的计算式,但是寄存器就这么几个,这种方法肯定就不适用了。

我们采用的这种方式,叫做寄存器传参,当然也有堆栈传参;

堆栈传参

ESP寻址

上面已经介绍了寄存器传参,接下来针对堆栈传参进行学习;

跳过模型构建直接来看我写好的代码:

PUSH 1PUSH 2CALL 0027100Dcall指向地址:MOV EAX,DWORD PTR SS:[ESP+4] //当内存中括号中包含ESP或者EBP的话                                 用SSADD EAX,DWORD PTR SS:[ESP+8]
RET

运行结果如图所示,注意观察堆栈和寄存器:

上面所写的[ESP+4]等就是ESP寻址。

ESP的优点就是,使用起来很方便,很简单。但是缺点就是有时候会改变ESP的值,导致程序错误。

堆栈平衡

堆栈平衡:在函数执行前,堆栈应该是一致的,也就是说ESP的值是相同的。否 则会导致数据错误。

1、如果要返回父程序,则当我们在堆栈中进行堆栈操作的时候,一定要保证在RET这条指令之前,ESP指向的是我们压入栈中的地址。

2、如果通过堆栈传递参数了,那么在函数执行完毕后,要平衡参数导致的堆栈变化。

上一次提到堆栈平衡是在刚接触堆栈时,使用的MOV对堆栈操作,需要sub或者add来恢复ESP的值。之后引入了PUSH和POP指令以后,就默认堆栈平衡。

但是仔细看我们写出来的函数,F7单步执行观察可以发现执行完毕后压入堆栈中的1和3,也就是求和的两个数,还在里面。

虽然不影响程序,但是会占用更多地空间,浪费资源,这对一个程序员来说是最不能忍受的。

第一个解决方法,使用add指令:

ADD ESP,8

同样,也可以使用RET返回父程序:

RET 8            //返回父程序,并且堆栈后退八位

使用EBP寻址就可以解决这个问题;

EBP寻址

PUSH 1
PUSH 2
CALL 0027100D
PUSH EBP
MOV EBP,ESP
SUB ESP,10          //提升堆栈
MOV EAX,DWORD PTR SS:[EBP+8]  //通过EBP获得参数  参数位置 +4
ADD EAX,DWPRD PTR SS:[EBP+0xC]
MOV ESP,EBP
POP EBP         //恢复堆栈

1、将EBP中的数据保存在ESP中,ESP向上移动。

2、这样我们就可以利用EBP进行寻址,从而避免了ESP数值收到影响。

3、结束时也要恢复EBP的值。

有些时候,我们不仅需要将数据压入栈中。比如在执行函数前我们需要对原有的寄存器数值进行备份。我还是示范一下吧,有一个坑,就是出栈要倒着来。

PUSH ECX
PUSH EDX
PUSH EBX
...................
POP EBX
POP EDX
POP ECX

滴水的汇编差不多就剩下最后的JCC指令了,这就是个打基础的过程,学着学着猛的发现现在软件的汇编代码我多少能看懂一点了,虽然一整块的汇编还是搞不清他到底干了什么,但是随着不断做题不断联系,这都是很容易达到的。

汇编(五)堆栈平衡和寻址方式-ESP EBP相关推荐

  1. ESP定律和堆栈平衡

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

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

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

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

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

  4. 汇编-栈帧-寄存器esp, ebp

    转载 原文地址 栈帧%ebp,%esp详解 分类专栏: 汇编 首先应该明白,栈是从高地址向低地址延伸的.每个函数的每次调用,都有它自己独立的一个栈帧,这个栈帧中维持着所需要的各种信息.寄存器ebp指向 ...

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

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

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

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

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

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

  8. 关于计算机的作文初一,关于初一作文汇编五篇

    关于初一作文汇编五篇 在学习.工作.生活中,大家都经常看到作文的身影吧,写作文可以锻炼我们的独处习惯,让自己的心静下来,思考自己未来的方向.相信很多朋友都对写作文感到非常苦恼吧,下面是小编帮大家整理的 ...

  9. 转专业考试c语言,关于转专业申请书汇编五篇

    关于转专业申请书汇编五篇 在当今社会生活中,申请书在生活中的使用越来越广泛,申请书是承载我们愿望和请求的专用书信.写申请书时理由总是不够充分?以下是小编收集整理的转专业申请书5篇,仅供参考,希望能够帮 ...

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

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

最新文章

  1. SqlParameter参数方式操作数据库(存储过程)
  2. 【Android 高性能音频】Oboe 开发流程 ( 包含头 Oboe 头文件 | 创建音频流 | 设置音频流 | 音频流回调类 AudioStreamCallback )
  3. 开始学习RED HAT LINUX了
  4. SDUT-2144 图结构练习——最小生成树
  5. C# Web实时消息后台服务器推送技术---GoEasy
  6. AO 直接调用GeoProcessing 工具
  7. linux开机出现一下错误Give root password for maintenance (or type Control-D to continue):
  8. redis-full-check
  9. 泊松分布的期望和方差_表白不怕白努力,几何分布来帮忙
  10. Selenium API-WebElement 方法
  11. Sharepoint学习笔记—ECM系列—找不到Content Type Publishing链接
  12. linux 如何开启shell,linux下开启Shell命令
  13. 【HTML5+MVC4】xhEditor网页编辑器图片上传
  14. Wireshark实战分析之DHCP协议(一)
  15. SpringBoot+zk+dubbo架构实践(三):部署Dubbo-admin管理平台
  16. 人力资源管理系统HRMS 天下三分 煮酒论英雄
  17. 基于FPGA的cameralink编解码测试系统设计
  18. 解决echart时间显示问题
  19. 树莓派制作遥控小车教程
  20. 大数据竞赛-----DC竞赛ANC

热门文章

  1. 3dmax如何拆分模型_3dmax怎么拆分模型画贴图
  2. bzoj 4082: [Wf2014]Surveillance 倍增
  3. Flash遮罩之溜光字制作一
  4. python输入一个三位数输出百位十位个位_编程实现:输入一个三位数,输出其百位、十位、个位上的数字。_学小易找答案...
  5. 神经网络做多元线性回归,神经网络是线性模型吗
  6. MyBatis官方文档-简介
  7. 电子计算机x射线断层扫描,CT——电子计算机X射线断层扫描技术.pdf
  8. ie11代理服务器不能修改,ie11浏览器主页无法修改
  9. java 浏览器 pdf_使用Java Servlet在浏览器中显示Pdf
  10. 基于python的三维射线追踪库-ttcrpy详解(3)