1.什麼是calling convention?
中文譯為呼叫約定。再細說就是在函式呼叫過程中,主調函式與被調函式之間的約定。如下func1就是主調函式,func2就是被調函式
void func1()
func2(params);
2.為什麼要有呼叫約定?
為了進行堆疊平衡。何謂堆疊平衡,函式在呼叫過程中,要對函式引數進行壓棧操作,因此在函式呼叫之後,雙方需要約定由誰來進行這些壓棧操作的恢復。
3.都有哪些呼叫約定?
_cdecl,_stdcall,thiscall,fastcall etc,其中比較重要的是前兩種。其中_cdecl約定為呼叫方進行堆疊平衡,_stdcall約定為被調方進行堆疊平衡。
介紹完了一些基本的概念,下面用乙個例子來進一步說明問題:
c++**非常簡單:
void_stdcalltest_convention(int a) //這裡首先將函式宣告為_stdcall,約定被調方,也就是被調函式進行堆疊平衡
void main()
程式生成的反彙編**:
test_convention(1);
//將變數1壓棧
0041145e push 1
//函式呼叫
00411460 call 004111a4
f11跟進call之後的**,反彙編如下:
void _stdcall test_convention(int a)
{//***********此處省略若干行*********
//這句是關鍵,相當於esp + 8(ret本身相當於+4),被調方進行堆疊平衡
0041141c ret 4
然後我們將函式的呼叫約定修改為_cdecl,約定為呼叫方進行堆疊平衡
void _cdecltest_convention(int a)
test_convention(1);
0041144e push 1
00411450 call 0041119f
同樣f11跟進去之後
//**********此處省略若干行**********
//只有一句ret
ret//但在主調函式生成的彙編**中,呵呵確實如此,呼叫方進行堆疊平衡
00411455 add esp,4
至此為止,堆疊平衡的大概原理講述完畢,如果想進一步深入的了解函式呼叫的組合語言過程,不妨隨便寫個函式反彙編一下看看。
對了,如果你也像我一樣是個菜鳥,不妨google一下esp和ebp的意思,相信會對你有所幫助。
第一篇部落格,值得紀念一下:)
2010-1-06 global_var
學習筆記 雜湊學習筆記
hash基本原理 hash就是乙個像函式一樣的東西,你放進去乙個值,它給你輸出來乙個值。輸出的值就是hash值。一般hash值會比原來的值更好儲存 更小 或比較。那字串hash就非常好理解了。就是把字串轉換成乙個整數的函式。而且要盡量做到使字串對應唯一的hash值。它的主要思路是選取恰當的進製,可以...
學習筆記 CentOS 學習筆記01
簡單的做個課堂筆記 虛擬機器用的是vmware,系統是centos cd etc sysconfig network scripts pwdls 顯示列表 cat ifcfg eth0 檢視檔案內容 vi ifcfg eth0 進入vi編輯器 onboot no 原始設定 x逐字刪除 d刪除整行 a...
筆記 spring cloud 學習筆記
1 spring cloud 是什麼 spring cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具 例如配置管理,服務發現,斷路器,智慧型路由,微 控制匯流排 分布式系統的協調導致了樣板模式,使用spring cloud開發人員可以快速地支援實現這些模式的服務和應用程式。他們將在任...