能力值:
( LV2,RANK:10 )
在线值:
|
-
-
2 楼
堆栈平衡是在函数调用的时候使用的。当你调用了一个函数,上下文发生了改变,必然要 保存原来的上下文,以备函数返回时使用。
|
能力值:
( LV2,RANK:10 )
|
-
-
3 楼
用命令 ret X 返回
X是你用堆栈传递的参数的总大小(字节),并且X一定是偶数
|
能力值:
( LV2,RANK:10 )
在线值:

|
-
-
4 楼
我觉得可能是这样,不知对不对。
报错的地方不一定,错误也不一定。
随便举个例子:
foo1()
{
int a;
foo2();
a = 0;
}
如果foo2()在返回后没有平衡堆栈,那么在a=0;这句,通过ebp访问变量a时,就会因为多余的在堆栈中的foo2()的变量而造成错误。
|
能力值:
( LV3,RANK:30 )
|
-
-
5 楼
一般调用函数时的做法都是先将参数压进堆栈,后再call,栈平衡得是要恢复栈顶位置,要么是在函数内部进行,另外一种是在调用函数后进行
例:
push XXX //假设操作数位32位,即四个字节
push XXX
push XXX
call function1
那么函数内平衡,一般在function1函数内最后返回时一般都这么写:ret 0CH,为什么是0cH呢,因为我们要让栈顶指到前12个字节之前,因为你的参数占用了12个字节,ESP=ESP-12
函数外平衡
push XXX //假设操作数位32位,即四个字节
push XXX
push XXX
call function1
sub ESP,0CH
假如是你自己写的函数,不平衡的话,你想想,是不是会造成栈浪费,最后栈溢出,也就是栈的大小已经超出可寻址的范围,最后程序必将崩溃
这是我的理解,希望能帮到你啊
|
能力值:
( LV2,RANK:10 )
|
-
-
6 楼
恩 谢谢楼上的几位兄弟! 我能理解堆栈平衡的原理, 就是不知道为什么呢! 可能要等以后继续深入学习了才知道!!! 知其然不知其所以然啊!!!! ! 严重感谢楼上!!
|
|
|