从汇编的角度看前自增和后自增的区别

上代码:

int _tmain(int argc, _TCHAR* argv[])
{
	int i = 0;
	int j = ++i;
	int k = i++;
	return 0;
}

 

汇编代码:

int _tmain(int argc, _TCHAR* argv[])
{
  push        ebp  				;保护栈指针,以便函数结束以后恢复调用者的栈状态
  mov         ebp,esp 				;下面两行建立新的栈空间
  sub         esp,0E4h 				;0E4是编译器计算出来的
  push        ebx  
  push        esi  				;保护现场
  push        edi  
  lea         edi,[ebp+FFFFFF1Ch]		;FFFFFF1Ch其实就是-0E4h,所以这里相当于lea edi,[ebp-0E4h];把栈的最低地址load到edi寄存器	 
  mov         ecx,39h 				;这里的39h是编译器计算出来的,你可以计算一下 4*39H=04EH
  mov         eax,0CCCCCCCCh 			;首先把所有的栈空间用ccH填充,即int 3的机器码,这样一旦程序试图执行这里面的内容,就会触发中断
  rep stos    dword ptr es:[edi] 		;(解释见上面)
	int i = 0;
  mov         dword ptr [ebp-8],0 		;初始化i
	int j = ++i;
  mov         eax,dword ptr [ebp-8]		;把i的值mov到eax寄存器
  add         eax,1 				;自加
  mov         dword ptr [ebp-8],eax 		;再存放至i变量中 
  mov         ecx,dword ptr [ebp-8] 		;变量i的值mov至临时空间:ecx
  mov         dword ptr [ebp-14h],ecx 		;ecx值mov到变量j
	int k = i++;
  mov         eax,dword ptr [ebp-8] 		;把i的值mov到eax寄存器
  mov         dword ptr [ebp-20h],eax 		;注意这里了!先把i的值赋给k,
  mov         ecx,dword ptr [ebp-8]		;下面三条语句完成++i操作 
  add         ecx,1 
  mov         dword ptr [ebp-8],ecx 
	return 0;
  xor         eax,eax 				;eax置0
}
  pop         edi  				;下面的语句完成恢复现场的工作(不同的函数调用约定有不同的栈清理方式,默认的__stdcall由被调用函数负责栈的清理工作)
  pop         esi  
  pop         ebx  
  mov         esp,ebp 
  pop         ebp  
  ret

 

最后想说的是:sorry,偏题了-_-(感觉说了一大堆汇编的东西)

posted @ 2012-05-04 19:24  kcy-666  阅读(1614)  评论(0编辑  收藏  举报