所以如果是值传递,函数调用后,值是不变的。因为函数里的参数在在调用时刻前压栈,然后对其修改,而call函数调用后,又恢复的。
所以没有对之前临时变量做任何改变。
改变的只是压栈的另一份拷贝变量,该份拷贝在调用后又恢复了。没有给实际的参数造成实际的改变。
3: void foo(int a,int b)
4: {
00401020 push ebp
00401021 mov ebp,esp
00401023 sub esp,40h
00401026 push ebx
00401027 push esi
00401028 push edi
00401029 lea edi,[ebp-40h]
0040102C mov ecx,10h
00401031 mov eax,0CCCCCCCCh
00401036 rep stos dword ptr [edi]
5:
6: printf("%d %d\n",a,b);
00401038 mov eax,dword ptr [ebp+0Ch]
0040103B push eax
0040103C mov ecx,dword ptr [ebp+8]
0040103F push ecx
00401040 push offset string "%d %d\n" (0042201c)
00401045 call printf (00401100)
0040104A add esp,0Ch
7: }
9: int main()
10: {
00401080 push ebp
00401081 mov ebp,esp
00401083 sub esp,48h
00401086 push ebx
00401087 push esi
00401088 push edi
00401089 lea edi,[ebp-48h]
0040108C mov ecx,12h
00401091 mov eax,0CCCCCCCCh
00401096 rep stos dword ptr [edi]
11: int a = 2;
00401098 mov dword ptr [ebp-4],2
12: int b =2;
0040109F mov dword ptr [ebp-8],2
13: foo(a,b);
004010A6 mov eax,dword ptr [ebp-8]
004010A9 push eax
004010AA mov ecx,dword ptr [ebp-4]
004010AD push ecx
004010AE call @ILT+5(foo) (0040100a)
004010B3 add esp,8----------------------------------恢复
14: printf("%d %d",a,b);
004010B6 mov edx,dword ptr [ebp-8]
004010B9 push edx
004010BA mov eax,dword ptr [ebp-4]
004010BD push eax
004010BE push offset string "%d %d" (00422024)
004010C3 call printf (00401100)
004010C8 add esp,0Ch------------------------------恢复
15: return 0;
004010CB xor eax,eax
16: }