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是在堆栈中寻址用的
|