user-0 提问: 请教下一个简单的while反汇编

回复:
user: user-1
content: 这是n--造成的 其实差不多是这样(仅演示) mov n0, n sub n,1 cmp n0, 0 jle xxxx

user: user-2
content: 代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。

user: user-3
content: 这里的[ebp-0C8h]是用来保存n>0的结果的，这个while就相当于  for(;;) {     [ebp-0C4h]=n;     n=n-1;     [ebp-0C8h]=[ebp-0C4h]>0;     if([ebp-0C8h])break;     // ... }

user: user-0
content: 引用 3 楼 user-4 的回复:...局部变量[ebp-0C8h], 在n > 0 时置1, n <= 0 时置0, 然后[ebp-0C8h] 与0比较, 为0时跳出, 不然继续 你这是DUBUG未加优化版本的, 用release版本优化后, 应该就没这么麻烦了我就是看了半天没看懂这个和0比较到底有什么用，能再麻烦解释下么，这个置0和置1，有没有这个步骤，都可以跳转啊，那么这个存在的意义是什么呢

user: user-4
content: 引用 2 楼 onlykikyo 的回复:[quote=引用 1 楼 user-4 的回复:] 很简单, 你是太累了没仔细看   011913D0  push        ebp   011913D1  mov         ebp,esp   011913D3  sub         esp,0C8h   011913D9  push        ebx   011913DA  push        esi   011913DB  push        edi   011913DC  lea         edi,[ebp-0C8h]   011913E2  mov         ecx,32h   011913E7  mov         eax,0CCCCCCCCh   011913EC  rep stos    dword ptr es:[edi]   	while(n-->0)                                         // 先比较,后减 011913EE  mov         eax,dword ptr [n]   011913F1  mov         dword ptr [ebp-0C4h],eax   011913F7  mov         ecx,dword ptr [n]   011913FA  sub         ecx,1   011913FD  mov         dword ptr [n],ecx   01191400  cmp         dword ptr [ebp-0C4h],0              //   比较 01191407  jle         pound+45h (01191415h)   01191409  mov         dword ptr [ebp-0C8h],1               //   > 0 置1 01191413  jmp         pound+4Fh (0119141Fh)             //  跳到下面 01191415  mov         dword ptr [ebp-0C8h],0                 // <= 0; 跳到这 置0 0119141F  cmp         dword ptr [ebp-0C8h],0                 //  > 0 跳到这 01191426  je          pound+71h (01191441h)                 // 为0, 则<=0, 跳出  我是确实没理解到,为什么要置0呢，把[ebp-0C8H]置0了，有什么意义吗[/quote] ...局部变量[ebp-0C8h], 在n > 0 时置1, n <= 0 时置0, 然后[ebp-0C8h] 与0比较, 为0时跳出, 不然继续 你这是DUBUG未加优化版本的, 用release版本优化后, 应该就没这么麻烦了

user: user-0
content: 引用 1 楼 user-4 的回复:很简单, 你是太累了没仔细看   011913D0  push        ebp   011913D1  mov         ebp,esp   011913D3  sub         esp,0C8h   011913D9  push        ebx   011913DA  push        esi   011913DB  push        edi   011913DC  lea         edi,[ebp-0C8h]   011913E2  mov         ecx,32h   011913E7  mov         eax,0CCCCCCCCh   011913EC  rep stos    dword ptr es:[edi]   	while(n-->0)                                         // 先比较,后减 011913EE  mov         eax,dword ptr [n]   011913F1  mov         dword ptr [ebp-0C4h],eax   011913F7  mov         ecx,dword ptr [n]   011913FA  sub         ecx,1   011913FD  mov         dword ptr [n],ecx   01191400  cmp         dword ptr [ebp-0C4h],0              //   比较 01191407  jle         pound+45h (01191415h)   01191409  mov         dword ptr [ebp-0C8h],1               //   > 0 置1 01191413  jmp         pound+4Fh (0119141Fh)             //  跳到下面 01191415  mov         dword ptr [ebp-0C8h],0                 // <= 0; 跳到这 置0 0119141F  cmp         dword ptr [ebp-0C8h],0                 //  > 0 跳到这 01191426  je          pound+71h (01191441h)                 // 为0, 则<=0, 跳出 		printf("#"); 01191428  mov         esi,esp   0119142A  push        1195858h   0119142F  call        dword ptr ds:[11992BCh]   01191435  add         esp,4   01191438  cmp         esi,esp   0119143A  call        __RTC_CheckEsp (01191140h)   0119143F  jmp         pound+1Eh (011913EEh)  我是确实没理解到,为什么要置0呢，把[ebp-0C8H]置0了，有什么意义吗

user: user-4
content: 很简单, 你是太累了没仔细看   011913D0  push        ebp   011913D1  mov         ebp,esp   011913D3  sub         esp,0C8h   011913D9  push        ebx   011913DA  push        esi   011913DB  push        edi   011913DC  lea         edi,[ebp-0C8h]   011913E2  mov         ecx,32h   011913E7  mov         eax,0CCCCCCCCh   011913EC  rep stos    dword ptr es:[edi]   	while(n-->0)                                         // 先比较,后减 011913EE  mov         eax,dword ptr [n]   011913F1  mov         dword ptr [ebp-0C4h],eax   011913F7  mov         ecx,dword ptr [n]   011913FA  sub         ecx,1   011913FD  mov         dword ptr [n],ecx   01191400  cmp         dword ptr [ebp-0C4h],0              //   比较 01191407  jle         pound+45h (01191415h)   01191409  mov         dword ptr [ebp-0C8h],1               //   > 0 置1 01191413  jmp         pound+4Fh (0119141Fh)             //  跳到下面 01191415  mov         dword ptr [ebp-0C8h],0                 // <= 0; 跳到这 置0 0119141F  cmp         dword ptr [ebp-0C8h],0                 //  > 0 跳到这 01191426  je          pound+71h (01191441h)                 // 为0, 则<=0, 跳出 		printf("#"); 01191428  mov         esi,esp   0119142A  push        1195858h   0119142F  call        dword ptr ds:[11992BCh]   01191435  add         esp,4   01191438  cmp         esi,esp   0119143A  call        __RTC_CheckEsp (01191140h)   0119143F  jmp         pound+1Eh (011913EEh)