汇编中的堆栈平衡

堆栈平衡在汇编语言中至关重要,特别是在函数调用和堆栈操作中。不正确的堆栈平衡会导致程序崩溃。文章通过两种情况解释了堆栈平衡的重要性:一是返回父程序时,ESP必须指向调用前的地址;二是传参后需清理堆栈。介绍了外平栈和内平栈两种平衡方法,强调实践和理解的必要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

什么是堆栈平衡

这里有两种情况:

  • 如果要返回父程序,则当我们在堆栈中进行堆栈操作的时候,一定要保证在RET这条指令之前,ESP指向的是压入的我们压入的地址

这句话我是这么理解的,就是当你调用函数的时候,比如使用CALL指令,当使用堆栈的时候,使用前ESP指向那个地址,使用后RET返回前就必须是那个地址,如果不是那个地址,那么堆栈就是不平衡的,程序就崩溃了。

直接上图分析一下:

在这里插入图片描述这个程序运行起来以后一定是会崩溃的,在函数执行结束前,它使用了堆栈,向栈顶push了eax的值,使栈顶指针ESP的值-4,这样ret程序就飞了,因为push把它带到了另一个世界。
在这里插入图片描述运行结果:

可以看到,反汇编窗口直接没了,原因就是他没有00000003这个地址,程序就这样飞走了,这是第一种情况。
在这里插入图片描述

  • 如果通过堆栈传递参数了。那么在程序执行完毕后,要平衡因参数导致的堆栈变化
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值