在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//返回 展开
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//返回 展开
2个回答
展开全部
建议你找本关于汇编语言的书看看,这是堆栈平衡的问题,调用函数时,先保存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是寄存器,存地址,不存 变量,,不懂再问,
追问
谢谢你的耐心打字。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询