在此之前,ebp和esp两个寄存器都在维护_tmainCRTStartup所分配的空间,接下来我们来分析反汇编代码:
1.
002718A0pushebp
push ----------------------压栈的意思,这一步我们将ebp压栈
2.
002718A1movebp,esp002718A3subesp,0E4h
mov:移动,将esp的值赋给edp
sub:减,将esp的值减去0E4h大小的空间
通过监视我们可以发现,此时esp和ebp的值已经一模一样了,说明ebp已经移到 _tmainCRTSstartup函数的栈顶了,并且esp的值也发生了变化,如图所示:
由此我们可以发现,减去的0E4h的大小原来是为main函数开辟的空间大小,而edp和esp也由维护原来的_tmainCRTSstartup函数的栈帧转变为维护main函数的栈帧了
3.
002718A9pushebx002718AApushesi002718ABpushedi
这里又是压栈了,将ebx,esi,edi从main函数栈顶依次压入:
4.
这里4条汇编指令的意思是将edi向下的39h这么大的空间里全部赋值为cccccccc,如图:
到这里main函数的栈帧就已经创建好了
5.
inta=10; 002718C5movdwordptr [ebp-8],0Ahintb=20; 002718CCmovdwordptr [ebp-14h],14hintc=0; 002718D3movdwordptr [ebp-20h],0c=Add(a, b);
这里是创建a,b,c三个变量,假设我们用一个格子代表4个字节,那么创建的a,b,c三个变量如下图所示:
通过查看内存可发现,刚好和我们在main函数栈帧里创建的吻合
6.
002718DAmoveax,dwordptr [ebp-14h] 002718DDpusheax002718DEmovecx,dwordptr [ebp-8] 002718E1pushecx
将[ebp-14h]的值传给eax,再进行压栈,将[ebp-8]的值传给ecx,再进行压栈,如图:
大家有没有发现,这一步操作正是我们函数的传参!