调用函数后堆叠
在调用函数之前,调用者必须将参数推入堆栈? 谁推下一条指令的地址? 如果被调用的函数将使用她自己的变量,它会将它们推送到堆栈,所以当使用RET
返回时,它会弹出该值并将EIP
设置为弹出的值。但不存在,因为函数分配了变量,所以堆栈已更改? 怎么会这样? 谁在call
命令之前推送下一条指令的地址? 解决了!
在呼叫指令期间,返回地址被压入堆栈。 函数必须跟踪有多少变量被压入堆栈,使用alloca()从堆栈中分配的任何空间,以及对esp所做的任何其他更改,以及函数exit,restore esp,以便返回指令将返回到合适的地方。 如果启用了堆栈框架选项,该功能通常会以push ebp |开始 mov ebp,esp,永远不会修改ebp。 退出代码然后执行mov esp,ebp | 流行ebp,然后返回。
对于“C”调用约定,在从被调用函数返回后,调用函数需要添加到esp才能将任何参数压入堆栈之前将其恢复到先前状态。 对于“Pascal”调用约定,被调用函数将使用ret n指令,其中n是调用后添加到ESP的值以补偿推入的参数。
根据调用约定,一些参数将传递到寄存器而不是堆栈中。 对于Visual Studio,这是32位模式下的一个选项,但在64位模式下,前4个参数总是通过寄存器rcx,rdx,r8和r9传递。
链接地址: http://www.djcxy.com/p/80375.html