无论是在判断还是在循环的过程中,通常在遇到合适的条件的时候就会退出相应的模块。跳出模块运行的方式很多,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 resource two */ == 0) if(/* get resource three */ == 0) if(/* get resource four */ == 0) /* ... */ } |