对寄存器ESP和EBP的一些理解

 
  前言:对于经常接触逆向或者汇编的肯定都对push ebp,mov    ebp, esp这两句印象深刻,由于他们经常出现在过程的开头,这也是找段首的一个依据,但是,过程为啥总要以这两句开头,这其中又有什么道理呢?
  参考自:https://www.cnblogs.com/mengfanrong/p/5421878.html
 
以下是按调用约定__stdcall 调用函数test(int p1,int p2)的汇编代码
push   p2    ;參数2入栈, ESP -= 4h , ESP = 0xAAAAAA6
0xAAAAAAA - 8h =     call test    ;压入返回地址 ESP -= 4h, ESP = 0xAAAAA9D,注意:这里是test函数的。即在代码段中的地址(偏移)。
;//进入函数内
push   ebp                           ;保护先前EBP指针, EBP入栈(即0xAAAAAB0入栈。注意与返回地址差别), ESP-=4h, ESP = 0xAAAAA99
0xAAAAA99
;ebp+0ch为 mov    ebx, dword ptr  [ebp+08h]   ;ebp+08h为 sub    esp, 8                     ;局部变量所占空间ESP-=8, ESP = 0xAAAAA91
add    esp, 8                     ;释放局部变量, ESP+=8, ESP = 0xAAAAA99
 即把栈中地址0xAAAAA9D的内容pop到ebp中
0xAAAAAA2, 后面加操作数8为平衡堆栈,ESP+=8,ESP= }
原来ESP就是一直指向栈顶的指针,而EBP仅仅是存取某时刻的栈顶指针,以方便对栈的操作,如获取函数參数、局部变量等。
原文地址:https://www.cnblogs.com/2f28/p/9751178.html