当前位置: 代码迷 >> 汇编语言 >> 关于调用子函数参数入栈顺序有关问题
  详细解决方案

关于调用子函数参数入栈顺序有关问题

热度:3335   发布时间:2013-02-26 00:00:00.0
关于调用子函数参数入栈顺序问题
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
  相关解决方案