用彙編的眼光看C (之迴圈流程)

2021-06-22 23:59:20 字數 2612 閱讀 4020

迴圈是我們程式設計中遇到的另外一項重要技術。通過反覆的迭代運算,我們可以獲取想要的任何結果。當然這種迭代是有基本條件的,或是以時間為條件的,或是以空間為條件的,或者是某一種外來互動作為條件的。迴圈的方式有很多種,但是常用的還是:while、for、do-while、goto這幾種。很多公司的專案都不喜歡goto,這其中倒不是說goto不好,主要是goto的隨意性太大,一旦用的不好,就會降低**的可讀性,反而影響其他人的工作效率。

(1)do-while為什麼先執行,後判斷?

老規矩,我們還是先看**示例再說:

[cpp]view plain

copy

21:       

intm = 10;  

00401638   mov         dword ptr [ebp-4],0ah  

22:       do

while

(m < 10);  

00401659   cmp         dword ptr [ebp-4],0ah  

0040165d   jl          process+1fh (0040163f)  

如果換成while呢?

[cpp]view plain

copy

21:       

intm = 10;  

00401638   mov         dword ptr [ebp-4],0ah  

22:       while

(m < 20)  

0040163f   cmp         dword ptr [ebp-4],14h  

00401643   jge         process+41h (00401661)  

23:         

0040165f   jmp         process+1fh (0040163f)  

27:   }  

其實,上面的**表現已經很明顯了。do-while的時候,模組上來先進行運算,然後再判斷資料範圍的大小;while就不一樣,上來就進行判斷,判斷成功就繼續執行,否則就退出迴圈模組,如果是for的情況呢?

[cpp]view plain

copy

21:       

for(

intm = 10; m < 20; 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],14h  

0040164e   jge         process+4ch (0040166c)  

22:         

0040166a   jmp         process+21h (00401641)  

我們發現,其實for和上面的while,do-while有點小區別。在m第一次賦值的時候,並不進行加1處理,而是直接跳到位址0x40164a處執行,判斷m數值和20進行判斷。判斷成功,則跳入迴圈模組,否則越過迴圈模組。那麼,在迴圈處理結束後呢?也就是m++後,迴圈模組是怎麼處理的?我們發現**又回到了0x00401641處處理。但是這裡並不是整個迴圈模組開始出的**,而是對m進行自增處理。完成自增後,繼續判斷,下面的流程和第一次一樣,不再贅述。

(2)多重迴圈怎麼跳出來?

[cpp]view plain

copy

intflag = 0;   

for(

intm = 1; m < 20 && !flag; m++)  

}  }  

(3)while(1)是否有其他的表示方法?

[cpp]view plain

copy

intflag = 0;  

for(;;)   

dowhile

(1);  

loop:  

if(!flag)  

goto

loop;  

總結:其實,迴圈中還有很多的細節需要處理,你比如說:

(1)迴圈的時候請務必填上程式終止的條件

(2)迴圈的時候注意8位char和32和int之間的區別,務必不要死迴圈

(3)字元的迴圈務必注意『\0』

(4)不要把迴圈、判斷合二為1,給你的同事留條活路,不要以為while(*dst ++  = *src ++);這樣寫**很帥

(5)務必注意自己的返回值是你需要的那個位址,還是前乙個位址,還是下乙個位址

(6)不要在for(;;)中新增額外的語句,加的越多,風險越多

用彙編的眼光看C (之迴圈流程)

迴圈是我們程式設計中遇到的另外一項重要技術。通過反覆的迭代運算,我們可以獲取想要的任何結果。當然這種迭代是有基本條件的,或是以時間為條件的,或是以空間為條件的,或者是某一種外來互動作為條件的。迴圈的方式有很多種,但是常用的還是 while for do while goto這幾種。很多公司的專案都不...

用彙編的眼光看C (之退出流程)

無論是在判斷還是在迴圈的過程中,通常在遇到合適的條件的時候就會退出相應的模組。跳出模組執行的方式很多,break,continue,return都可以。下面我們就可以分別對他們進行將介紹。1 continue只能用於迴圈,而break迴圈 判斷都可以應用。兩者有什麼區別呢?view plain 21...

用彙編的眼光看C (之退出流程)

無論是在判斷還是在迴圈的過程中,通常在遇到合適的條件的時候就會退出相應的模組。跳出模組執行的方式很多,break,continue,return都可以。下面我們就可以分別對他們進行將介紹。1 continue只能用於迴圈,而break迴圈 判斷都可以應用。兩者有什麼區別呢?21 for int m ...