- Assembly code
TestProc proc local @loc1:doword,@loc2:word local @loc3:byte mov eax,@loc1 mov ax,@loc2 mov al,@loc3 retTestProc endp
反汇编后
- Assembly code
:00401000 55 push ebp:00401001 8BEC mov ebp,esp:00401003 83C4F8 add esp,FFFFFFFF8:00401006 8B45FC mov eax,dword ptr [ebp-04]:00401009 668B45FA mov ax,word ptr [ebp-06]:0040100D 8A45F9 mov al,byte ptr [ebp-07]:00401010 C9 leave:00401011 C3 ret
ebp+4 由call指令推入的返回地址
ebp push ebp指令推入的原ebp值,然后新的ebp=现在的esp
ebp-4 第一个局部变量
ebp-6 第二个局部变量
ebp-7 第三个局部变量
call subproc的时候堆栈是怎么变化的呢?参数入栈 call指令下一条指令地址和ebp压入顺序是什么呀
------解决方案--------------------------------------------------------
参数入栈,是 call 之前的一系列 push 指令,而不是 call 指令本身。call 指令只是保存返回地址并转移到目标地址的功能,没有参数压栈的意思。
call 指令是压栈返回地址,然后转移到子程处,ebp 压栈是在子程里的开头处进行的,所以是先压栈的 call 指令下一条指令地址,然后是 ebp 的压入。即 mov ebp, esp 指令后,[ebp] 处为原 ebp ,[ebp+4] 处为 call 指令下一条指令地址,如果有参数的话,[ebp+8] 开始即是了。
------解决方案--------------------------------------------------------
call subproc压入顺序是:参数、call的下一条指令的CS和EIP,这时候只有ESP变化,EBP并没用变化,
只是到了子程序,为了取参数才使用EBP