cdecl、pascal、stdcall、fastcall

Directive Parameter order   Clean-up Passes parameters in registers?
register   Left-to-right         Routine        Yes
pascal    Left-to-right           Routine     No
cdecl    Right-to-left             Caller        No
stdcall    Right-to-left           Routine     No
safecall   Right-to-left          Routine     No

调用约定           压参数入栈顺序     把参数弹出栈者         函数修饰名 
(Calling convention) 
--------------------------------------------------------------------------------------------------------
__cdecl                 右->左             调用者                                 _function     
__fastcall             右->左              被调用者                           @function@nnn      
__stdcall             右->左               被调用者                           _function@nnn
__pascal             左->右               被调用者                           _function@nnn
    
-----------------------------------------------------------------------------------------------------------

__cdecl是C/C++和MFC程序默认使用的调用约定,也可以在函数声明时加上__cdecl关键字来手工指定。采用__cdecl约定时,函数参数按照从右到左的顺序入栈,并且由调用函数者把参数弹出栈以清理堆栈。因此,实现可变参数的函数只能使用该调用约定。由于每一个使用__cdecl约定的函数都要包含清理堆栈的代码,所以产生的可执行文件大小会比较大。__cdecl可以写成_cdecl。
         __stdcall调用约定用于调用Win32 API函数。采用__stdcal约定时,函数参数按照从右到左的顺序入栈,被调用的函数在返回前清理传送参数的栈,函数参数个数固定。由于函数体本身知道传进来的参数个数,因此被调用的函数可以在返回前用一条ret n指令直接清理传递参数的堆栈。__stdcall可以写成_stdcall。
         __fastcall约定用于对性能要求非常高的场合。__fastcall约定将函数的从左边开始的两个大小不大于4个字节(DWORD)的参数分别放在ECX和EDX寄存器,其余的参数仍旧自右向左压栈传送,被调用的函数在返回前清理传送参数的堆栈。__fastcall可以写成_fastcall。 
·特别说明
1. 在默认情况下,采用__cdecl方式,因此可以省略.
2. WINAPI一般用于修饰动态链接库中导出函数
3. CALLBACK仅用于修饰回调函数

便于更好理解, 看下面例子(函数调用的过程以汇编代码表示):      
    
void cdecl fun1(int x,int y); 
void stdcall    fun2(int x,int y); 
void pascal fun3(int x,int y);   
    

    
**************************************** 

void cdecl fun1(int x,int y); 

fun1(x,y); 

调用 fun1 的汇编代码 

push y 
push x 
call fun1 
add sp,sizeof(x)+sizeof(y) ;跳过参数区(x,y) 

fun1 的汇编代码: 

fun1 proc 
push bp 
mov bp,sp 
…… 
… 
pop bp 
ret ;返回,但不跳过参数区 
fun1 endp 

**************************************** 

void stdcall fun2(int x,int y); 

fun2(x,y); 

调用 fun2 的汇编代码 

push y 
push x 
call fun2 

fun2 的汇编代码: 

fun2 proc 
push bp 
mov bp,sp 
…… 
… 
pop bp 
ret sizeof(x)+sizeof(y) ;返回并跳过参数区(x,y) 
fun2 endp 

***************************************** 

void pascal fun3(int x,int y); 

fun3(x,y); 

调用 fun3 的汇编代码 

push x 
push y 
call fun3 

fun3 的汇编代码: 

fun3 proc 
push bp 
mov bp,sp 
…… 
… 
pop bp 
ret sizeof(x)+sizeof(y) ;返回并跳过参数区(x,y) 
fun3 endp  

时间: 2024-11-03 12:59:00

cdecl、pascal、stdcall、fastcall的相关文章

sql:除非另外还指定了 TOP 或 FOR XML,否则,ORDER BY 子句在视图、内联函数、派生表、子查询

