用汇编的眼光看C++(之退出流程)

发表于:2012-5-23 09:43

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:feixiaoxing    来源:51Testing软件测试网采编

  无论是在判断还是在循环的过程中,通常在遇到合适的条件的时候就会退出相应的模块。跳出模块运行的方式很多,break,continue,return都可以。下面我们就可以分别对他们进行将介绍。

  (1)continue只能用于循环,而break循环、判断都可以应用。两者有什么区别呢?

21:       for(int m = 10; m < 100;  m ++)
00401638   mov         dword ptr [ebp-4],0Ah
0040163F   jmp         process+2Ah (0040164a)
00401641   mov         eax,dword ptr [ebp-4]
00401644   add         eax,1
00401647   mov         dword ptr [ebp-4],eax
0040164A   cmp         dword ptr [ebp-4],64h
0040164E   jge         process+55h (00401675)
22:       {
23:           if(m / 20 == 3)
00401650   mov         eax,dword ptr [ebp-4]
00401653   cdq
00401654   mov         ecx,14h
00401659   idiv        eax,ecx
0040165B   cmp         eax,3
0040165E   jne         process+42h (00401662)
24:           {
25:               break;
00401660   jmp         process+55h (00401675)
26:           }
27:
28:           if(m / 10 == 0)
00401662   mov         eax,dword ptr [ebp-4]
00401665   cdq
00401666   mov         ecx,0Ah
0040166B   idiv        eax,ecx
0040166D   test        eax,eax
0040166F   jne         process+53h (00401673)
29:           {
30:               continue;
00401671   jmp         process+21h (00401641)
31:           }
32:       }
00401673   jmp         process+21h (00401641)

  我们在循环模块里面可以看到了代码做了两次判断。一次判断是查看m除以20是否等于3,一次判断是查看m除以10是否可以整除。同样,前面的判断结果是break,后面的结果是continue,那么两者之间的区别是什么呢?我们可以好好看一下。在第一次条件判断的时候,我们发现如果m除以20不等于3,那么下面指令直接跳转到0x00401662,也就是第二条件的入口处。但是如果第一个条件判断成功了,那么程序就会跳转到地址0x00401675,也就是说整个循环模块已经结束了。而continue呢?我们发现不管条件判断是否为真,那么指令都会跳转到0x00401641处执行,也就是循环+1的地方。这说明continue结束的只是本次循环,整个循环的流程还没有结束,而break表示当前已经推出了整个循环模块。如果大家对书本上的概念还有些模糊的话,那么汇编指令在这里已经把细节之处解释得明明白白了。

  (2)goto一般用的情况不多,但是有一种情况例外?

void  process()
{
 if(/* get resources one */ == 0)
 {
  return;
 }

 if(/* get resource two  */ == 0)
 {
  /* free resource one */
  return;
 }

 if(/* get resource three */ == 0)
 {
  /* free resource two */
  /* free resource one */
  return;
 }

 if(/* get resource four */ == 0)
 {
  /* free resource three */
  /* free resource two */
  /* free resource one */
  return;
 }

 /* ... */

}

21/212>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号