汇编之EBP的认识。
说到EBP就不能忽略了ESP。ESP是⼀个指针,始终执⾏堆栈的栈顶。⽽EBP就是那个所谓的堆栈了。
先看⼏个例⼦吧。
push ebp ; 把ebp,堆栈的0地址压⼊堆栈
mov ebp,esp ; 把栈顶指针存⼊当前堆栈esp,也就是堆栈的esp位置。
push ecx ; 存⼊ ecx 参数
push00000002 ; 存⼊ 2 参数
push00000001 ; 存⼊ 1 参数局
lea ecx,[ebp-04] ; 把堆栈借(⽤负数)⼀个位置,4字节长。赋值给ecx,这个值是多半是上层传递下来的。
call00401020 ; 调⽤指定地址的函数。
mov esp,ebp
pop ebp
ret
....
00401020处代码(理解成⼀个函数):
push ebp ; 进⼊函数代码了,然后把存⼊进来的0地址ebp,保存到堆栈。
mov ebp,esp ; esp保存到ebp⾥⾯,保存到
push ecx ; 存⼊ ecx到堆栈中。
mov [ebp-04],ecx ; 堆栈中借⼀个位置来存放ecx.
mov eax,[ebp+08] ; 从堆栈中取值,上⾯⼀个函数,存⼊的参数参数2
add eax,[ebp+0C] ; 从堆栈中取值,上⾯⼀个函数存⼊的参数1
mov esp,ebp ; 把 ebp⾸地址的值写回到 esp中。
pop ebp ; 释放 ebp中的0地址到ebp中。
ret0008 ; 释放掉可能是释放掉⼀个call地址和其中在本次函数中push的⼀个值。这样解释⽐较合理。(就是使⽤ebp开辟的⼀个空间值) 上⾯代码主要就是⼀个,传⼊参数调⽤函数进⾏⼀个1+2的计算。
前端页面模板先解释⼀下上⾯代码:
可以通过这个认识到⼏点。
1、如果使⽤了push ebp mov ebp,esp 操作进⾏初始化。
那么从堆栈中取值都是ebp+XXX值。。
⽽往堆栈⾥⾯,放⼊值都是[EBP-XXX],寄存器。这样的操作。
2、ebp应该就是针对当前函数,作⽤域独⽴存在的⼀个堆栈的⾸地址了。
⽽ESP就是,执⾏当前栈顶的⼀个指针,这个作⽤域是跨越了所有函数调⽤的。
。。。。个⼈理解,没有配图,请⼤家参考其他⽂章相应理解,我仅仅作为个⼈理解记录。
想再想想,⼤学时候,鄙视别⼈看的书,现在⾃⼰也拾起来看了。唉
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论