1 #include <stdio.h>
2
3 int a_plus_b(int a, int b)
4 {
5 ;=============================================
6 ;保留当前的栈顶到ebp中,原始ebp存放到栈空间中
7 00401CB0 push ebp
8 00401CB1 mov ebp,esp
9 ;=============================================
10 ;在栈上预留8个字节的局部变量空间
11 00401CB3 sub esp,8
12 ;=============================================
13 int c1 = 1;
14 ;=============================================
15 ;c1的地址就是预留栈空间的第一个int空间处
16 00401CB6 mov dword ptr [c1],1
17 ;=============================================
18 int c3 = a+b-c1;
19 00401CBD mov eax,dword ptr [a]
20 00401CC0 add eax,dword ptr [b]
21 00401CC3 sub eax,dword ptr [c1]
22 ;=============================================
23 ;c3的地址是预留栈空间的第二个int空间处
24 00401CC6 mov dword ptr [c3],eax
25 ;=============================================
26 return c3;
27 00401CC9 mov eax,dword ptr [c3]
28 }
29 ;=============================================
30 ;将ebp中保存的原来刚进入该过程的栈顶位置重新赋值到esp中
31 ;称之为还原栈顶
32 00401CCC mov esp,ebp
33 ;=============================================
34 ;还原ebp
35 00401CCE pop ebp
36 ;=============================================
37 ;将栈顶保存的返回地址,弹出到eip中
38 00401CCF ret
39 ;=============================================
40
41 int main()
42 {
43 00401CD0 push ebp
44 00401CD1 mov ebp,esp
45 00401CD3 sub esp,0Ch
46 int a = 1, b = 2;
47 00401CD6 mov dword ptr [a],1
48 00401CDD mov dword ptr [b],2
49 //const char *cpc = "hello, world";
50
51 int c = a_plus_b(a, b);
52
53 ;=============================================
54 ;传递过程的参数
55 00401CE4 mov eax,dword ptr [b]
56 00401CE7 push eax
57 00401CE8 mov ecx,dword ptr [a]
58 00401CEB push ecx
59 ;=============================================
60 ;开始调用,注意这条语句之后的地址是:00401CF1
61 ;这个地址将要存放到当前栈顶
62 00401CEC call @ILT+0(_a_plus_b) (401005h)
63 ;=============================================
64 00401CF1 add esp,8
65 00401CF4 mov dword ptr [c],eax
66
67 printf("%d + %d = %d", a, b, c);
68 00401CF7 mov edx,dword ptr [c]
69 00401CFA push edx
70 00401CFB mov eax,dword ptr [b]
71 00401CFE push eax
72 00401CFF mov ecx,dword ptr [a]
73 00401D02 push ecx
74 00401D03 push offset ___globallocalestatus-10h (405000h)
75 00401D08 call dword ptr [__imp__printf (406230h)]
76 00401D0E add esp,10h
77 }
78 00401D11 xor eax,eax
79 00401D13 mov esp,ebp
80 00401D15 pop ebp