[root@joy-desktop param_pass]#./param_pass
stdcall, aa=b, bb=a
stdcall, aa=b, bb=a
fastcall, aa=b, bb=a
fastcall, aa=b, bb=a
fastcall1, reg->a=a, b=b, c=c, d=d, e=e
fastcall2, reg.a=a, b=b, c=c, d=d, e=e
fastcall1和fastcall2不同的是一个的参数为指针,一个是对象。
关键的区别是,多了一个movl %%esp, %%eax.
位置:Includelinuxkernel.h
定义:#define FASTCALL(x) x __attribute__((regparm(3)))
注释:这个标志符和函数声明放在一起,带regparm(3)的属性声明告诉gcc编译器这个函数可以通过寄存器传递多达3个的参数,这3个寄存器依次为EAX、EDX 和 ECX。更多的参数才通过堆栈传递。这样可以减少一些入栈出栈操作,因此调用比较快。