EIP、ESP、EBP

1.EIP
2.ESP
3.EBP
1.EIP寄存器里存储的是CPU下次要执行的指令的地址
也就是调用完fun函数后,让CPU知道应该执行main函数中的printf("函数调用结束")语句了。
2.EBP寄存器里存储的是是栈的栈底指针,通常叫栈基址,这个是一开始进行fun()函数调用之前,由ESP传递给EBP的。(在函数调用前你可以这么理解:ESP存储的是栈顶地址,也是栈底地址。)
3.ESP寄存器里存储的是在调用函数fun()之后,栈的栈顶。并且始终指向栈顶。

堆栈是一种简单的数据结构,是一种只允许在其一端进行插入或删除的线性表。
允许插入或删除操作的一端称为栈顶,另一端称为栈底,对堆栈的插入和删除操作被称入栈出栈

有一组CPU指令可以实现对进程的内存实现堆栈访问。其中,POP指令实现出栈操作,PUSH指令实现入栈操作。

CPU的ESP寄存器存放当前线程的栈顶指针

EBP寄存器中保存当前线程的栈底指针

CPU的EIP寄存器存放下一个CPU指令存放的内存地址,当CPU执行完当前的指令后,从EIP寄存器中读取下一条指令的内存地址,然后继续执行。

esp和ebp区别

问题:
push ebp
mov esp, ebp
干嘛要这样?

--------------------------------------------------------------------------------
esp是堆栈指针 
ebp是基址指针
 

那两条指令的意思是 将栈顶指向 ebp 的地址 
--------------------------------------------------------------- 

楼主写的好像是要用GCC来编译的汇编? 

push    ebp     ;ebp入栈 
mov     ebp, esp ;因为esp是堆栈指针,无法暂借使用,所以得用ebp来存取堆栈
sub     esp, 4*5  ;下面的wsprintf一共使用了5个参数,每个参数占用4个字节,所以要入栈4*5个字节 
push    1111 
push    2222 
push    3333 
push    offset szFormat 
push    offset szOut 
call    wsprintf       ;调用wsprintf 
add     esp, 4*5     ;堆栈使用完毕,“还”回4*5个字节给系统 
... 
mov     esp, ebp     ;恢复esp的值 
pop     ebp        ;ebp出栈 
ret 

主要是用来保存/恢复堆栈,以便传递参数给函数。 
在MASM里面,有一条更方便的语句,就是invoke, 使用它后,你就不用自己做这些事情了。 
--------------------------------------------------------------- 
esp始终指向栈顶,ebp是在堆栈中寻址用的

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章