从汇编到C++

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

2018-05-04  本文已影响0人  Asura_Luo

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

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
image

下面是call内部

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

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

image
lea     edi,[ebp-40h]       执行后edi=刚刚提升堆栈时的esp
mov     ecx,10h   
mov     eax,0cccccccch
rep stos    dword ptr [edi]

此步骤将缓冲区全部置CC  CC在硬编码中标志着中断

image
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

恢复备份的三个寄存器

image
mov     esp,ebp
pop     ebp
ret

恢复堆栈
image

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

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

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

上一篇 下一篇

猜你喜欢

热点阅读