首页
社区
课程
招聘
[旧帖] [求助]菜鸟求助,为什么call之后,一般会执行add esp,4 0.00雪花
发表于: 2012-12-3 00:09 4949

[旧帖] [求助]菜鸟求助,为什么call之后,一般会执行add esp,4 0.00雪花

2012-12-3 00:09
4949
例如:
call @ILT+30(Accumulation)(00401032)
add esp,4

请问上面的add esp,4是什么意思,恢复现场的意思吗,
那为什么是+4,不是+8呢

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (4)
雪    币: 10
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
esp是指针寄存器,用于栈。
call操作就是调用一个函数,函数一般是有参数的,一般参数都是4字节,放在栈上的,add esp,4(或者8或者12等)之前应该还有push操作的,add esp的操作就是要让esp指到正确的参数上(想象一下栈内参数错位会是什么后果吧)。

+4就是一个参数,+8就是2个参数(前面多半要push两次)。当然还有调用约定的区别

我理解是这样的,不知道对不对,若是误人子弟了就算你倒霉了吧.呵呵。
2012-12-3 11:40
0
雪    币: 2
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
堆栈平衡
在 __cdecl调用方式需要调用者自动平衡堆栈,也就是你问题中的这种
在__stdcall中被调者自己平衡堆栈,如下:

...
push ebp
mov ebp,ebp
...  
//执行完毕
ret 4(假设只推入了一个参数)

所以你这里的 add esp,4 是用来平衡堆栈的,之所以是4 是因为只推入了一个参数
2012-12-3 20:25
0
雪    币: 1
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
上面的那个ret 4,是被调用的函数执行的吧,这个时候就不需要add esp,4;这样理解对吗
2012-12-4 11:06
0
雪    币: 3
活跃值: (132)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
我感觉应该是为了堆栈平衡吧,push压栈一次esp会减4,为了平衡就会出现add esp,4 来实现栈平衡,如果压两次栈最后就将esp加8,纯属个人理解
2012-12-5 01:04
0
游客
登录 | 注册 方可回帖
返回
//