汇编之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小时内删除。