__stdcall 、__cdecl、__fastcall三者的区别

来源:互联网 发布:万达域名多少钱 编辑:程序博客网 时间:2024/05/17 23:24

今天重读《windows程序设计 第五版》(作者:Charles Petzold) 时,WINAPI 被定义为__stdcall,一回想发现忘记了__stdcall的集体含义。于是查阅下相关资料。

学习过汇编的童鞋都知道,函数调用要用到stack(栈:一种后进先出的线性结构)。先简单回忆下函数的调用过程(以X86结构为例):

1.将函数的参数按照从右往左的顺序依次压入stack(栈)中。

2.将当前IP寄存器(调用者当前指令地址(从com角度来说叫客户的当前的客户指令地址))的值压入stack(栈)中,将IP寄存值改变为被调用函数的地址。

3.将被调用函数的局部变量压入stack(栈)中。

4.将被调用函数的局部变量从stack(栈)中弹出。

5.将压入栈的调用者当前指令地址+1存入IP寄存器中。

6.将EAX寄存器(一般用EAX保存函数的返回值)中的值存入被调用这的局部变量(或者全局变量中)。

7.将函数的参数从stack(栈)中弹出。

   __stdcall、__cdecl、__fastcall都是函数调用的协议(约束条件)。

1.__stdcall可以写成_stdcall,参数采用从右至左边入栈顺序,由被调用函数本身将函数的参数从stack(栈)中弹出。

2.__cdecl可以写成_cdecl,参数采用从右至左的顺序的入栈顺序,由函数的调用者将函数的参数从stack(栈)中弹出,一般用于变长参数的函数例如:printf。因为被调用函数本身并不知道参数的个数,无法自身清楚堆栈。

3.__fastcall可以写成_fastcall,将函数最左边的两个不超过2个双字节(DWORD)参数存入ECX和EDX两个寄存器中,其他参数仍按从右到左的顺序压入栈中。一般用于效率要求较高的场合。




原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 被蜜蜂蛰了怎么办教案 走丢了怎么办大班反思 小孩吃了硬物怎么办 小孩吞了硬物怎么办 小学二年级孩子成绩不好怎么办 二年级孩子成绩不好怎么办 一年级学的不好二年级怎么办 17个月宝宝夜奶怎么办 小孩吃积食了吐怎么办 11个宝宝不会爬怎么办 5岁宝宝严重挑食怎么办 孩子吃菜口味重怎么办? 孩子挑食不吃菜不吃肉怎么办 微信新的朋友回复频繁怎么办 忘了闺蜜生日怎么办 把闺蜜生日忘了怎么办 忘了闺蜜的生日怎么办 一岁宝宝不吃菜怎么办 幼儿园教案虫子爬进耳朵怎么办 鼻子出血怎么办幼儿说课 英语记不住发音不准怎么办 幼儿园孩子拼音记不住怎么办 孩子总是记不住东西怎么办 走丢了怎么办小班教案 走丢了怎么办小班社会 数学加减个十分不清怎么办 孩子b和d分不清怎么办 小孩b和d分不清怎么办 高一的数学不会怎么办 农村小孩到市里上学怎么办 和外国人打官司输了怎么办 碰见爱说你的领导怎么办 小孩脾气爆一句话就生气怎么办 小孩眼睛哭肿了怎么办 大人吵架吓到宝宝了怎么办 小孩晚上睡觉不踏实怎么办 二宝美籍大宝怎么办 小孩一洗澡就哭怎么办 孩子去外地上学学籍怎么办 非婚生子父亲想要孩子怎么办 非婚生子孩子父亲找不到了怎么办