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

浙公网安备 33010602011771号