从汇编的角度看前自增和后自增的区别
上代码:
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,偏题了-_-(感觉说了一大堆汇编的东西)