C语言2-参数的传递与返回值

Asura 2017年12月17日 95次浏览
short plus(short x,short y,short z,short m)
{
        return x+y+z+m;
}
void main()                        //入口程序 程序开始执行的地方
{
        //调用函数
        plus(1,2,3,4);
        return;                        //执行结束
}
找到plus函数的反汇编  理解每一行汇编代码  找到参数是如何传递  返回值是如何返回的

plus函数对应反汇编代码和意义

调用函数调用:

push 4
push 3
push 2
push 1
call  (plus) 0041100f
add esp,10h

下面是call内部

push    ebp
mov     ebp,esp
sub     esp,40h
以上三步都是为了提升堆栈,并且方便使用ebp寻址。并且esp在此时提升了 0x40,留下了 0x40大小的缓冲区

push    ebx
push    esi
push    edi
以上三条目的是为了保存函数调用前的三个寄存器的值,方便函数结束后恢复原值

lea     edi,[ebp-40h]       执行后edi=刚刚提升堆栈时的esp
mov     ecx,10h
mov     eax,0cccccccch
rep stos    dword ptr [edi]
此步骤将缓冲区全部置CC  CC在硬编码中标志着中断

movsx   eax,word ptr [ebp+8]
movsx   ecx,word ptr [ebp+0ch]
add     eax,ecx
movsx   edx,word ptr [ebp+10h]
add     eax,edx
movsx   ecx,word ptr [ebp+14h]
add     eax,ecx
这里就是真正的计算过程 

堆栈没有变化

pop     edi
pop     esi
pop     ebx
恢复备份的三个寄存器

mov     esp,ebp
pop     ebp
ret
恢复堆栈

出了call,在调用后执行的语句

恢复堆栈,返回调用地址  此时并没有平衡堆栈,据观察在调用后会使用
add esp,10h
恢复堆栈 

此时,已恢复堆栈,但是堆栈上留下一堆垃圾信息,这些信息随时都可以被利用!