汇编(五)堆栈平衡和寻址方式-ESP EBP
文章目录
- 前言
- 环境
- 函数
- 构架模型
- 编写代码:
- 堆栈传参
- 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相关推荐
- ESP定律和堆栈平衡
一.什么是ESP 二. 例说ESP与OD的对比 三. 正式开讲ESP定律 四. ESP定律的运行栗子 五. 堆栈平衡讲解 六.ESP定律的变形用法
- 从汇编角度理解 ebpesp 寄存器、函数调用过程、函数参数传递以及堆栈平衡
关于函数参数的传递及堆栈指针的变化,一直缺乏系统的认识和了解,各种博客也只是片面的讲解某个局部知识点,并没有全局的把握和对栈的深刻理解.本文试图从汇编以及整体上,讲解函数调用时,堆栈的变化,以及到底是 ...
- 汇编达人视频学习6(汇编眼中的函数、CALL指令执行函数、堆栈传参、堆栈平衡、外平栈、内平栈)
title: 汇编达人视频学习6 date: 2021年8月4日 15点15分 tags: 汇编达人 categories: 汇编达人 21.汇编眼中的函数 1.什么是函数 函数就是一系列指令的集合, ...
- 汇编-栈帧-寄存器esp, ebp
转载 原文地址 栈帧%ebp,%esp详解 分类专栏: 汇编 首先应该明白,栈是从高地址向低地址延伸的.每个函数的每次调用,都有它自己独立的一个栈帧,这个栈帧中维持着所需要的各种信息.寄存器ebp指向 ...
- 在地址随机化的操作系统环境下的堆栈平衡
最近学习汇编以及各种和汇编有关系的课,在看汇编代码的时候发现各种对esp啊ebp的操作,最后的目的很多是为了堆栈平衡,因为如果函数调用之前和之后的堆栈不一致,就可能导致找不到数据或者找错数据.然后就想 ...
- 堆栈平衡:估计这是最详细的讲解堆栈平衡的了 vc++6.0
转自:https://blog.csdn.net/lixiangminghate/article/details/43195717 #include <stdio.h> #include ...
- 【汇编语言与计算机系统结构笔记15】子程序设计:调用与返回,保护与恢复寄存器,子程序的参数传递,堆栈平衡,结构伪操作 STRUC
本次笔记内容: 20.子程序设计-1-1 21.子程序设计-1-2 22.子程序设计-1-3 注:我找到了对应内容的课件,请见我于GitHub的CS笔记仓库.因此,为了节省时间,我只记录老师上课强调的 ...
- 关于计算机的作文初一,关于初一作文汇编五篇
关于初一作文汇编五篇 在学习.工作.生活中,大家都经常看到作文的身影吧,写作文可以锻炼我们的独处习惯,让自己的心静下来,思考自己未来的方向.相信很多朋友都对写作文感到非常苦恼吧,下面是小编帮大家整理的 ...
- 转专业考试c语言,关于转专业申请书汇编五篇
关于转专业申请书汇编五篇 在当今社会生活中,申请书在生活中的使用越来越广泛,申请书是承载我们愿望和请求的专用书信.写申请书时理由总是不够充分?以下是小编收集整理的转专业申请书5篇,仅供参考,希望能够帮 ...
- 【ARM汇编的堆栈问题】压栈运用|堆栈类型测试
[ARM汇编的堆栈问题] ☀️作者简介:大家好我是IM汤姆凯特,大家可以叫我汤姆
最新文章
- SqlParameter参数方式操作数据库(存储过程)
- 【Android 高性能音频】Oboe 开发流程 ( 包含头 Oboe 头文件 | 创建音频流 | 设置音频流 | 音频流回调类 AudioStreamCallback )
- 开始学习RED HAT LINUX了
- SDUT-2144 图结构练习——最小生成树
- C# Web实时消息后台服务器推送技术---GoEasy
- AO 直接调用GeoProcessing 工具
- linux开机出现一下错误Give root password for maintenance (or type Control-D to continue):
- redis-full-check
- 泊松分布的期望和方差_表白不怕白努力,几何分布来帮忙
- Selenium API-WebElement 方法
- Sharepoint学习笔记—ECM系列—找不到Content Type Publishing链接
- linux 如何开启shell,linux下开启Shell命令
- 【HTML5+MVC4】xhEditor网页编辑器图片上传
- Wireshark实战分析之DHCP协议(一)
- SpringBoot+zk+dubbo架构实践(三):部署Dubbo-admin管理平台
- 人力资源管理系统HRMS 天下三分 煮酒论英雄
- 基于FPGA的cameralink编解码测试系统设计
- 解决echart时间显示问题
- 树莓派制作遥控小车教程
- 大数据竞赛-----DC竞赛ANC
热门文章
- 3dmax如何拆分模型_3dmax怎么拆分模型画贴图
- bzoj 4082: [Wf2014]Surveillance 倍增
- Flash遮罩之溜光字制作一
- python输入一个三位数输出百位十位个位_编程实现:输入一个三位数,输出其百位、十位、个位上的数字。_学小易找答案...
- 神经网络做多元线性回归,神经网络是线性模型吗
- MyBatis官方文档-简介
- 电子计算机x射线断层扫描,CT——电子计算机X射线断层扫描技术.pdf
- ie11代理服务器不能修改,ie11浏览器主页无法修改
- java 浏览器 pdf_使用Java Servlet在浏览器中显示Pdf
- 基于python的三维射线追踪库-ttcrpy详解(3)