編譯環境:Windows 10 + VS2015。 0、引言 函數調用的過程實際上也就是一個中斷的過程,本文演示和深入分析參數入棧、函數跳轉、保護現場、恢復現場等函數調用過程。 首先對三個常用的寄存器進行說明: EIP:指令指針,即指向下一條即將執行的指令的地址。 EBP:基址 ...
這里以一個簡單的C語言代碼為例,來分析函數調用過程 代碼: 首先說明,在堆棧中變量分布是從高地址到低地址分布,EBP是指向棧底的指針,在過程調用中不變,又稱為幀指針。ESP指向棧頂,程序執行時移動,ESP減小分配空間,ESP增大釋放空間,ESP又稱為棧指針。 下面來逐步分析函數的調用過程 .函數main執行,main各個參數從右向左逐步壓入棧中,最后壓入返回地址 .執行第 行, 個參數以從左向右的 ...
2012-07-20 15:11 0 18969 推薦指數:
編譯環境:Windows 10 + VS2015。 0、引言 函數調用的過程實際上也就是一個中斷的過程,本文演示和深入分析參數入棧、函數跳轉、保護現場、恢復現場等函數調用過程。 首先對三個常用的寄存器進行說明: EIP:指令指針,即指向下一條即將執行的指令的地址。 EBP:基址 ...
下面一段C程序: 如果在編譯時加上-g選項,那么用objdump反匯編時可以把C代碼和匯編代碼穿插起來顯示,這樣C代碼和匯編代碼的對應關系看得更清楚。反匯編的結果很長,以下只列出我們關心的部分。 要查看編譯后的匯編代碼,其實還有一種辦法是gcc -S main.c ...
在x86的計算機系統中,內存空間中的棧主要用於保存函數的參數,返回值,返回地址,本地變量等。一切的函數調用都要將不同的數據、地址壓入或者彈出棧。因此,為了更好地理解函數的調用,我們需要先來看看棧是怎么工作的。 棧是什么? 簡單來說,棧是一種LIFO形式的數據結構,所有的數據都是后進先出。這種 ...
在x86的計算機系統中,內存空間中的棧主要用於保存函數的參數,返回值,返回地址,本地變量等。一切的函數調用都要將不同的數據、地址壓入或者彈出棧。因此,為了更好地理解函數的調用,我們需要先來看看棧是怎么工作的。 棧是什么? 簡單來說,棧是一種LIFO形式的數據結構,所有的數據都是后進先出。這種 ...
在x86的計算機系統中,內存空間中的棧主要用於保存函數的參數,返回值,返回地址,本地變量等。一切的函數調用都要將不同的數據、地址壓入或者彈出棧。因此,為了更好地理解函數的調用,我們需要先來看看棧是怎么工作的。 棧是什么? 簡單來說,棧是一種LIFO形式的數據結構 ...
堆棧中的變量分布是從高地址到低地址分布,EBP是指向棧底的指針,在過程調用中不變,又稱為幀指針。ESP指向棧頂,程序執行時移動,ESP減小分配空間,ESP增大釋放空間,ESP又稱為棧指針。 下面逐步分解函數的調用過程: 1、函數main執行,main各個參數從右向左逐步壓入棧中 ...
http://gmd20.blog.163.com/blog/static/168439232015475525227/ ...
函數調用過程分析 1. 靜態變量和初始化 2. 堆棧幀 一個函數分為:函數序、函數體、函數跋 函數序:執行啟動工作,如:為局部變量保存堆棧中的內存 函數跋:在函數即將返回之前清理堆棧。 函數體:執行工作的地方 0x3cfc表示寄存器d2至d7、a2到a5中的值需要被保存 ...