C语言函数参数传递的规则

首先先看一张图:

哎函数参数传递怎么是从1到n的?这和我从CSAPP上看的不对啊?CSAPP上不是说函数参数1~6由寄存器传递,7~n才压栈吗?哪个是对的?

godblot里随便写两个函数。

1
2
3
4
5
6
7
int a(int b, int c,int d, int e) {
return b + c + d + e;
}

int f() {
return a(1, 2, 3, 4);
}

-m32(编译32位程序)编译选项产生的汇编:

很显然,是第一张图的传递方式:调用者函数先把所有的参数从右到左压栈,然后被调用者函数用ebp寄存器(栈顶寄存器)+ 偏移量的方式去访问。

-m64(编译64位程序)编译选项产生的汇编:

这样就是CSAPP里的传递方式了:参数1~6通过寄存器传递而不是压栈,参数7~n才压栈。

所以这两种都是对的,只是一个是32位程序的规则,一个是64位的。可以看下面几个回答查看更多:

https://www.zhihu.com/question/42091882