|
发表于 2013-2-15 20:04:49
|
显示全部楼层
- int a=-2, b=0;
- 00CE13CE mov dword ptr [a],0FFFFFFFEh
- 00CE13D5 mov dword ptr [b],0
- while( a++ && ++b )
- 00CE13DC mov eax,dword ptr [a]
- 00CE13DF mov dword ptr [ebp-0DCh],eax
- 00CE13E5 mov ecx,dword ptr [a]
- 00CE13E8 add ecx,1
- 00CE13EB mov dword ptr [a],ecx
- 00CE13EE cmp dword ptr [ebp-0DCh],0
- 00CE13F5 je main+54h (0CE1404h)
- 00CE13F7 mov eax,dword ptr [b]
- 00CE13FA add eax,1
- 00CE13FD mov dword ptr [b],eax
- 00CE1400 je main+54h (0CE1404h)
- ;
- 00CE1402 jmp main+2Ch (0CE13DCh)
- printf("%d %d", a, b);
复制代码 从这段反汇编代码看来可以知道,首先把a的值放在 [ebp-0DCh]的地方,然后a的值加1,然后再拿ptr [ebp-0DCh]的值与0比较,再对b的值进行加1,,,,,,注意,如果这时候ptr [ebp-0DCh]的值等于0,那么b不会自加,退出循环,所以...我简单的表述下:
第一次: a=-2 ,a的值加1,a=-1,拿-2和0比较,不相等,没有跳;b的值加1,b=1,不等于0,执行循环体
第二次: a=-1 ,a的值加1,a=0,拿-1和0比较,不相等,没有跳;b的值加1,b=2,不等于0,执行循环体
第三次: a=0,a的值加1,a=1,拿0和0比较, 相等 , 跳到输出语句 ;b的值 不会 再加1了;
所以a=1;b=2; |
|