菜雞剛學彙編,總結下。**有錯誤歡迎指出。
函式呼叫一般有個模板。
push ebp
mov ebp,esp
//這裡提公升堆疊
sub esp,0x40
//這裡是開闢緩衝區,不同編譯器開闢的緩衝區大小不同。
push edi
push esi
push ebx
//保留現場
lea edi, dword ptr ss:[ebp-0x40]
mov ecx,0x10
mov eax,0xcccccccc
rep stos dowrd ptr es:[edi]
//填充緩衝區
----------------
這裡是寫函式的功能
----------------
pop ebx
pop esi
pop edi
//恢復現場
mov esp,ebp
pop ebp
ret
執行完上面**,堆疊圖差不多就是這個樣子,(該圖,下面是高址,上面是低址)
中間的ccc…就是填充緩衝區。填充後可以用來寫入區域性變數。
ebp後面的高址,存有恢復用的eip,和call函式前push的引數。
ebp前面的低址,用來存區域性變數。
根據函式呼叫約定的不同,堆疊平衡的方式不同
如果是__cedcl約定,是在母函式中平衡堆疊,就是函式呼叫完返回後,在呼叫者裡add esp,xx來平衡堆疊。
有幾種函式呼叫約定,不同的呼叫約定,引數的傳遞,堆疊的平衡方式不同。下面是三種常見的呼叫約定:
__cedcl 約定
引數從右往左,依次入棧。堆疊平衡在母函式中完成。
在函式呼叫前,將引數壓棧。
push ***
push ***
…然後call 函式。
//函式執行完畢
add esp ,xx
//在母函式中平衡堆疊
stdcall 約定
引數從右往左依次入棧,在子函式中 平衡堆疊。
引數還是在呼叫前push 入棧。
平衡堆疊時,在 ret 後加個 xx 恢復堆疊
例如 ret 0x8,相當於 pop eip add esp,0x8
fastcall 約定
引數從右往左依次入棧,在子函式中 平衡堆疊
引數1個或者兩個用 暫存器 傳參,多於兩個,多餘兩個的部分還是壓棧傳參。
例如 (int a,int b,int c)
push c
mov eax,b
mov ecx,a
然後再call 函式,最後在子函式中平衡堆疊。
通過VC學習反彙編 函式呼叫 呼叫約定
呼叫約定決定了以下內容 函式引數的壓棧順序 由呼叫者還是被呼叫者平衡堆疊。3.1 cdecl cdecl是c和c 程式的預設呼叫約定 引數通過堆疊來傳遞,從右向左依次入棧,由呼叫者平衡堆疊。同樣的 我們在addint函式前面加上 cdecl呼叫約定 int cdecl addint int a,in...
彙編學習(4)彙編指令舉例
位元組 記為byte,乙個位元組由8個bit組成,可以存在8位暫存器中。字 word,乙個字由兩個位元組組成。注 乙個字可以存在乙個16位暫存器中,這個字的高位位元組和低位位元組自然就存在這個暫存器的高8位暫存器和低8位暫存器中。十六進製制中的一位相當於二進位制數中的四位。幾條彙編指令 彙編指令 操...
從彙編看函式呼叫
首先介紹幾個名詞 棧幀 也叫過程活動記錄,是編譯器用來實現過程 函式呼叫的一種資料結構。棧幀中儲存了該函式的返回位址和區域性變數。暫存器 cpu內部用來存放資料的一些小型儲存區域,用來暫時存放參與運算的資料和運算結果。常用的暫存器有 esp 棧指標暫存器 extended stack pointer...