|
|
发表于 2013-1-1 05:08:39
|
显示全部楼层
本帖最后由 メ㊣逆ご帅☆ 于 2013-1-1 14:59 编辑
简单点讲就是x=6,y=7,z=8,r;
操作是这样的首先--x=5
y++=8
x+y=13
然后传入参数13
也就是你子程序中的形参a
--z=7
传入参数7
也就是子程序的形参b
然后进入你的子程序
c=a+b=13+7=20
这就是结果
11: r=wo((--x,y++,x+y),--z);// z-- 出错
0040FA3D mov eax,dword ptr [ebp-4];EAX赋值为变量x
0040FA40 sub eax,1;EAX减一
0040FA43 mov dword ptr [ebp-4],eax;赋值给变量X,这上面三句对应--x
0040FA46 mov ecx,dword ptr [ebp-8];ecx赋值变量y
0040FA49 add ecx,1;ecx加一
0040FA4C mov dword ptr [ebp-8],ecx;赋值给变量y,这上面三句对应y++
0040FA4F mov edx,dword ptr [ebp-0Ch];edx赋值变量z
0040FA52 sub edx,1;EDX自减1
0040FA55 mov dword ptr [ebp-0Ch],edx;EDX赋值给变量Z,对应的是--z
0040FA58 mov eax,dword ptr [ebp-0Ch];eax赋值为Z变量
0040FA5B push eax;传入参数Z
0040FA5C mov ecx,dword ptr [ebp-4];ecx赋值为变量X
0040FA5F add ecx,dword ptr [ebp-8];ECX加上变量Y,对应X+Y
0040FA62 push ecx;传入参数
0040FA63 call @ILT+5(_wo) (0040100a);CALL你的子程序
0040FA68 add esp,8;平衡栈
0040FA6B mov dword ptr [ebp-10h],eax;return c 结果为20
至于为什么Z--的结果为21
因为编译器是这样操作的
你是Z--,意思就是Z先参加其他运算后再进行自减
也就是前面的照样结果为13
后面你传的参数Z先不要自减
先进入子程序,等计算完后也就是结果为21时return后自减
|
|