函数调用之参数传递

Posted on 2009-10-08 16:54 王小明 阅读(438) 评论(1)  编辑 收藏 引用
1:不同的硬件平台在默认情况下,参数调用时的参数传递机制是不一样的,例如mips等RISC的cpu,通常使用register进行参数传递,而x86平台下一般编译器编译的代码,默认是通过stack来传递参数,当然也可以通过编译选项,调用约定等手段来使用register传递参数,但CISC的cpu毕竟寄存器较少;
2:不同软件平台,参数传递方式也不一样,比如windows和linux,甚至在windows下的cygwin的参数传递,大家都有各自的约定;

通常来讲,cygwin和linux,如果函数指定regparm(n),则编译器会考虑使用eax,edx,ecx(注意是参数严格按照先eax,其次是edx,第三个参数是ecx)来进行参数传递,而在windows下visual studio,如果函数知道调用方式为__fastcall编译器会考虑使用ecx,edx(严格先ecx,再edx,参数从左往右,打死不用eax)传递参数,eax用来接受返回值;所以vc下面__fastcall函数参数超过2个,后面的还是push 到stack,也就fast不起来了。。。
所以,移植汇编代码的时候,要非常小心。

Feedback

# re: 函数调用之参数传递  回复  更多评论   

2009-10-08 17:20 by 王小明
随便写了个函数试试,x86平台下,cygwin编译
void __attribute__((regparm(3))) test123(int a1,int a2,int a3)
{
printf("%x,%x,%x",a1,a2,a3);
}

随便调用下
test123(0x12345678,0x88993344,0x99774433);
反汇编过来看看,
4015f4: b9 33 44 77 99 mov $0x99774433,%ecx
4015f9: ba 44 33 99 88 mov $0x88993344,%edx
4015fe: b8 78 56 34 12 mov $0x12345678,%eax
401603: e8 90 ff ff ff call 401598 <_test123>
只有注册用户登录后才能发表评论。