21,458
社区成员
发帖
与我相关
我的任务
分享
push ebp ;缓存栈基址,为什么要缓存栈基址?
mov ebp, esp ;为什么要将目前栈顶作为栈基址?
mov eax, dword ptr [ebp+C] ;
add eax, dword ptr [ebp+8] ;
pop ebp ;为什么要恢复栈基址?
retn ;返回
int main()
{
return 0;
}
反汇编生成的汇编代码:
2 00411370 55 push ebp ;保存ebp指针
2 00411371 8bec mov ebp,esp ;将esp赋值给ebp,使ebp指向栈顶
2 00411373 81ecc0000000 sub esp,0C0h ;在堆栈中留出0ch字节的空间给局部变量使用
push ebp ;这是保存栈的基地址,因为被调用程序要利用当前栈的相对位置来访问栈内数据
;当然你也可以不这么做,试想一下你如何获得当前esp+c处的数据,(每次push的时候,esp都是变化的)
mov ebp, esp ;仔细看上面
mov eax, dword ptr [ebp+C] ;取得y的值,一般入栈顺序使自右往左
add eax, dword ptr [ebp+8] ;取得x的值
pop ebp ;为什么要恢复栈基址?修改了栈的基地址后,却要返回,但调用程序的栈可能还会用其他有用的数据,不能被破坏
retn ;维持栈平衡,执行这句后,esp指向了x,y入栈前的栈位置