入栈方式

原创 2005年02月27日 14:03:00

_cdecl

按从右至左的顺序压参数入栈,由调用者把参数弹出栈。对于“C”函数或者变量,修饰名是在函数名前加下划线。对于“C++”函数,有所不同。

如函数void test(void)的修饰名是_test;对于不属于一个类的“C++”全局函数,修饰名是?test@@ZAXXZ

这是MFC缺省调用约定。由于是调用者负责把参数弹出栈,所以可以给函数定义个数不定的参数,如printf函数。


_stdcall

按从右至左的顺序压参数入栈,由被调用者把参数弹出栈。对于“C”函数或者变量,修饰名以下划线为前缀,然后是函数名,然后是符号“@”及参数的字节数,如函数int func(int a, double b)的修饰名是_func@12。对于“C++”函数,则有所不同。

所有的Win32 API函数都遵循该约定。


_fastcall

头两个DWORD类型或者占更少字节的参数被放入ECX和EDX寄存器,其他剩下的参数按从右到左的顺序压入栈。由被调用者把参数弹出栈,对于“C”函数或者变量,修饰名以“@”为前缀,然后是函数名,接着是符号“@”及参数的字节数,如函数int func(int a, double b)的修饰名是@func@12。对于“C++”函数,有所不同。

未来的编译器可能使用不同的寄存器来存放参数。


thiscall

仅仅应用于“C++”成员函数。this指针存放于CX寄存器,参数从右到左压栈。thiscall不是关键词,因此不能被程序员指定。


naked call

采用1-4的调用约定时,如果必要的话,进入函数时编译器会产生代码来保存ESI,EDI,EBX,EBP寄存器,退出函数时则产生代码恢复这些寄存器的内容。naked call不产生这样的代码。

naked call不是类型修饰符,故必须和_declspec共同使用,如下:

__declspec( naked ) int func( formal_parameters )

{

// Function body

}

【递归&动态规划】一个长度为n的无重复序列入栈的所有出栈方式

例如1、2、3这三个数字,入栈并出栈共有5种方式,分别为:321、312、231、213、123。那么对于长度为n的无重复序列中所有的出栈方式有哪些呢?本题属于动态规划问题与卡特兰数有关,后来看到一篇...

从1到n的一个序列依次入栈,则一共可能有多少种出栈方式?

http://baike.baidu.com/view/2499752.htm 这个问题属于卡特兰数(h(n)=C(2n,n)/(n+1) (n=1,2,3,...))的应用,共有c(2n,n)-c...
  • gukesdo
  • gukesdo
  • 2012年04月08日 22:16
  • 2751

C++调用方式 入栈顺序

函数传参有三种方式:堆栈方式,寄存器方式,以及通过全局变量进行隐含参数的传递 1.堆栈方式: 约定类型 __cdecl(C规范) PASCAL stdcall Fastca...

c/c++ 函数调用方式及入栈顺序、名称修饰

C/C++函数调用约定与函数名称修饰规则探讨 使用C/C++语言开发软件的程序员经常碰到这样的问题:有时候是程序编译没有 问题,但是链接的时候总是报告函...

函数参数入栈的方式__stdcall等

函数参数入栈的方式   __cdecl,__fastcall,   __stdcall   什么区别? -----------------------------------------------...

出、入栈所有排列的实现

  • 2013年12月27日 13:57
  • 595KB
  • 下载

[Hb-II] push pop指令 中断时CPU的工作(中断的入栈操作)

《汇编语言·第三版》--王爽 1 读程序填空 使用Debug,将下面的程序写入内存逐条执行,根据指令执行后的实际运行情况填空。 1.        mov    ax, ffff 2....

二叉树遍历出栈入栈图

  • 2016年02月28日 15:30
  • 46KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:入栈方式
举报原因:
原因补充:

(最多只允许输入30个字)