x86上为什么C语言调用一个函数要先把参数压栈,之后才是返回地址

x86上为什么C语言调用一个函数要先把参数压栈,之后才是返回地址,第1张

返回地址先于参数入栈是不可能的== 因为参数入栈是调用函数通过push指令完成的 而返回地址入栈则是在call指令中自动完成的 因此如果一定要先把返回地址压栈 就需要先调用call指令 call指令返回之后 程序就已经在被调函数里面了 调用函数已经失去了控制权 不可能再通过push指令把参数压栈了……

此外额我觉得这涉及到x86的一个规范吧…… 函数调用时参数压栈和被调函数返回后参数出栈都是由调用函数来完成 被调函数不参与(否则如果两者同时参与很容易把栈搞混乱) 如果参数在返回地址上方 被调函数返回的时候 为了取得返回地址 被调函数必须先把参数出栈 这就与之前说的规范冲突了

首先,c语言函数调用时参数压栈是倒着来的,最先入栈的是最后那个参数-i--

其次,如果遇到复合语句,则根据规则来进行,这条打印语句相当于:

printf("%d\n%d\n%d\n%d\n%d\n%d\n%d\n",i,++i,--i,i,i,-i,-i); i++; i--; i++; i--;

参数入栈顺序是:

-i=-8,压栈

-i=-8,压栈

i=8,压栈

i=8,压栈

执行--i,i=8-1=7,保存到i

i=7,压栈

执行++i,i=7+1=8,保存到i

i=8,压栈

i=8,压栈

最后压栈的是格式字符串

这样参数压栈完毕

接着执行第4个参数的i++

第5个参数的i--

第6个参数的i++

最后一个参数的i--

调用printf函数。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/12177945.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-21
下一篇 2023-05-21

发表评论

登录后才能评论

评论列表(0条)

保存