void myfunction(int a,int b)
int c=a+b;
(1)儲存ebp。ebp總是被我們用來儲存這個函式執行前的esp的值。執行完畢後,我們用ebp恢復esp;同時,呼叫此函式的上層函式也用ebp做同樣的事情。所以先把ebp壓入堆疊,返回之前彈出,避免ebp被我們改動。
push ebp
(2)儲存esp到ebp中。
;儲存ebp並把esp放入ebp中,此時ebp與esp同,都是這次函式呼叫時的棧頂
mov ebp,esp
(3)在堆疊中騰出區域來儲存區域性變數。
方法是:把esp減少乙個數值,這就等於壓入了一堆變數。要恢復時,只要把esp恢復成ebp中儲存的資料就可以了。
儲存ebx,esi,edi到堆疊中。函式呼叫後恢復。
sub esp,0cch
push ebx
push esi
push edi
(4)把區域性變數初始化成全0cccccccch。0cch實際是int 3指令的機器碼,是乙個斷點中斷指令。因為區域性變數不可能被執行,如果執行了,必然程式有錯
,這時發生中斷來提示開發者。這是vc編譯debug版本的特有操作。
lea edi,[ebp-0cch] ;本來是要mov edi,ebp-0cch,但是mov不支援ebp-0cch這樣的引數。所以對ebp-0cch取內容,而
;lea把內容的位址也就是ebp-0cch載入到edi中。目的是把儲存區域性變數的區域(從ebp-0cch開始的區域)初始化成全部0cccccccch
mov ecx,33h
mov eax,0cccccccch
rep stos dword ptr [edi] ;串寫入
(5)然後做函式裡應該做的事。引數的獲取是ebp+12位元組為第二個引數,ebp+8為第乙個引數(注意倒序壓入),依次增加。最後ebp+4位元組處是要返回的位址。
(6)恢復ebx,esi,edi,esp,ebp,最後返回。**如下:
pop edi ;恢復edi,esi,ebx
pop esi
pop ebx
mov esp,ebp ;恢復原來的ebp和esp,讓上乙個呼叫的函式正常使用
pop ebp
ret另外,該函式沒有返回值。如果要返回值,函式應該在返回之前,把返回值放入eax中,外部通過eax獲得返回值。
objdump 反彙編乙個函式的指令碼
1 使用system.map檔案查詢函式的起始位址和結束位址 2 使用objdump d 反彙編,然後通過 start address和 stop address引數指定函式區間 3 使用nm n out.elf system.map 命令生成system.map檔案 bin sh routine ...
C 反彙編揭秘1 乙個簡單的C 程式反彙編解析
本系列主要從彙編角度研究c 語言機制和彙編的對應關係。第一篇自然應該從最簡單的開始。c 的源 如下 class my class void method int n my class private int m member int tmain int argc,tchar argv 可以直接deb...
反彙編之簡單函式呼叫
簡單的函式呼叫,通過反彙編可以清楚了解 舉例 include int add int a,int b int main void 這是乙個簡單的通過呼叫函式計算兩數之和的程式 vc6.0生成的彙編 如下 ebp 棧低 高位址 esp 棧頂 低位址 add函式 push ebp ebp 1000 es...