Sunday, January 14, 2007

Calling Convention (呼叫慣例)

因為函式呼叫牽涉到參數的傳遞, 所以並不只是單純跳到那個Address執行程式碼再跳回來這麼簡單, 呼叫副程式(函式)的主程式, 需要知道怎麼填參數,副程式(函式)才能接到參數後進行處理, 再將結果, 傳給主程式, 所以這段協定, 稱之為Calling Convention(呼叫慣例)

但因為程式類型的不同(assambly, c/c++ , passcal ,fortran, vc .....), 並因為平台不同(Windows,Linux,MacOS,Unix...), 最主要的是CPU的不同(x86,PowerPC,Sparc.....), 所以這種協定就有很多方式, 此篇列出一些網路的資源


The Old New Thing 上的精彩文
1. The history of calling conventions, part 1
2. The history of calling conventions, part 2
3. The history of calling conventions, part 3
4. The history of calling conventions, part 4: ia64
5. Why do member functions need to be "static" to be used as a callback?
6. What can go wrong when you mismatch the calling convention?

Code Projects 上關於Calling Convention 的精彩文章
1. Calling DLLs in VB and C++
2. Calling Conventions Demystified



Nanyve 大大, 以Debuger 與reverse 的角度來介紹各種類型的Calling Convention, 以及其運作原理

1. Win32 Calling Conventions review


以Optimization 文章聞名的Agner FogSoftware Optimization Resource 中的第五章
Calling conventions for different C++ compilers and operating systems
裡面主要重點是比教不同C++ Compilers 的差別,資料型態,Stack當然包含了
Calling Conventions 的比較


Steve Fried 也有有分別以Assembly 與 C 的來看的介紹,

Intel x86 Function - Call convention - assembly View
Intel x86 Function - Call convention - C Programer's View

尤其assembly View 那篇, 對於參數的傳遞, 用來一個簡單圖表來表示, 相當清楚明遼

在維基百科裡,中文維基並無資料,但英文維基就有
x86 Calling Convention

1 comment:

David Sern said...

感謝~ 真的整理的非常的好~~^^ 小弟今天一直在思考calling convension的問題~