**:
參考了羅雲斌的一篇文章,很清晰
子程式如何訪問引數:
因為預設對堆疊操作的暫存器有 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基本可以忽略,詳細參見:
ESP,EBP 彙編關於引數的傳遞
子程式如何訪問引數 因為預設對堆疊操作的暫存器有 esp 和 ebp,而esp是堆疊指標,無法暫借使用,所以一般使用 ebp 來訪問堆疊,假定在乙個呼叫中有兩個引數,而且在 push 第乙個引數前的堆疊指標 esp 為 x,那麼壓入兩個引數後的 esp 為 x 8,程式開始執行 call 指令,ca...
關於引數的傳遞
解釋引數在方法中的傳遞過程,並通過記憶體解析圖的 方式,描繪出方法執行時記憶體的變化。可以使用今天課堂 來解釋 public class demo11 public static void main string args 此方法最後的輸出是 fun1 i 15 fun1 j 25 main i 1...
關於 final 的引數傳遞
考題題幹 在下面程式標明的位置處插入哪條語句會導致編譯錯誤?public class finaluse final int n use x,y,z,n static void use final int x,int y,final int z,int n 請考慮下面的選項 a x b y c y x...