Assembly 调用函数后堆栈

Assembly 调用函数后堆栈,assembly,Assembly,调用函数之前,调用方必须将参数推送到堆栈? 谁推下一条指令的地址? 如果被调用的函数将使用她自己的变量,它将把它们推到堆栈中 因此,当使用RET返回时,它会弹出值,并将EIP设置为弹出的该值。但它不在那里,因为函数分配了变量,所以堆栈发生了变化? 怎么可能呢?谁在调用命令之前推送下一条指令的地址? 解决了 在调用指令期间,返回地址被推送到堆栈上。函数必须跟踪推送到堆栈上的变量数量、使用alloca()从堆栈分配的任何空间以及对esp所做的任何其他更改,并在函数退出时还原esp,以便返回指令返回到

调用函数之前,调用方必须将参数推送到堆栈? 谁推下一条指令的地址? 如果被调用的函数将使用她自己的变量,它将把它们推到堆栈中 因此,当使用
RET
返回时,它会弹出值,并将
EIP
设置为弹出的该值。但它不在那里,因为函数分配了变量,所以堆栈发生了变化? 怎么可能呢?谁在调用
命令之前推送下一条指令的地址?

解决了

在调用指令期间,返回地址被推送到堆栈上。函数必须跟踪推送到堆栈上的变量数量、使用alloca()从堆栈分配的任何空间以及对esp所做的任何其他更改,并在函数退出时还原esp,以便返回指令返回到正确的位置。如果启用堆栈帧选项,则该功能通常将以push ebp | mov ebp、esp启动,并且从不修改ebp。然后退出代码执行mov esp、ebp | pop ebp,然后返回

对于“C”调用约定,在从被调用函数返回后,调用函数需要添加到esp以将其恢复到先前的状态,然后再将任何参数推送到堆栈上。对于“Pascal”调用约定,被调用函数将使用ret n指令,其中n是在调用后添加到ESP的值,以补偿推送参数


根据调用约定,某些参数在寄存器而不是堆栈中传递。对于Visual Studio,这是32位模式下的一个选项,但在64位模式下,前4个参数始终在寄存器rcx、rdx、r8和r9中传递。

这一切都取决于使用的调用约定。解决了它!无需注释,然后删除问题:)在64位模式下,前四个浮点参数在前四个SSE寄存器xmm0-xmm3中传递。