调用约定/调用惯例
调用约定是调用方和被调用方对于函数如何调用的一个明确的约定,只有双方都遵守同样的约定函数才能被正确的调用。
int foo(int n, float m)
{
int a = 0, b = 0;
//````
}
如果函数的调用方在传递参数室先压入参数n,再压入参数m,而函数则认为调用方应该先先压入参数m,再压入参数n,那么在内部中m与n的值将会被交换。
再者,如果函数的调用方决定利用寄存器传递参数,而函数本身仍然认为参数通过栈传递,那么显然函数无法获取正确的参数。
所以函数的调用方和被调用方对于函数如何调用需要有一个明确的约定。
一个调用惯例一般会规定以下方面的内容
- 函数参数的传递顺序和方式
函数参数的传递方式有很多种方式,最常见的一种是通过栈传递。函数的调用方将参数压入栈中,函数自己再从栈中将参数取出。对于有多个参数的函数,调用惯例要规定函数调用方将参数压栈的顺序:是从左至右,还是从右至左。有些调用惯例还允许使用寄存器传递参数,以提高性能。 - 栈的维护方式
在函数将参数压栈之后,函数体会被调用,此后需要将被压入栈中的参数全部弹出,以使得栈在函数调用前后保持一致。