首先,我們來了解一些簡單的的彙編知識:
1:簡單的彙編指令
mov 移值 mov dword ptr[ ebp - 4 ],14h
lea 移位址 lea eax , [ ebp - 4 ]
push 壓棧 push 10
pop 出棧 pop eax
add 累加 add eax , 4
sub 累減 sub eax , 4
2:暫存器
eax、ebx、ecx、edx
ebp 棧底指標暫存器
esp 棧頂指標暫存器
pc 下一行指標暫存器
有了簡單的了解之後我們可以利用組合語言了解函式堆疊呼叫的過程:
#includeint myadd(int a,int b)
int main()
一、形參是怎樣開闢的?
int main()
首先我們來看主函式的反彙編**:
int myadd(int a,int b)
一、形參是怎樣開闢的?
形參由呼叫方開闢,呼叫方清理
二、形參的入棧順序是怎樣的?
從右向左,依次入棧(通常支援可變引數的語言都是由右向左依次入棧)
三、函式返回值是如何帶出來的?
通常由暫存器帶回
0 ~ 4個位元組 暫存器帶回
5 ~ 8個位元組 兩個暫存器帶回
大於8個位元組 臨時量帶回
四、函式呼叫結束後怎樣退回到呼叫方?
壓棧過程中壓入了呼叫方的棧底指標(暫存器的位置)
五、函式呼叫結束為什麼會沿著呼叫點繼續執行?
call指令壓入了下一行指令
六、清棧
被呼叫方開闢的空間;讓ebp回到呼叫方;清理呼叫方開闢的形參
函式呼叫堆疊
一 函式呼叫堆疊 認真體會每一行指令位址!include intsum int a,int b mov ebp,esp 讓esp回退到ebp的位置,回退棧幀的過程中,沒有對棧幀中的值進行清0的操作 pop ebp 出棧並把出棧的值賦給ebp int main 下圖為上面示例函式,程式在sum函式中,...
函式呼叫堆疊
一 棧 1 傳統的棧 被定義為乙個特殊的容器,使用者可以將資料壓入棧中,也可以將壓入 棧中的資料彈出,但必須遵守一條規則 先進後出。2 計算機系統中的棧 是乙個有以上屬性的動態記憶體區域,壓棧操作使得棧增大,彈出操作使棧減小。棧通常是向下增長的。3 最重要的是棧儲存了乙個函式呼叫所需的維護資訊,這通...
函式呼叫堆疊
乙個函式的執行在棧上開闢記憶體。在函式呼叫時,第乙個進棧的是主函式呼叫語句的下一條可執行語句的位址,然後是函式的各個引數。在大多編譯器中,引數是由右往左入棧的,然後再是函式中的區域性變數。下面給乙個例項 int sum int a,int b int main 其中,main函式的反彙編指令 其中,...