C语言虽然是比较偏向底层的代码,但是后时候只通过表层的C语言执行顺序还不能完全理解C语言的执行过程,比如说i++和++i,可以通过反汇编代码来深入理解理解C语言,下面提供一个简单的main函数和add函数,可以了解到C语言汇编层面的内容。
下面的这个函数完成一个简单的相加功能:
#include
int add(int a, int b)
{
return a + b;
}
int main()
{
int a, b, c;
a = 1;
b = 2;
c = add(a, b);
printf("%d\n", c);
return 0;
}
首先按F9进行断点,然后按Alt+F8即可进入反汇编代码。
下面是main函数的反汇编代码:
8: int main()
9: {
0040D480 push ebp
0040D481 mov ebp,esp
0040D483 sub esp,4Ch
0040D486 push ebx
0040D487 push esi
0040D488 push edi
0040D489 lea edi,[ebp-4Ch]
0040D48C mov ecx,13h
0040D491 mov eax,0CCCCCCCCh
0040D496 rep stos dword ptr [edi]
10: int a, b, c;
11:
12: a = 1;
0040D498 mov dword ptr [ebp-4],1
13: b = 2;
0040D49F mov dword ptr [ebp-8],2
14:
15: c = add(a, b);
0040D4A6 mov eax,dword ptr [ebp-8]
0040D4A9 push eax
0040D4AA mov ecx,dword ptr [ebp-4]
0040D4AD push ecx
0040D4AE call @ILT+15(add) (00401014)
0040D4B3 add esp,8
0040D4B6 mov dword ptr [ebp-0Ch],eax
16:
17: printf("%d\n", c);
0040D4B9 mov edx,dword ptr [ebp-0Ch]
0040D4BC push edx
0040D4BD push offset string "%d\n" (0042201c)
0040D4C2 call printf (0040d740)
0040D4C7 add esp,8
18: return 0;
0040D4CA xor eax,eax
19: }
0040D4CC pop edi
0040D4CD pop esi
0040D4CE pop ebx
0040D4CF add esp,4Ch
0040D4D2 cmp ebp,esp
0040D4D4 call __chkesp (0040d700)
0040D4D9 mov esp,ebp
0040D4DB pop ebp
0040D4DC ret
下面是add函数的反汇编代码:
3: int add(int a, int b)
4: {
004010A0 push ebp
004010A1 mov ebp,esp
004010A3 sub esp,40h
004010A6 push ebx
004010A7 push esi
004010A8 push edi
004010A9 lea edi,[ebp-40h]
004010AC mov ecx,10h
004010B1 mov eax,0CCCCCCCCh
004010B6 rep stos dword ptr [edi]
5: return a + b;
004010B8 mov eax,dword ptr [ebp+8]
004010BB add eax,dword ptr [ebp+0Ch]
6: }
004010BE pop edi
004010BF pop esi
004010C0 pop ebx
004010C1 mov esp,ebp
004010C3 pop ebp
004010C4 ret