一、_cdecl函数调用约定(C语言默认调用约定,在不写明调用约定时使用)
创新互联公司网站建设公司是一家服务多年做网站建设策划设计制作的公司,为广大用户提供了网站建设、网站制作,成都网站设计,1元广告,成都做网站选创新互联公司,贴合企业需求,高性价比,满足客户不同层次的需求一站式服务欢迎致电。特点: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指针就可以对当前对象进行操作
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