通过一段汇编,加深对寄存器ESP和EBP的理解

一直对寄存器ESP和EBP的概念总是有些混淆,查看定义ESP是栈顶指针,EBP是存取堆栈指针。还是不能很透彻理解。之后借于一段汇编代码,总算是对两者有个比较清晰的理解。
下面是按调用约定__stdcall 调用函数test(int p1,int p2)的汇编代码
;假设执行函数前堆栈指针ESP为NN
push   p2    ;参数2入栈, ESP -= 4h , ESP = NN - 4h
push   p1    ;参数1入栈, ESP -= 4h , ESP = NN - 8h
call test    ;压入返回地址 ESP -= 4h, ESP = NN - 0Ch  
;//进入函数内
{
push   ebp                        ;保护先前EBP指针, EBP入栈, ESP-=4h, ESP = NN - 10h
mov    ebp, esp                   ;设置EBP指针指向栈顶 NN-10h
mov    eax, dword ptr  [ebp+0ch]  ;ebp+0ch为NN-4h,即参数2的位置
mov    ebx, dword ptr  [ebp+08h]  ;ebp+08h为NN-8h,即参数1的位置
sub    esp, 8                     ;局部变量所占空间ESP-=8, ESP = NN-18h
...
add    esp, 8                     ;释放局部变量, ESP+=8, ESP = NN-10h
pop    ebp                        ;出栈,恢复EBP, ESP+=4, ESP = NN-0Ch
ret    8                          ;ret返回,弹出返回地址,ESP+=4, ESP=NN-08h, 后面加操作数8为平衡堆栈,ESP+=8,ESP=NN, 恢复进入函数前的堆栈.
}
看完汇编后,再看EBP和ESP的定义,哦,豁然开朗,
原来ESP就是一直指向栈顶的指针,而EBP只是存取某时刻的栈顶指针,以方便对栈的操作,如获取函数参数、局部变量等。

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

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

相关文章

Redis和数据库 数据同步问题

Redis和数据库同步问题缓存充当数据库比如说Session这种访问非常频繁的数据,就适合采用这种方案;当然了,既然没有涉及到数据库,那么也就不会存在一致性问题;缓存充当数据库热点缓存读操作目前的读操作有个固定的套路&a…

matlab fspecial创建滤波算子

Fspecial函数用于创建预定义的滤波算子,其语法格式为:h fspecial(type) h fspecial(type,parameters,sigma)参数type制定算子类型,parameters指定相应的参数,具体格式为:typeaverage,为均值滤波&#xff…

hibernate jpa_JPA / Hibernate:基于版本的乐观并发控制

hibernate jpa本文是对Hibernate和JPA中基于版本的乐观并发控制的介绍。 这个概念已经很老了,上面已经写了很多东西,但是无论如何我都看到了它被重新发明,误解和滥用。 我在写它只是为了传播知识,并希望引起对并发控制和锁定的兴趣…

X86汇编快速入门

本文翻译自:http://www.cs.virginia.edu/~evans/cs216/guides/x86.html 本文描述基本的32位X86汇编语言的一个子集,其中涉及汇编语言的最核心部分,包括寄存器结构,数据表示,基本的操作指令(包括数据传送指令…

Django(三)框架之第二篇

https://www.cnblogs.com/haiyan123/p/7717788.html 一、知识点回顾 1、MTV模型 model:模型,和数据库相关的 template:模板,存放html文件,模板语法(目的是将变量如何巧妙的嵌入到HTML页面中)。 …

使用GDB调试C库

用gdb调试程序时,一般的函数都可以step进去,可是C库函数却直接跳过了。 网上找了些资料,记录一下! 1.安装C库的debug版本 [plain] view plaincopy print?sudo apt-get install libc6-dbg 安装完后,在/usr/lib目录下…

matlab imfilter对图像进行滤波

功能:对任意类型数组或多维图像进行滤波。 用法:B imfilter(A,H)    B imfilter(A,H,option1,option2,...)    或写作g imfilter(f, w, filtering_mode, boundary_options, size_options) 其中,f为输入图像,w为滤波掩模&…

MapStruct:将数据从一个bean传输到另一个bean

将数据从一种形式转换为另一种形式在IT行业中是一种被高度利用的概念。 MapStruct通过在编译时生成映射器实现,允许基于注释的Bean转换。 这样可以确保在运行时没有性能开销。 什么是MapStruct? MapStruct是一个代码生成器,它基于约定优于配…

eclipse发布rest_在Eclipse中高效运行HTTP / REST集成测试

