學習筆記 calling convention

2021-05-24 01:27:39 字數 1401 閱讀 4548

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開發人員可以快速地支援實現這些模式的服務和應用程式。他們將在任...