2009-11-13 78 views
1

我被要求用匯編語言創建一個簡單的循環,但是我遇到了麻煩,因爲循環並沒有結束,它應該會在無限循環中繼續。無法打破一個簡單的彙編循環

我需要給ECX一個輸入的變量,但是在我的代碼中,即使我直接指定計數器仍然陷入無限循環。

我的代碼是在這裏(修訂版):

PasteBin Code

的代碼可能包含比實際的循環其他錯誤。

//用於編輯的程序要求解釋...

程序需要採取哪些將被用作櫃檯循環輸入「N」。然後我輸入「n」多個數字,當一個數字是正數時,我需要將它添加到變量postot中,當負數時,我需要將它添加到變量negatot中。在輸入「n」個數字後,我打印每個變量的結果並退出程序。

編輯2:

通過正確地清除棧固定環路問題,所以我說:

 add esp,8 

和:

next: push ecx 
     ... 
pop ecx 
loop next 

哪個固定的循環問題。

+0

我什至不能告訴它的問題。 – bmargulies 2009-11-13 16:10:41

+1

只有一個循環。 – Ash 2009-11-13 17:09:31

回答

1

好的,我明白了。 。 。 您從用戶讀取int數。 然後在第41行,你要麼跳到第47行,要麼跳到第43行。

如果你到了第43行,你就到達第45行,跳到第49行(結束)。 如果相反,你去了第47行,你會跌到第49行(結束)。

在這兩種情況下,您都會回到第29行(下一步)。

你期望達到的ECX寄存器遞減每一次循環,併爲它的循環處理過程中保持不變。

你有沒有試過在第29行左右推ecx,並在你循環之前彈出它?

+0

作爲一個快速測試,從30到49行中刪除所有內容。如果它退出循環,那麼你知道循環內部正在改變ecx的價值 – Andres 2009-11-13 16:35:06

+0

它可以在我刪除所有內容的情況下工作,我可以在自動窗口(Visual Basic C++)中看到ECX計數器遞減。 – Ash 2009-11-13 16:57:38

+1

你有沒有嘗試推動和突破ecx? – Andres 2009-11-13 17:35:30

0

我看到了兩個錯誤:

  • 那裏面有一個JG positive後,你增加一個堆棧指針。你確定你想檢查你的堆棧框架的擺弄結果,而不是你輸入的數字的值嗎?

  • jmp end沒有:end之後是loop next。我沒有看到任何終止循環的條件。

+0

我認爲如果ECX爲0,循環會自動結束? – Ash 2009-11-13 16:25:58

+0

它應該,你可以隨時嘗試sub ecx,1 cmp ecx 0 je SOMEOTHERLABEL – Andres 2009-11-13 16:37:10