EBP与ESP寄存器的使用】的更多相关文章

push ebp mov esp,ebp esp是堆栈指针 ebp是基址指针 这两条指令的意思是将栈顶指向ebp的地址 --------------------------------------------------------------- 例如: push ebp ;ebp入栈 mov ebp, esp ;因为esp是堆栈指针,无法暂借使用,所以得用ebp来存取堆栈 sub   esp, 4*5 ;下面的wsprintf一共使用了5个参数,每个参数占用4个字节,所以要入栈4*5个字节 p…
知识点:  CALL框架  EBP寄存器 栈底指针  ESP寄存器 栈顶指针 一.EBP栈底指针 EBP是一个特殊的寄存器,通过EBP+偏移量 可以访问CALL里边的局部变量.它的低16位叫BP.//EAX和AX的关系 二.ESP栈顶指针 ESP栈顶指针与EBP构成的一段空间大小,一般就是本CALL局部变量的空间大小总和.ESP指针配合EBP使用.//SP 三.代码分析 void fun1(void) { //0401000 /$ 55 PUSH EBP //保存栈环境或者叫保存EBP指针…
EBP和ESP都是汇编中关于指针的寄存器.但是定义不同: (1)ESP:栈指针寄存器(extended stack pointer),其内存放着一个指针,该指针永远指向系统栈最上面一个栈帧的栈顶.(2)EBP:基址指针寄存器(extended base pointer),其内存放着一个指针,该指针永远指向系统栈最上面一个栈帧的底部. 也就是说ESP是栈顶指针,EBP是取堆栈指针. 其中上面提到了一个栈帧的概念,百度百科的解释为"过程活动记录,是编译器用来实现函数调用的一种数据结构".也…
最近在分析一个进程崩溃的严重问题,其中有些过程分析需要对ebp, esp 有清晰的理解,对于ebp 和esp 相信大家都很熟悉了,但是为了使本文自成体系,我还是解释一下. ebp--栈底指针 esp--栈顶指针 如图所示,简化后的代码调用过程如下: void Layer02() { int b = 2; } void Layer01() { int a = 1; Layer02(); } 那么函数执行过程中ebp和esp是如何变化的呢?如下是反汇编后的代码: void Layer02() { 0…
位的寄存器.如果用C语言来解释,可以把这些寄存器当作变量看待. 比方说:add eax,-2 ;   //可以认为是给变量eax加上-2这样的一个值. 位寄存器有多种用途,但每一个都有"专长",有各自的特别之处. EAX 是"累加器"(accumulator),它是很多加法乘法指令的缺省寄存器. EBX 是"基地址"(base)寄存器,在内存寻址时存放基地址. ECX 是计数器(counter),是重复(REP)前缀指令和LOOP指令的内定计数器…
目的:通过分析c语言转换成汇编代码后的执行过程对汇编语言和X86构架有一个初步认识 实验代码 #include <stdio.h> int g(int x) { ; } int f(int x) { return g(x); } int main(void) { ) + ; } 实验过程 编译 1.使用cd Desktop切换至桌面 2.使用touch 1-1.c在桌面建立1-1.c这个文件 3.在1-1.c这个文件中输入我们的代码,保存 4.使用此命令gcc –S –o main.s mai…
目的:通过分析c语言转换成汇编代码后的执行过程对汇编语言和X86构架有一个初步认识 实验代码 1 #include <stdio.h> 2 3 int g(int x) 4 { 5 return x + 3; 6 } 7 8 int f(int x) 9 { 10 return g(x); 11 } 12 13 int main(void) 14 { 15 return f(8) + 1; 16 } 实验过程 编译 1.使用cd Desktop切换至桌面 2.使用touch 1-1.c在桌面建…
本周学习了汇编指令以及通过反汇编一个小程序来了解栈的变化 写了一个简单的C程序,如图所示: 通过gcc -s -o main.s main.c -m32指令将其编译成汇编程序 打开该汇编文件并删除不重要的信息,如图所示: 分析该汇编指令(为了方便直接用手写画图,为了区分不同时期的寄存器,将其后面加了个括号,括号里的数字表示该寄存器的第几种状态) 如图所示: 首先执行main函数 pushl %ebp :将esp的值减4(指向下一帧栈地址),并将ebp寄存器里的值存入esp此时指向的栈地址. Mo…
一.本周学习情况 我本周结合<庖丁解牛>教材学习了蓝墨云的视频课,主要学习内容如下: 1.学习了计算机的工作原理,深入理解了冯诺依曼体系结构. 2.学习了X86-32 CPU的寄存器 3.学习了寻址方式和常用汇编指令 - 立即数即常数,如$8,表示$开头后跟一个数值: - 寄存器数,表示某个寄存器中保存的值,如%exa - movL表示32位指令 - 通用寄存器: - EAX:累加器 - EBX:基地址寄存器 - ECX:计数寄存器 - EDX:数据寄存器 - ESI:源变址寄存器 - EDI…
6 调用栈实例分析 本节通过代码实例分析函数调用过程中栈帧的布局.形成和消亡. 6.1 栈帧的布局 示例代码如下: //StackReg.c #include <stdio.h> //获取函数运行时寄存器%ebp和%esp的值 #define FETCH_SREG(_ebp, _esp) do{\ asm volatile( \ "movl %%ebp, %0 \n" \ "movl %%esp, %1 \n" \ : "=r" (_…