eclipse发布rest最近,我有机会使用由我亲爱的Holger Staudacher编写的OSGi-JAX-RS-Connector库。 通过连接器,您可以通过将Path注释的类型注册为OSGi服务来轻松发布资源-实际上,它工作得很好。 对我来说,使用普通的JUnit测试编写…

gdb调试命令

本文主要参考自:http://www.cnblogs.com/zzx1045917067/archive/2012/12/26/2834310.html,进行了一点补充和编排;Core dump部分参考了:http://blog.ddup.us/?p176。 gdb是一个在UNIX环境下的命令行调试工具。 如果需要使用gdb调试…

分享一个windows下检测硬件信息的bat脚本

文件名必须以.bat结尾&#xff0c;如果出现闪退&#xff0c;请右击鼠标&#xff0c;以管理身份运行即可 echo offcolor 0atitle 硬件检测 mode con cols90sc config winmgmt start auto >nul 2<&1net start winmgmt 2>1nulsetlocal ENABLEDELAYEDEXPANSIONecho 主…

matlab imfinfo返回图像信息

语法&#xff1a; info imfinfo(filename,fmt) %输入图像名&#xff0c;图像的格式 info imfinfo(filename)%输入图像名 示例程序&#xff1a; info imfinfo(C:\test1.jpg) %返回图像信息&#xff0c;注意&#xff1a;输入必须字符串 info.Width …

Apache Camel 2.18发布–包含内容

本周发布了Apache Camel 2.18.0 。 此版本是重要版本&#xff0c;我将在此博客文章中重点介绍。 Java 8 Camel 2.18是要求Java 1.8的第一个发行版&#xff08;例如&#xff0c;容易记住的Camel 2.18 Java1.8。Camel2.17 Java 1.7&#xff09;。 我们采取了谨慎的方法&…

C# 中 FindControl 方法及使用

FindControl 的使用方法 FindControl (String id)&#xff1a; 在页命名容器中搜索带指定标识符的服务器控件。&#xff08;有点类似javascript中的getElementById(string)&#xff09; 今天做了一个打印的报表 &#xff0c;要求在指定位置显示列表中某字段的内容&#xff0c;…

matlab imresize对图像进行缩小放大

matlab中函数imresize简介&#xff1a; 函数功能&#xff1a;该函数用于对图像做缩放处理。 调用格式&#xff1a; B imresize(A, m) 返回的图像B的长宽是图像A的长宽的m倍&#xff0c;即缩放图像。 m大于1&#xff0c; 则放大图像&#xff1b; m小于1&#xff0c; 缩小图像。…

matlab imrotate图像旋转

B imrotate(A,angle) 将图像A&#xff08;图像的数据矩阵&#xff0c;既可以是灰度图像&#xff0c;也可以是RGB图像&#xff09;绕图像的中心点旋转angle度&#xff0c; 正数表示逆时针旋转&#xff0c; 负数表示顺时针旋转。返回旋转后的图像矩阵。 B imrotate(A,angle,met…

理解爬虫原理

1.简单说明爬虫原理 爬虫就是通过互联网各个沾点组成的节点网&#xff0c;通过代码返回给浏览器&#xff0c;然后解析这部分的代内容&#xff0c;将网页内的内容简洁地呈现在我们的面前。爬虫的流程可以分为&#xff1a;发送请求、获取响应内容、解析内容、保存数据。 2.使用 r…

带有Java DSL的Spring Integration MongoDB适配器

1引言 这篇文章解释了如何使用Spring Integration从MongoDB数据库中保存和检索实体。 为了实现这一点&#xff0c;我们将使用Java DSL配置扩展来配置入站和出站MongoDB通道适配器。 例如&#xff0c;我们将构建一个应用程序&#xff0c;使您可以将订单写入MongoDB存储&#xff…

matlab linspace

用法&#xff1a;linspace(x1,x2,N)   功能&#xff1a;linspace是Matlab中的一个指令&#xff0c;用于产生x1,x2之间的N点行矢量。其中x1、x2、N分别为起始值、中止值、元素个数。若缺省N&#xff0c;默认点数为100。在matlab的命令窗口下输入help linspace或者doc linspac…

Linux strace命令

简介 strace常用来跟踪进程执行时的系统调用和所接收的信号。 在Linux世界&#xff0c;进程不能直接访问硬件设备&#xff0c;当进程需要访问硬件设备(比如读取磁盘文件&#xff0c;接收网络数据等等)时&#xff0c;必须由用户态模式切换至内核态模式&#xff0c;通 过系统调用…