Windows中常用的函数调用规范
參考了《匯編語言 基于x86處理器》
轉(zhuǎn)載請注明出處
如果有錯誤的地方請指正,謝謝。
Windows環(huán)境中有32位調(diào)用規(guī)范和64位調(diào)用規(guī)范。
32位調(diào)用規(guī)范
Microsoft 32位編程環(huán)境下的32位調(diào)用規(guī)范有:_fastcall、_cdecl、_stdcall。
_fastcall
_fastcall使用寄存器加上堆棧傳參,如果參數(shù)兩個或兩個以下那么使用ECX或者EDX寄存器傳遞,參數(shù)有兩個以上則放入堆棧(從右向左入棧)。調(diào)用完畢后需要手動清棧(調(diào)用者清棧)。
優(yōu)點是速度快,因為使用寄存器傳參。
_cdecl
又稱為C調(diào)用規(guī)范,采用堆棧傳參,主要用于C/C++語言默認(rèn)的調(diào)用規(guī)范。參數(shù)從右向左入棧,調(diào)用完畢后手動清棧(調(diào)用者清棧)。
優(yōu)點是:采用_cdecl調(diào)用方式的過程(函數(shù)/方法/子程序)可以傳遞多個參數(shù),然后根據(jù)不同的參數(shù)個數(shù)發(fā)生變化。典型的例子就是 printf("%d,%d,%d",a,b,c) 函數(shù)。
缺點是:需要調(diào)用者清棧,如果參數(shù)太多可能忘記清理從而破壞堆棧。
_stdcall
常用于Win32API,采用堆棧傳參,參數(shù)從右向左入棧,調(diào)用完畢后自動清棧(被調(diào)清棧),
優(yōu)點是:因為是自動清棧,不會因為參數(shù)過多而忘記清理堆棧。
缺點是:因為自動清棧是根據(jù)參數(shù)個數(shù)來實現(xiàn)的,所以傳遞的參數(shù)個數(shù)是確定的,無法像_cdecl那樣靈活。
64位調(diào)用規(guī)范
Microsoft 64位編程環(huán)境下的64位調(diào)用規(guī)范簡稱x64調(diào)用規(guī)范
和32位編程環(huán)境中的調(diào)用規(guī)范不一樣,在64位編程環(huán)境中C/C++/WindowsAPI函數(shù)統(tǒng)一使用x64調(diào)用規(guī)范,該調(diào)用規(guī)范的如下:
總結(jié)
以上是生活随笔為你收集整理的Windows中常用的函数调用规范的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 三层架构与四大天王之——查
- 下一篇: noip2016 组合数问题