首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > 汇编语言 >

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

2012-02-26 
关于调用子函数参数入栈顺序问题Assembly codeTestProcproclocal @loc1:doword,@loc2:wordlocal @loc3:byt

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

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指令推入的返回地址
ebppush 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

热点排行