函数调用约定

一、_cdecl函数调用约定(C语言默认调用约定,在不写明调用约定时使用)

     特点:1、从右到左将参数压入参数栈中

                2、参数列表是由主调函数进行回收的(直接对esp使用add操作,将   参数栈进行回收)

二、_stdcall函数调用约定

      特点:1、从右至左将参数压入参数栈中

                 2、参数列表的回收是由被调函数完成的

               操作为:在被调函数结束时使用  ret   (数字)   进行回收;数字代表参数所占有的字节大小

三、_fastcall函数调用约定

    首先要明确_fastcall在32位和64位是不同的

    在32位下:

          特点:在参数个数小于等于2时,不将参数压入参数栈中,而是使用ecx、edx两个寄存器迅速将参数先后放入子函数的内存空间中,然后对参数的值进行使用;剩下的参数从右至左压入参数栈中;

         参数的回收:在子函数中的参数随子函数一起被销毁,在参数栈中的参数回收与_stdcall一样

   64位与32位的区别是:64位使用四个寄存器(rcx、rdx、r8、r9),所以排名前四的的参数会被送到子函数中,剩下的被压入参数栈中

四、thiscall函数调用约定

     想要了解thiscall调用约定,我们需要先了解一下类。

     类与结构体有些类似,可以自己定义对象。

  class  _MyClass_

{

public:                                            //public区域,外部对象可以访问

         

        _MyClass_()                     //无参数的构造函数

                           {

                              int *v2=new int;

                            }

        _MyClass_(int,float)                     //含参数的构造函数

                           {

                            }

         _MyClass_(object&)                     //拷贝构造函数,设object是用

                           {                                   //_MyClass_定义的一个对象

                            }

          ~_MyClass_()                     //析构函数,用来进行资源回收

                           {

                             if(v2!=NULL)

                                 delete v2;

                            }

      int  v1;

      int  * v2;

Private:                                                        //private区域,外部对象不可以直接访问

     int  v3;

}

注意:类的内存是连续的,就像数组一样,我们可以根据内存连续做许多事。

例如,我们定义的v1,v2可以访问,但是v3不可以通过外部成员直接访问,这时候我们可以将object想象成数组通过*(int*)(&object)[2]输出v3

this指针存放的就是当前对象的地址,程序使用寄存器将当前对象的地址放褥子函数中,通过this指针保存,然后子函数通过对this指针就可以对当前对象进行操作

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值