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

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

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

        mov eax,@loc1
        mov ax,@loc2
        mov al,@loc3
        ret
TestProc    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