2007/06/25

Calling Convention

Calling Convention指的是caller 和 callee 函式間,

參數或回傳值在傳遞過程中,在stack frame(activation record)中的存放順序、

及stack frame結束時由caller或callee負責清除之類的規則..

而這規則通常由register allocator決定。



依Calling convention 可分為兩種registers.

Caller-save register 由Caller負責清理或存入stack frame。

– Caller再呼叫Callee前,必須先將caller-save register的值存入stack frame。

– 所以callee 便可直接使用caller-save register裡的值,而不須做存入stack frame的動作。


Callee-save registers 由Callee負責清理或存入stack frame。

– callee要用Callee-save register前, 則需先 push 其值至 stack frame;
用完後再從stack frame pop 回覆Callee-save register原來的值。

– 所以對Caller而言,Callee-save register的值,在call的前後應該是一致的。





以下轉自http://from-1984.blogspot.com/2004/11/call-convention.html

pascal convention 規定:
參數傳遞次序由左而右,stack frame 的清理由被呼叫端(callee)負責。


c convention 規定:
參數傳遞次序由右而左,stack frame 的清理由呼叫端(caller)負責。


由於 pascal convention 規定 stack frame 的清理由被呼叫端(callee)負責,
因此如對同一函式呼叫一千次,
其 stack frame cleanup routine只需一份(位於 callee 內,由編譯器加入)。


由於 c convention 規定 stack frame 的清理由呼叫端(caller)負責,
因此對同一個函式呼叫一千次,
其 stack frame cleanup routine需 1000 份(位於呼叫點,由編譯器加入)。


因此,採用 pascal calling convention,對於降低程式碼大小(並因而增加執行速度),
在某些情況下很有幫助。
這是為什麼早期 Windows 系統內部幾乎完全採用 pascal calling convention 的原因。


但是 pascall convention 不支援「個數不定之引數」。
例如 printf()的引數個數不一定,那就一定得使用 c calling convention。


stdcall 是 c 和 pascal 的綜合體,取其優而去其弊。

如果你有 MSDN,上去搜尋一下,很容易就可以查到這些資料!

1 comment:

  1. 有许多移动的平台,在这个星球上存在的今天。这种情况非常相似,台式机市场,我们在那里作业系统,如GNU / Linux的,使用BSD的Mac OS X , Windows和其他一些。对我来说,一个事实,即Linux是一种开放源码模型使它更好的操作系统。我们也有很大的移动操作系统一样的Symbian , Windows Mobile平台和Linux操作系统。不过,这些都是真正的开放。惊讶地看到Linux在这个名单? Linux作为手机操作系统有不同的形状和大小是不是很符合对方,因为有许多不同的实现平台。没有共同的API可用于开发建设的顶部。例子包括实现由摩托罗拉与MontaVista 。loan 至少,这是不是这样的专有操作系统,如Symbian和Windows Mobile 。他们提供丰富的资料,以帮助第三方编程人员利用他们的平台。

    ReplyDelete