汇编之EBP的认识。
说到EBP就不能忽略了ESP。ESP是一个指针,始终执行堆栈的栈顶。而EBP就是那个所谓的堆栈了。
先看几个例子吧。
push ebp ; 把ebp,堆栈的0地址压入堆栈
mov ebp,esp ; 把栈顶指针存入当前堆栈esp,也就是堆栈的esp位置。
push ecx ; 存入 ecx 参数
push 00000002 ; 存入 2 参数
push 00000001 ; 存入 1 参数局
lea ecx,[ebp-] ; 把堆栈借(用负数)一个位置,4字节长。赋值给ecx,这个值是多半是上层传递下来的。
call 00401020 ; 调用指定地址的函数。
mov esp,ebp
pop ebp
ret
.... 00401020处代码(理解成一个函数):
push ebp ; 进入函数代码了,然后把存入进来的0地址ebp,保存到堆栈。
mov ebp,esp ; esp保存到ebp里面,保存到
push ecx ; 存入 ecx到堆栈中。
mov [ebp-],ecx ; 堆栈中借一个位置来存放ecx.
mov eax,[ebp+] ; 从堆栈中取值, 上面一个函数,存入的参数参数2
add eax,[ebp+0C] ; 从堆栈中取值,上面一个函数存入的参数1
mov esp,ebp ; 把 ebp首地址的值写回到 esp中。
pop ebp ; 释放 ebp中的0地址到ebp中。
ret 0008 ; 释放掉 可能是释放掉一个call地址和其中在本次函数中push的一个值。这样解释比较合理。(就是使用ebp开辟的一个空间值)
上面代码主要就是一个,传入参数调用函数进行一个1+2的计算。
先解释一下上面代码:
可以通过这个认识到几点。
1、如果使用了push ebp mov ebp,esp 操作进行初始化。
那么从堆栈中取值都是ebp+XXX值。。
而往堆栈里面,放入值都是[EBP-XXX],寄存器。这样的操作。
2、ebp应该就是针对当前函数,作用域独立存在的一个堆栈的首地址了。
而ESP就是,执行当前栈顶的一个指针,这个作用域是跨越了所有函数调用的。
。。。。个人理解,没有配图,请大家参考其他文章相应理解,我仅仅作为个人理解记录。
想再想想,大学时候,鄙视别人看的书,现在自己也拾起来看了。唉
汇编之EBP的认识。的更多相关文章
- 转:汇编中EBP寄存器和ESP寄存器的区别
EBP和ESP都是汇编中关于指针的寄存器.但是定义不同: (1)ESP:栈指针寄存器(extended stack pointer),其内存放着一个指针,该指针永远指向系统栈最上面一个栈帧的栈顶.(2 ...
- (六)羽夏看C语言——函数
写在前面 由于此系列是本人一个字一个字码出来的,包括示例和实验截图.本人非计算机专业,可能对本教程涉及的事物没有了解的足够深入,如有错误,欢迎批评指正. 如有好的建议,欢迎反馈.码字不易,如果本篇 ...
- 汇编之 eax, ebx, ecx, edx, esi, edi, ebp, esp??
一般寄存器:AX.BX.CX.DXAX:累积暂存器,BX:基底暂存器,CX:计数暂存器,DX:资料暂存器 索引暂存器:SI.DISI:来源索引暂存器,DI:目的索引暂存器 堆叠.基底暂存器:SP.BP ...
- 汇编 EBP ,ESP 寄存器
知识点: CALL框架 EBP寄存器 栈底指针 ESP寄存器 栈顶指针 一.EBP栈底指针 EBP是一个特殊的寄存器,通过EBP+偏移量 可以访问CALL里边的局部变量.它的低16位叫BP ...
- GDB调试汇编堆栈过程分析
GDB调试汇编堆栈过程分析 分析过程 这是我的C源文件:click here 使用gcc - g example.c -o example -m32指令在64位的机器上产生32位汇编,然后使用gdb ...
- Beennan的内嵌汇编指导(译)Brennan's Guide to Inline Assembly
注:写在前面,这是一篇翻译文章,本人的英文水平很有限,但内嵌汇编是学习操作系统不可少的知识,本人也常去查看这方面的内容,本文是在做mit的jos实验中的一篇关于内嵌汇编的介绍.关于常用的内嵌汇编(AT ...
- 20145212——GDB调试汇编堆栈过程分析
GDB调试汇编堆栈过程分析 测试代码 #include <stdio.h> short val = 1; int vv = 2; int g(int xxx) { return xxx + ...
- C程序汇编运行模式简析
SJTUBEAR 原创作品转载请注明出处 /<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 1. 汇编 ...
- gdb调试汇编堆栈过程的学习
gdb调试汇编堆栈过程的学习 以下为C源文件 使用gcc - g code.c -o code -m32指令在64位的机器上产生32位汇编,然后使用gdb example指令进入gdb调试器: 进入之 ...
随机推荐
- Xshell无法连接到LINUX虚拟机
首先与遇到的情况是,在虚拟机下安装了Linux后,xshell无法连接远程的虚拟机. 我遇到的情况是虚拟机可以ping 主机,主机确ping不了虚拟机. 使用的VM设置了两个网卡,一个nat 一个h ...
- 【django基础补充之URL,视图,模版】
一.url路由配置 URL配置(URLconf)就像Django 所支撑网站的目录.它的本质是URL与要为该URL调用的视图函数之间的映射表:你就是以这种方式告诉Django,对于这个URL调用这段代 ...
- Tomcat8配置Https协议,Tomcat配置Https安全访问,Tomcat Https配置
Tomcat8配置Https协议,Tomcat配置Https安全访问,Tomcat Https配置 ============================== ©Copyright 蕃薯耀 2017 ...
- 如何跳出页面的Frame框架
摘录自:http://blog.csdn.net/clare504/article/details/9347363 很多网页都是框架结构的,在很多的情况下会通过按钮点击事件或链接,跳出框架转到其它界面 ...
- java中的按位与运算
package scanner; public class SingleAnd { public static void main(String[] args) { int[] first = {10 ...
- IOS @proporty 关键字(一)retain strong
@interface User : NSObject @property (nonatomic,retain) NSString* tRetain; @property (nonatomic,assi ...
- TemplateMethod-模板模式
什么是Template Method模式 在父类中定义处理流程的框架,在子类中实现具体处理的模式就称为Template Mehtod模式.模板模式的关键是:子类可以置换掉父类的可变部分,但是子类却不可 ...
- elasticsearch安装ik分词器
一.概要: 1.es默认的分词器对中文支持不好,会分割成一个个的汉字.ik分词器对中文的支持要好一些,主要由两种模式:ik_smart和ik_max_word 2.环境 操作系统:centos es版 ...
- 本地计算机上的OracleOraDb10g_home1TNSListener服务启动后又停止了..........解决办法
方法1.直接修改 listener.ora 我机器上的路径是: D:/Oracle/product/10.2.0/db_1/NETWORK/ADMIN/listener.ora 修改其中的 HOST ...
- CopyOnWriteArrayList集合排序异常问题
1.集合自定义排序实现 对List集合的自定义排序想必大家都知道要使用如下的方式,通过实现Comparator接口并实现compare方法来实现. /** * * @方法名 changeChain * ...