簡單的函式呼叫,通過反彙編可以清楚了解
舉例:
#include int add(int a,int b)
int main(void)
這是乙個簡單的通過呼叫函式計算兩數之和的程式
vc6.0生成的彙編**如下:
ebp:棧低(高位址),esp:棧頂(低位址)
add函式
push ebp //ebp=1000 esp=896
mov ebp,esp //ebp=896 esp=896 至此add棧往上依次是 main棧ebp,返回位址,引數
sub esp,44h //ebp=896 esp=828
push ebx
push esi
push edi //ebp=896 esp=816
lea edi,[ebp-44h]
mov ecx,11h
mov eax,0cccccccch
rep stos dword ptr [edi]
int c=0;
mov dword ptr [ebp-4],0
c=a+b;
mov eax,dword ptr [ebp+8]
add eax,dword ptr [ebp+0ch]
mov dword ptr [ebp-4],eax
return c;
mov eax,dword ptr [ebp-4] //在add函式返回以前,都是在操作自己的區域性變數的棧空間
pop edi
pop esi
pop ebx //ebp=896 esp=828 在add函式返回以前恢復暫存器的值
mov esp,ebp//ebp=896 esp=896
pop ebp //ebp=1000 esp=900
ret //ebp=1000 esp=904 把返回位址從main棧中彈出到指令暫存器 esp+4
main函式
push ebp
mov ebp,esp //得到main棧的棧頂位址,為了敘述方便假設此時的棧基址 ebp=1000 esp=1000
sub esp,4ch //為main棧開闢76個位元組的區域用於區域性變數使用 ebp=1000 esp=924
push ebx
push esi
push edi //需要保護的暫存器值壓棧 ebp=1000 esp=912
lea edi,[ebp-4ch]
mov ecx,13h
mov eax,0cccccccch
rep stos dword ptr [edi] //區域性變數初始化,debug模式下是此值,release模式區域性變數為不定值
int x=0;
mov dword ptr [ebp-4],0
int y=3;
mov dword ptr [ebp-8],3
int z=4;
mov dword ptr [ebp-0ch],4 //區域性變數按照定義的順序儲存在main棧中
x=add(y,z);
mov eax,dword ptr [ebp-0ch]
push eax
mov ecx,dword ptr [ebp-8]
push ecx //把引數按照stdcall方式從右到左壓棧 ebp=1000 esp=904
call @ilt+15(_add) (00401014)//把返回位址壓棧並跳轉至add函式 ebp=1000 esp=900
add esp,8 //引數部分的出棧工作由呼叫函式來完成 ebp=1000 esp=912
mov dword ptr [ebp-4],eax //返回的變數放到x中
return 0;
反彙編 函式巢狀呼叫
實現的功能 兩層函式呼叫,外層函式的傳入的兩個引數再傳到子函式中相加,實現四個數相加返回 004010e8 6a 03 push 3 壓入3 004010ea 6a 02 push 2 壓入2 004010ec 6a 01 push 1 壓入1 004010ee e8 12ffffff call s...
簡單反彙編之if判斷
什麼都是從簡單開始發展的,反彙編也不例外,最近學習了如何在vc中檢視及反彙編 反彙編在新手看來都是很神秘的東西 也包括我 感覺很牛,不過也倒是,反彙編猶如武俠中的 吸星 這個比喻一點都不過分,會了 吸星 的人想要誰的功夫只要一伸手就可以得來,不過能練成 吸星 的牛人也不多,因為在練習的時候要堅受苦練...
反彙編深入分析函式呼叫
函式 int fun inta,intb int main f11 跟蹤到fun,alt 8 看反彙編 00401078push1100h 引數壓棧,這裡遵循 cdecl 呼叫規範,引數由右向左 0040107d push8899h 壓棧 00401082call ilt 0 fun 0040100...