函数调用习惯
假设在C语言中,假设我们有这样的一个函数:
int function(int a,int b)
调用时只要用result = function(1,2)这样的方式就可以使用这个函数。但是,当高级语言被编译成计算机可以识别的机器码时,有一个问题就凸现出来:在CPU中,计算机没有办法知道一个函数调用需要多少个、什么样的参数,也没有硬件可以保存这些参数。也就是说,计算机不知道怎么给这个函数传递参数,传递参数的工作必须由函数调用者和函数本身来协调。为此,计算机提供了一种被称为栈的数据结构来支持参数传递。
函数调用时,调用者依次把参数压栈,然后调用函数,函数被调用以后,在堆栈中取得数据,并进行计算。函数计算结束以后,或者调用者、或者函数本身修改堆栈,使堆栈复原。
在参数传递中,有两个很重要的问题必须得到明确说明:
1.当参数个数多于一个时,按照什么顺序把参数压入堆栈
2.函数调用后,由谁来把堆栈复原
在高级语言中,通过函数调用约定来说明这两个问题。常见的调用约定有:
stdcall
cdecl
fastcall
pascal
type 参数入栈顺序 谁负责清栈
_cdecl righ-left caller
_fastcall left-right callee
_pascal left-right callee
_stdcall right-left callee
原文出处,汇编代码没仔细看:
http://www.cnblogs.com/Dah/archive/2006/11/29/576867.html
回调函数 CALLBACK
凡是由你设计却由windows系统呼叫的函数,统称为callback函数。某些API函数要求以callback作为你参数之一。如 SetTimer,LineDDA,EnumObjects。
回调函数是由开发者按照一定的原形进行定义的函数(每个回调函数都必须遵循这个原则来设计)
例如:
BOOL CALLBACK DialogProc( HWND hwndDlg, // handle of dialog box
UINT uMsg, // message
WPARAM wParam, // first message parameter
LPARAM lParam // second message parameter );
说明:
1. 回调函数必须有关键词 CALLBACK;
2. 回调函数本身必须是全局函数或者静态函数,不可定义为某个特定的类的成员函数,因成员函数有隐藏的this指针;
3. 回调函数并不由开发者直接调用执行(只是使用系统接口API函数作为起点;
4. 回调函数通常作为参数传递给系统API,由该API来调用,回调函数可能被系统API调用一次,也可能被循环调用多次。
参考文章,看的不是很懂,日后细细品味:
http://blog.youkuaiyun.com/phlexii/article/details/726033
PS: retrieve:收回、检索 underlying:底层的