【c++】关于左右自增的汇编分析 无赋值情况 有赋值情况 总结

汇编中的加法,是对寄存器做加法,需要先将变量存入寄存器。

例如i=i+1

1
2
3
mov eax, dword ptr[i]
add eax, 1
mov dword ptr[i], eax

汇编中的赋值,需要先将变量值暂存到寄存器,从寄存器再赋值到另一个变量

例如int a = i

1
2
mov eax, dword ptr [i]
mov dword ptr [a], eax

例如int a = 1

1
mov dword ptr [a], 1

无赋值情况

无赋值情况,++i与i++实际上汇编代码没有什么不同

++i;

1
2
3
mov eax, dword ptr [i]
add eax, 1
mov dword ptr [i], eax

i++;

1
2
3
mov eax, dword ptr [i]
add eax, 1
mov dword ptr [i], eax

有赋值情况

有赋值的表现就会有所不同

int a = ++i;

1
2
3
4
5
mov eax, dword ptr[i]
add eax, 1
mov dword ptr [i], eax
mov ecx, dword ptr[i]
mov dword ptr [a], ecx

int a = i++;

1
2
3
4
5
mov eax, dword ptr[i]
mov dword ptr [a], eax
mov ecx, dword ptr[i]
add ecx, 1
mov dword ptr [i], ecx

总结

无赋值情况的汇编语句表现是一样的,对于有赋值语句,则有所不同。

  1. int a = ++i是先完成加法再做赋值
  2. int a = i++是先完成赋值再做加法