三部曲网站建设asp网站免费
news/
2025/9/24 5:52:50/
文章来源:
三部曲网站建设,asp网站免费,望野博物馆阎焰,wordpress设计主题esp#xff1a;扩展栈指针寄存器#xff0c;是指针寄存器的一种#xff0c;用于存放函数栈顶指针#xff08;栈顶指针#xff09; ebp#xff1a;扩展基址指针寄存器#xff0c;也被称为帧指针寄存器#xff0c;用于存放函数栈底指针#xff08;栈底指针#xff09;。…esp扩展栈指针寄存器是指针寄存器的一种用于存放函数栈顶指针栈顶指针 ebp扩展基址指针寄存器也被称为帧指针寄存器用于存放函数栈底指针栈底指针。
esp和ebp有什么关系呢
ebp只是存取某时刻的esp这个时刻就是进入一个函数内后cpu会将esp的值赋给ebp此时就可以通过ebp对栈进行操作比如获取函数参数局部变量等实际上使用esp也可以只是esp可能会变化去数据的时候很不方便
下面我们通过一个例子来说明 #include stdio.hint function_add(int a,int b);
int main()
{int a1,b1,sum0;sumfunction_add(a,b);printf(sum%d,sum);return 0;
}
int function_add(int a,int b)
{return ab;}这段程序的功能是定义一个函数实现两个参数相加然后打印出来下面来分析 int a1,b1,sum0;sumfunction_add(a,b);这两句反汇编如下
7 int a1,b1,sum0;
00401038 C7 45 FC 01 00 00 00 mov dword ptr [ebp-4],1 ;偏移地址为[ebp-4]存放1
0040103F C7 45 F8 01 00 00 00 mov dword ptr [ebp-8],1 ;偏移地址为[ebp-8]存放1
00401046 C7 45 F4 00 00 00 00 mov dword ptr [ebp-0Ch],0 ;偏移地址为[ebp-0ch]存放0
8: sumfunction_add(a,b);
0040104D 8B 45 F8 mov eax,dword ptr [ebp-8] ;eax的值设置为1
00401050 50 push eax ;压入栈
00401051 8B 4D FC mov ecx,dword ptr [ebp-4] ;ecx的值设置为1
00401054 51 push ecx ;入栈
00401055 E8 AB FF FF FF call ILT0(function_add) (00401005)
0040105A 83 C4 08 add esp,8
0040105D 89 45 F4 mov dword ptr [ebp-0Ch],eax当执行到这段代码会调到function_add函数执行 call ILT0(function_add) (00401005)这段一共push两次假设在没有这两次push前设espMpush两次后espM-8 执行call语句 espM-12 function_add反汇编的代码为
12: int function_add(int a,int b)
13: {
004010A0 55 push ebp
004010A1 8B EC mov ebp,esp
004010A3 83 EC 40 sub esp,40h
004010A6 53 push ebx
004010A7 56 push esi
004010A8 57 push edi
004010A9 8D 7D C0 lea edi,[ebp-40h]
004010AC B9 10 00 00 00 mov ecx,10h
004010B1 B8 CC CC CC CC mov eax,0CCCCCCCCh
004010B6 F3 AB rep stos dword ptr [edi]
14: return ab;
004010B8 8B 45 08 mov eax,dword ptr [ebp8]
004010BB 03 45 0C add eax,dword ptr [ebp0Ch]
15:
16: }
004010BE 5F pop edi
004010BF 5E pop esi
004010C0 5B pop ebx
004010C1 8B E5 mov esp,ebp
004010C3 5D pop ebp
004010C4 C3 ret
我们可以看到在函数前面首先将ebp压入栈然后将esp的值赋值给ebp此时 espM-16ebp的值和esp相同
push ebp
mov ebp,esp此时栈里情况为
在函数里都是通过ebp对栈的数据进行操作的比如获取参数的值
004010B8 8B 45 08 mov eax,dword ptr [ebp8]
004010BB 03 45 0C add eax,dword ptr [ebp0Ch]因为在函数里esp的值可能是变化的ebp的值不变通过ebp来操作数据很方便 在最后
004010C1 8B E5 mov esp,ebp
004010C3 5D pop ebp将espebp的值变成调用function_add之前的值这样看起来只是实现函数的功能其他并没有啥变化再使用ret语句返回去然后继续往下执行语句
0040105A 83 C4 08 add esp,8总结
esp始终指向栈顶ebp只要在调用函数时取值为栈顶这样可方便对数据的操作函数调用时EBP的值入栈然后ESP的值传给EBP。函数调用结束后EBP将值传回ESPESP又指向了原来的栈顶地址。这样看起来只是实现函数的功能其他看起来没有变化
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/915007.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!