执行sql语句: select * from ( select * from tab where ID>20 order by userID desc ) as a order by date desc 逻辑上看着挺对 但是报错: 除非另外还指定了 TOP 或 FOR XML,否则,ORDER BY 子句在视图.内联函数.派生表.子查询和公用表表达式中无效. 只要我们在嵌套子查询视图里面加入: top 100 percent 即可 select * from ( select top 100 p

ajax-关于JS、AJAX程序逻辑、结构问题。

问题描述 关于JS.AJAX程序逻辑.结构问题. 假如:我用ajax取到一组数据 data我需要根据data.length 创建 相应长度的表格然后给表格的td赋值.然后根据某个td 为 TR赋值.那么!当我要这些数据在每分钟刷新一次的时候.(只刷新数据)那么表格也会再次重新创建.问题:如何避免表格的重新创建! 我暂时的想法是:定义个变量a,在创建表格前做一次判断,执行后改变a的值. 这样做可以吗?如果可以,还有没有其他的方式方法? 解决方案 你结构都一样吗?如果结构一模一样,直接遍历td执行更

php读取eml实例、php解析eml、eml解析成网页

php读取eml实例,本实例可以将导出eml文件解析成正文,并且可以将附件保存到服务器.不多说直接贴代码了. 如果你觉得此代码不错,请点个赞.谢谢~~~~ ; define(EML_FILE_PATH,'./yjdata/'); //if ($filename == '') $filename = '21724696_niuyufu@qiaodazhao.com_ZC4422-r7GMz_R9QF3K6XUhmJOXd4c.eml'; //if ($filename == '') $filena

折行显示、回车代替tab、隐去grid的表格线

显示 折行显示.回车代替tab.隐去grid的表格线   1.       在数据窗口(Datawindow)中实现数据列自动折行. PB软件在市场上受用户欢迎的原因之一,就是它的数据窗口功能很强,而且方便应用. 在使用Datawindow时,常会遇到某列的数据太长,不能同时显示全部的情况.若采用自动水平滚动,操作起来又不够简便.有一种方法能实现列数据多行显示(自动折行).具体步骤如下: ①.在Datawindow Panter中打开此DataWindow,在需设定自动折行的列上双击鼠标,弹开此

UI设计:触摸优先设计、响应式设计、移动优先设计

文章描述:UI应遵循的三大网站设计原则. 触摸优先设计.响应式设计.移动优先设计是UI设计师设计网站应遵循的三大原则,以使网站最大范围地适应各种设备.外文<Designing The Well-Tempered Web>中详细阐述了这三大原则.CSDN对该文进行了编译,内容如下: 随着技术的进化,Web设计的艺术和技巧也在不断进化.新的技术创造了新的挑战,而新的挑战要求新的解决方案.我们通常工作在未知领域,需要给出全新的解决方案. 考虑到有限的Web设计历史,我们必须超越当前的领域去回答更有挑

一个不被flash、select、activex遮挡的、跨frame的无限分级菜单

一个不被flash.select.activex遮挡的.跨frame的无限分级菜单 该菜单改良自著名的chromemenu,可以无限分级,使用方法: 1.添加主菜单项 找到类似下面代码的部分: 以下为引用的内容: <div class="chromestyle" id="chromemenu"><ul><li><a href="http://www.dynamicdrive.com">Home<

php中时间轴开发,即显示为“刚刚”、“5分钟前”、“昨天10:23

  php中时间轴开发,即显示为"刚刚"."5分钟前"."昨天10:23"等 开发中还是蛮有用的,譬如论坛帖子,围脖等都有相关应用 //时间转换函数  function tranTime($time) {       $rtime = date("m-d H:i",$time);       $htime = date("H:i",$time);              $time = time() - 

开放平台:娱乐商圈、资讯商圈、工具商圈

文章描述:APPS的长尾:开放平台上的三大商圈. 先看图.这张图,之前我在公司内部培训的时候手绘过很多次.在最近一次某移动互联网论坛上才对外使用. 开放平台上的三大商圈:娱乐商圈.资讯商圈.工具商圈. 这张图其实不太严谨:它并不是严格比照某个开放平台或应用商店的具体数据做出来的.但却是我在观察了各个开放平台(Apps.或程序,以下同)之后,试图做出来的一种直观表述.应该有一些参考价值吧. 简言之,在开放平台(Platform)上大致有这种三类应用(Apps): ①娱乐应用.特别是游戏,在社交平台

模糊、缓冲、顺序加载、XML等的混合运用简单实例

xml|加载 放假了,没多少事,发个模糊.缓冲.顺序加载.XML等的混合运用简单实例,作品粗糙,给我等新手们参考,抛砖引玉吧,如果你觉得可以一定记得要顶帖. 第一帧上加载进度显示: stop(); load_txt.selectable = false;//动态文本用于显示加载进度 onEnterFrame = function () {         var l:Number = _root.getBytesLoaded();         var t:Number = _root.get