一个想不明白的问题!向大家请教!

x858078 2009-03-19 08:26:41

TestProc proc
local @loc1:dword,loc2:word
local @loc3:byte

mov eax,@locl
mov ax,@loc2
mov al,@loc3
ret

TestProc endp


这段子程序 怎么会对应下面这个表呢
---------------------------------------------------------------
ebp偏移 内容
---------------------------------------------------------------
ebp+4 由call指令推入的返回地址
ebp push ebp指令推入的原ebp值,然后新的epb=现在的esp
ebp-4 第一个局部变量
ebp-6 第二个局部变量
ebp-7 第三个局部变量
----------------------------------------------------------------

这个表中的 ebp+4 由call指令推入的返回地址 这句话的说明,不是很理解!
向大家请教下!
...全文
134 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
killbug2004 2009-03-20
  • 打赏
  • 举报
回复
00401000  /$  55            PUSH EBP
00401001 |. 8BEC MOV EBP,ESP
00401003 |. 83C4 F8 ADD ESP,-8
00401006 |. 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4]
00401009 |. 66:8B45 FA MOV AX,WORD PTR SS:[EBP-6]
0040100D |. 8A45 F9 MOV AL,BYTE PTR SS:[EBP-7]
00401010 |. C9 LEAVE
00401011 \. C3 RETN


上面是这个函数的反汇编代码

call TestProc执行后,首先下一条指令地址入栈,再跳到TestProc处执行
然后push ebp,====>保存ebp,保护现场
mov ebp,esp,====>调整基址寄存器备用
ADD ESP,-8,=====>分配局部变量空间

|_____|-->下一条指令地址(call TestProc)
|_____|-->保存的ebp(push ebp) <---------ebp指向该处(mov ebp,esp)
|_____|-->保存@loc1(双字) <---------ebp-4
|_____|-->保存@loc2(字)和@loc3(字节)
|_____|

autumn1225 2009-03-20
  • 打赏
  • 举报
回复
call Proc

假设当前ESP 为100

PUSH IP 100 - 4
JMP Proc

然后进入Proc 后,

会有Push EBP 100 -8 保存EBP

mov ebp esp 重建EBP,指向当前帧

从下向上推还是比较明了的吧.


x858078 2009-03-20
  • 打赏
  • 举报
回复
既然是这样,那他怎么就知道,一定是ebp+4呢?
x858078 2009-03-20
  • 打赏
  • 举报
回复
谢谢大家的帮助!
x858078 2009-03-20
  • 打赏
  • 举报
回复
这里,EBP为什么要加4 看来不是我们段程序可以决定的!
killbug2004 2009-03-20
  • 打赏
  • 举报
回复
|_____|-->下一条指令地址(call TestProc) <----------ebp+4 高地址
|_____|-->保存的ebp(push ebp) <---------ebp指向该处(mov ebp,esp) 相对这个地址来访问堆栈
|_____|-->保存@loc1(双字) <---------ebp-4 低地址
|_____|-->保存@loc2(字)和@loc3(字节)
|_____|
ebp是基址寄存器,ebp+4/ebp-4都是利用ebp来相对寻址
x858078 2009-03-20
  • 打赏
  • 举报
回复
|_____|-->下一条指令地址(call TestProc)
|_____|-->保存的ebp(push ebp) <---------ebp指向该处(mov ebp,esp)
|_____|-->保存@loc1(双字) <---------ebp-4
|_____|-->保存@loc2(字)和@loc3(字节)
|_____|


这个跟 ebp+4 有什么关系吗? ebp为什么要+4 而不是加别的

反汇编的代码 push ebp

执行这条指令的时候 ebp实际上已经 +4 了
ncdfly 2009-03-19
  • 打赏
  • 举报
回复
ebp + 4 由Call指令推入的返回地址 这句话已经说得很明白了,与局部变量什么得一点关系没有,就是当程序调用TestProc得时候自动压入的(就是call TestProc 得下一条指令得地址)。当程序运行完这个函数得时候需要继续运行吧但是Eip设置成什么值呢?有了这个ebp + 4那么Eip就设置成这个值 程序就可以继续运行了。
x858078 2009-03-19
  • 打赏
  • 举报
回复
请教楼上的
ebp+4 应该是加上4个字节

而一开始定义的,如果按照DWORD为界对齐的话,应该是八个字节

我可以这样理解不

因为第一句,定义的是local @loc1:dword

DWORD是4个字节

所以ebp返回的是执行call时下一条执行的地址

以为下一条执行 定义的 DWORDZ占四个字节 所以 ebp+4

怎么还是觉得,有点不通呢?
BAYNPU 2009-03-19
  • 打赏
  • 举报
回复
这个表中的 ebp+4 由call指令推入的返回地址 这句话的说明,不是很理解!
这个跟上面定义3个LOCAL变量有关系,EBP返回的4字,而上面定义的是7字节,但以DWORD为界对齐时存取内存速度最快,所以它浪费掉一字节不就是等于8字节.

21,500

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