这是一个C语言小程序,通过C++6.0查看他的汇编代码如下,请高手帮忙解释一下
1: #include <stdio.h>
2:
3: int main()
4: {
00401010 push ebp
00401011 mov ebp,esp
00401013 sub esp,44h
00401016 push ebx
00401017 push esi
00401018 push edi
00401019 lea edi,[ebp-44h]
0040101C mov ecx,11h
00401021 mov eax,0CCCCCCCCh
00401026 rep stos dword ptr [edi]
5: int a = 3;
00401028 mov dword ptr [ebp-4],3
6: printf("%d\n",a+=a-=a*a);
0040102F mov eax,dword ptr [ebp-4]
00401032 imul eax,dword ptr [ebp-4]
00401036 mov ecx,dword ptr [ebp-4]
00401039 sub ecx,eax
0040103B mov dword ptr [ebp-4],ecx
0040103E mov edx,dword ptr [ebp-4]
00401041 add edx,dword ptr [ebp-4]
00401044 mov dword ptr [ebp-4],edx
00401047 mov eax,dword ptr [ebp-4]
0040104A push eax
0040104B push offset string "%d\n" (0042201c)
00401050 call printf (00401090)
00401055 add esp,8
7: return 0;
00401058 xor eax,eax
8: }
0040105A pop edi
0040105B pop esi
0040105C pop ebx
0040105D add esp,44h
00401060 cmp ebp,esp
00401062 call __chkesp (00401110)
00401067 mov esp,ebp
00401069 pop ebp
最前面和最后面是编译器用来做栈处理和检查的,就不用解释了吧。
第5行的 int a = 3 翻译成汇编就是把内存地址[ebp-4]的位置写入数字3,后面的[ebp-4]都表示变量a。
然后就是第6行的翻译
eax=a=3; eax=eax*a=3*3=9; ecx=a=3; ecx=ecx-eax=3-9=-6;
a=ecx=-6; edx=a=-6; edx=edx+a=-6+(-6)=-12; a=edx=-12; eax=a=-12;
然后eax压栈作为第二个参数调用printf。输出-12
最后用xor eax,eax将eax置0,作为返回值。