首页
社区
课程
招聘
[旧帖] 分析__stdcall约定调用的困惑..望指点一下 0.00雪花
发表于: 2007-1-8 12:09 4146

[旧帖] 分析__stdcall约定调用的困惑..望指点一下 0.00雪花

2007-1-8 12:09
4146
按__stdcall约定调用函数test2(Par1, Par2)   

        push par2  ; 参数2
        push par1  ; 参数1
        call test2;
        {
             push ebp                    ; 保护现场原先的EBP指针
             mov  ebp, esp               ; 设置新的EBP指针,指向栈顶
             mov  eax, [ebp+0C]    ; 调用参数2
             mov  ebx, [ebp+08]          ; 调用参数1
             sub  esp, 8           ; 若函数要用局部变量,则要在堆栈中留出点空间
             …
             add  esp, 8                 ; 释放局部变量占用的堆栈
             pop  ebp                    ; 恢复现场的ebp指针
             ret  8                   ; 返回(相当于ret; add esp,8)
        }

1.为什么进入CALL后只保护了EBP这一个指针?其他的不用保护?
2.add  esp, 8后原先的局部变量还在堆栈吗?我的意思是在esp+8后 局部的变量  还是会在esp的位置吗?或者说是在栈顶上面?内存中保存着 只是esp+8后esp指向了了一个新的位置 而局部变量在的位置就不是堆栈了 而不是清除了局部变量?

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (4)
雪    币: 2384
活跃值: (766)
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
2
1、因为程序要使用或改变ebp寄存器,所以要先保护这个ebp寄存器(如果没使用或改变就不用保护),如果该函数还使用或改变了其他寄存器,如esi/edi/ebx,这三个寄存器也必须在使用或改变之前保护他(如果也没使用或变改就不用保护),像eax/edx/ecx则不用保护。
2、add esp,8是对应着函数前面的sub esp,8的。只是平衡堆栈。已经脱离esp栈顶的局部变量已经不能保证一定还在局部地区,所以已经不可用了。
2007-1-8 12:40
0
雪    币: 229
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
感谢小虾版主,一下就让我明白了.
2007-1-8 12:48
0
雪    币: 214
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
4
感谢小虾版主,我也明白了
2007-1-9 19:40
0
雪    币: 101
活跃值: (12)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
5
esi/edi/ebx,这三个寄存器也必须在使用或改变之前保护他(如果也没使用或变改就不用保护),像eax/edx/ecx则不用保护
===========
所有的win32 api都遵循这个标准。 所以你要在代码里面嵌汇编也要注意。 只所以esp, ebp, esi,edi, ebx都要保护, 因为他们主要都是做指针用.
2007-1-9 22:04
0
游客
登录 | 注册 方可回帖
返回
//