在OD 反汇编关于EBP 和ESP 局部变量 和函数参数 区别 比如:

PUSHEBPMOVEBP,ESPSUBESP,4//分配局部变量空间,一个int是4个字节MOVEAX,DWORDPTRSS:[EBP+8]//读取参数a这里能理解相当... PUSH EBP
MOV EBP,ESP
SUB ESP,4//分配局部变量空间,一个int是4个字节
MOV EAX,DWORD PTR SS:[EBP+8]//读取参数a 这里能理解 相当于 ESP-10+8
ADD EAX,DWORD PTR SS:[EBP+C]//加上参数b 这里也能理解 ESP-10+C

MOV DWORD PTR SS:[EBP-4],EAX//保存到局部变量c 这句意思没有搞清楚????

为什么是在EBP-4 中存储局部变量C 按照上面的理解 应该是 ESP-10+0 也就是EBP 中存储参数才对啊 为什么还要多减去一个4????

还有如何才OD 中区别 函数参数和局部变量???????????

MOV EAX,DWORD PTR SS:[EBP-4]//eax是返回值
MOV ESP,EBP//恢复栈顶指针
POP EBP//恢复ebp
RETN//返回
展开
 我来答
百度网友be89a6e
推荐于2017-11-22 · 超过59用户采纳过TA的回答
知道小有建树答主
回答量:94
采纳率:75%
帮助的人:54.8万
展开全部
建议你找本关于汇编语言的书看看,这是堆栈平衡的问题,调用函数时,先保存EBP,再把当前ESP值赋给EBP,相当于这个函数所用的堆栈空间的起点,然后传递的参数,定义的局部变量,在程序中都是以这个EBP为参考点的,比如[EBP+8],[EBP+c]等指令,是调用压入堆栈的参数,,,一般,调用一个函数,堆栈分配是先压入参数,在压入调用程序的返回地址,再压入EBP值,再压入要保存的寄存器,如果没有可以省略,然后压入局部变量,所以压入的参数在EBP上边,调用参数一般是[EBP+x],x是偏移,而局部变量一般是[ebp-x],,根据你的描述EBP中存参数?怎么可能,EBP是个寄存器,局部变量存于堆栈中,而堆栈是内存的一部分,,EBP占四个字节的堆栈,EBP的上四个字节,即[EBP+4]存返回地址,[ebp+8]存参数,你说是存参数a,然后如果没有其他参数那么,参数b应该存于[ebp+12]的堆栈空间中,而变量存于EBP下方的堆栈空间,占4个字节,所以是[ebp-4]的堆栈空间啊,没错啊,EBP是寄存器,存地址,不存 变量,,不懂再问,
追问
谢谢你的耐心打字。
sweetererer
2016-07-03 · TA获得超过506个赞
知道小有建树答主
回答量:671
采纳率:73%
帮助的人:423万
展开全部
函数参数是ebp+xxx这样的,ebp-xxx是局部变量
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式