2014-11-06 84 views
0

我發佈這個,因爲發現這個任務相當困難,並且StackOverflow幫了我無數次。希望這會幫助別人。如何在NASM中對數組進行排序?

問題描述:

在讀取N個整數,通過零值終止(不使用零)。將這些數字按升序排序並打印出來。如果在值爲零之前沒有輸入數據,或者輸入了太多數據並且會使數組溢出,則必須產生錯誤消息。該程序應該能夠處理多達100個整數值。

方法:

我決定用冒泡排序,其遍歷在陣列N次大小N.它着眼於每個值,並將其與下一個值的數組的每個值;如果第一個值高於下一個值,則切換它們。這可以很容易地修改,以降序列出它們。無論如何,這裏最困難的是在nasm中處理一個嵌套循環,並正確地循環所有的ecx值和內容。我發佈的代碼很好評論。此外,任何建設性的批評都是值得歡迎的,正如問題一樣。在這個項目上

思考:

我認爲有可能是一個更好的方式去通過元素數組中,而不是使用EBX。 Masm有一個指針可以用來迭代值。此代碼正常工作並符合要求,但它可能會更好。另外,冒泡排序可能不是最好的方式。我知道還有其他的排序算法,但泡泡似乎是在nasm中最容易實現的。

回答

1

在問題中包含您的解決方案會更好。現在看來這個問題已經被回答了,並且不再需要關注。幸運的是,這裏是我的想法:

你必須用101個雙字初始化數組,因爲在跳轉到標籤tooManyInts之前,你將存儲那麼多輸入。
遞減ECX時,您評論它是因爲基於0的索引。這不是真的。這是因爲一系列N個元素需要N-1個比較。
我發現很難跟蹤堆棧上的內容。我可能會建議你這樣評論

push ecx ;(1) 
dec ecx 
push ecx ;(2) 
... 
loop L3 
pop ecx  ;(2) 
SetWrite: 
xor ebx,ebx 
pop ecx  ;(1) 
+0

它不存儲第101個值;在閱讀101st int後,它跳轉到toomanyints。它在將值寫入數組之前將ex與100進行比較。此外,關於基於0的索引,我想我的意思是[intArray]指向第一個值,[intArray + ecx * 4]將在ex爲數組長度的情況下拋出一些等價的空指針異常,因爲如果數組有100個值,則第一個值是[intArray],而最後一個值是[intArray + 4 * 99]。但對於泡沫排序,我相信你對n-1比較是正確的。 – amaleemur 2014-11-11 17:53:52

+0

並且在任何時候堆棧上的值不會超過兩個:第一個ecx(稍後寫入的值的數量)被壓入,然後按下ecx-1(外循環應執行的次數)。 – amaleemur 2014-11-11 17:55:53

+0

但謝謝你的反饋!我確實認爲這個問題是完全解答的,因爲它是在問題指定的時候運行的。彙編語言很棘手,我希望能夠幫助任何未來的學生,我決定改變你指出的評論。 – amaleemur 2014-11-11 17:57:47