关于函数的参数调用方式
本来看win32程序时,发现函数前面多了个CALLBACK之类的东西,感到疑惑,然后查了些资料,结果发现些更不懂的东西。。书上讲到了PASCAL调用规范,说是按这个规范调...
本来看win32程序时,发现函数前面多了个CALLBACK之类的东西,感到疑惑,然后查了些资料,结果发现些更不懂的东西。。
书上讲到了PASCAL调用规范,说是按这个规范调用时,函数参数“自左至右”压入堆栈,然后“自右至左”计算参数值,而C语言的调用规范正好与之相反。还说PASCAL调用由被调函数还原堆栈指针,而C的调用规范则由主程序来完成。
首先,这里有疑问:
这里所谓的“参数入栈”,入栈的是实参吧?计算参数是什么意思?就是把实参赋值给形参吗?为什么要入栈而不直接计算参数?
那么这个计算参数的过程只是在函数调用开始时进行一次就好了吧?书上说根据PASCAL的入栈出栈过程,在参数计算结束后就刚好使堆栈指针回复原状,而C规范不行,所以C规范要由主程序还原堆栈指针。但是根据C规范:从右至左入栈,从左至右计算,我觉得堆栈指针也是回到原处的啊!还是说我这书上描述有误呢?
还有一点,写C程序的时候也没听说一调用函数就要写一些什么还原堆栈的代码呀,是不是这些代码由编译器编译的时候完成了呢?
我知道我的问题是有点多,甚至有些可能不知所谓,希望对这些比较清楚地前辈能够耐心的一一解答一下。如果有些确实不好回答,跳过也行。。先谢谢了。 展开
书上讲到了PASCAL调用规范,说是按这个规范调用时,函数参数“自左至右”压入堆栈,然后“自右至左”计算参数值,而C语言的调用规范正好与之相反。还说PASCAL调用由被调函数还原堆栈指针,而C的调用规范则由主程序来完成。
首先,这里有疑问:
这里所谓的“参数入栈”,入栈的是实参吧?计算参数是什么意思?就是把实参赋值给形参吗?为什么要入栈而不直接计算参数?
那么这个计算参数的过程只是在函数调用开始时进行一次就好了吧?书上说根据PASCAL的入栈出栈过程,在参数计算结束后就刚好使堆栈指针回复原状,而C规范不行,所以C规范要由主程序还原堆栈指针。但是根据C规范:从右至左入栈,从左至右计算,我觉得堆栈指针也是回到原处的啊!还是说我这书上描述有误呢?
还有一点,写C程序的时候也没听说一调用函数就要写一些什么还原堆栈的代码呀,是不是这些代码由编译器编译的时候完成了呢?
我知道我的问题是有点多,甚至有些可能不知所谓,希望对这些比较清楚地前辈能够耐心的一一解答一下。如果有些确实不好回答,跳过也行。。先谢谢了。 展开
1个回答
展开全部
PASCAL 也好 ,c也好,编译之后都是cpu能认得机器码
cpu每次只能执行一条指令。他是不知道自己执行到那个位置的。
当调用一个函数时,cpu执行的指令也就跳转到函数开头的那条指令了,但如果函数有参数的话,那cpu就不知道在哪里取出之前的参数了(无论是形参还是实参,cpu都是认为是一个数值)。
计算机前辈们就想出了一个这样的方法:
在调用函数之前,先把参数逐个压到栈里,因为栈的地址cpu是知道,那cpu就可以取出参数,栈是先进后出的。
然后cpu就跳到函数开头的指令进行执行,取参数时cpu就从栈里pop一个出来就行了
这里就出现你说的问题了,c的规范是从右到左压入栈的,那么进到函数里后参数出栈的顺序相反,就得以区分那个参数对应于那个变量
PASCAL相反。
cpu每次只能执行一条指令。他是不知道自己执行到那个位置的。
当调用一个函数时,cpu执行的指令也就跳转到函数开头的那条指令了,但如果函数有参数的话,那cpu就不知道在哪里取出之前的参数了(无论是形参还是实参,cpu都是认为是一个数值)。
计算机前辈们就想出了一个这样的方法:
在调用函数之前,先把参数逐个压到栈里,因为栈的地址cpu是知道,那cpu就可以取出参数,栈是先进后出的。
然后cpu就跳到函数开头的指令进行执行,取参数时cpu就从栈里pop一个出来就行了
这里就出现你说的问题了,c的规范是从右到左压入栈的,那么进到函数里后参数出栈的顺序相反,就得以区分那个参数对应于那个变量
PASCAL相反。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询