參考了羅雲斌的一篇文章,很清晰
子程序如何存取參數:
因為缺省對堆棧操作的寄存器有 ESP 和 EBP,而 ESP是堆棧指針,無法暫借使用,所以一般使用 EBP 來存取堆棧,假定在一個調用中有兩個參數,而且在 push 第一個參數前的堆棧指針 ESP 為 X,那么壓入兩個參數后的 ESP 為 X-8,程序開始執行 call 指令,call 指令把返回地址壓入堆棧,這時候 ESP 為 X-C,這時已經在子程序中了,我們可以開始使用 EBP 來存取參數了,但為了在返回時恢復 EBP 的值,我們還是再需要一句 push ebp 來先保存 EBP 的值,這時 ESP 為 X-10,再執行一句 mov ebp,esp,根據上圖可以看出,實際上這時候 [ebp + 8] 就是參數1,[ebp + c]就是參數2。另外,局部變量也是定義在堆棧中的,它們的位置一般放在 push ebp 保存的 EBP 數值的后面,局部變量1、2對應的地址分別是 [ebp-4]、[ebp-8]。
使用一個簡單的程序測試一下,調試,查看匯編代碼:
打開寄存器,和內存窗口:
關於MOV EDI, EDI基本可以忽略,詳細參見:
http://www.cppblog.com/sleepwom/archive/2009/04/01/78541.html