1 | struct cmp |
1 | struct cmp |
压入栈的顺序是:参数、返回地址、原ebp、局部变量。(依次从低地址到高地址压入)
在C语言中,当调用一个函数时,涉及的栈操作和参数的传递通常依赖于目标架构和使用的调用约定。但是,我们可以描述一个典型的(并且是常见的)情景,即x86架构上的cdecl
调用约定。请注意,其他架构和调用约定可能有所不同。
在cdecl
调用约定中,当调用一个函数时,栈的操作顺序大致如下:
call
指令。这会将返回地址(即call
指令后的下一个指令的地址)压入栈。ebp
(基指针寄存器)通常会被压入栈,以便在函数返回时可以恢复它。ebp
然后设置为当前的esp
(栈指针寄存器)值。这标志着一个新的栈帧的开始。esp
来完成。ebp
的偏移来访问局部变量和参数。esp
来实现。ebp
值从栈中弹出,恢复调用者的栈帧。ret
指令,这会从栈中弹出返回地址并跳转到那里。cdecl
调用约定,调用者需要清理传递给被调函数的参数。这是通过增加esp
来实现的。请注意,这只是一个简化的概述,真实情况可能因编译器优化和特定情境而异。而且,不同的调用约定和架构(如x86-64、ARM等)可能会有所不同的栈操作和参数传递机制。