关于EBP的疑问,求大手帮忙分析解释一下,一直想不明白!

假如CALL1() 调用 CALL2() CALL2() 调用CALL3()

CALL3()中
push ebp 相当于调用CALL3前CALL2栈顶值 因为CALL2中[mov epb,esp]
mov epb,esp CALL3的新寻址地址,来自CALL2的栈顶
...
mov esp,ebp 调用完后将栈顶地址恢复到CALL2
pop ebp 相当于ESP和EBP都回到调用前
retn

但是在CALL2中 如果CALL1是顶层的调用那么他的EBP的值是哪里来的?

而且在CALL2中
push ebp ebp并不是将CALL1调用CALL2之前的栈顶值 因为CALL1中没有[mov epb,esp]
mov epb,esp CALL2的新寻址地址,来自CALL1的栈顶
push a
push b
call 3
mov esp,ebp 那么这句ESP不能恢复到CALL1的栈顶,是不是要用ADD ESP,XX 手动恢复到CALL1的栈顶?
那么是不是等价于用ADD ESP,XX 恢复栈的CALL是顶层CALL的下层CALL,因为子CALL间的调用都可用[mov esp,ebp]直接恢复栈顶?
pop ebp EBP返回到CALL1调用CALL2前
retn

在CALL1()中 在这个顶级CALL中,EBP的值是哪里来的,起什么作用?
push 0
call 2