2014-06-09 35 views
0

我想在16b dos程序集(我正在使用NASM)中實現bubblesort。我的程序成功地生成了1024個隨機16b數字的表格,現在我必須按降序對它們進行排序,我決定使用bubblesort,但是我交換它們的方式並不按我認爲應該的方式工作。下面是用於交換兩個數字代碼:DOS彙編 - 在bubblesort中交換值

mov ax, [table+di] 
cmp ax, [table+di+1] 
jae dont_swap 
mov bx, [table+di+1] 
mov [table+di+1], ax 
mov [table+di], bx 

它應該只是交換了許多「迪」指向與該表中的下一個。這是我很難解釋的效果所以只是看一些輸出的程序給出:

-first few randomly generated numbers: 61923, 48369, 17084, 52802, 49358 
-after sorting: 28482, 17007, 16962, 16962, 16962... 

它只是重複的號碼。排序後的值甚至不在原始表格中。 我確定問題不在我提交的代碼之外,因爲如果我刪除它,重新編譯該程序就可以完美地重複生成的表。

編輯 非常感謝大家的貢獻。問題不是根據變量的大小來縮放偏移量。表格存儲單詞變量,而我通過字節迭代。

+0

除了您的問題,這可能是您對字長數據進行字節寬訪問的結果,您可以簡化:而不是從表中讀取進行比較,然後再讀取仍在寄存器中的值,只需簡單地重用那一個。保留它在整個排序過程中註冊,除非交換。爲此目的有一個XCHG指令。簡化可以提供幫助,因爲它可以降低複雜性,並且可以通過更少的剩餘指令輕鬆找到缺陷。 –

+0

我通常的建議是採取嬰兒的步驟 - 從2個不正確的數字表開始,並確保您的代碼適用於這些數字。然後改變它,以便它們已經處於有序狀態,並確保其正常工作。然後移動到3個元素,並嘗試所有的排列,並確保排序適用於所有這些。 *然後*您應該決定是跳轉到1024個數字和/或隨機化條目。 –

+0

想想泡沫排序需要在一次通過中實現,而不是「交換」方面,而是「找到最高/最低編號」。 –

回答

0

由於您正在比較和交換單詞,因此需要相應地縮放偏移量。下一個元素將是當前元素之後的2個字節,即[table+di+2]

你沒有告訴我們你是如何計算/更新di,所以不要忘記,它也需要移動每個元素2個字節。

+0

該表格以這種方式聲明: 表倍數1024 dw 0 您的建議是否仍適用? – Tomek

+0

是的。該聲明實際上只是說明您爲陣列預留了多少存儲空間。 'table'實際上是一個2048字節的存儲地址,可以存放任何類型的數據。重要的是您如何在代碼中訪問該地址。如果您嘗試從/讀取/寫入單詞,則需要使用相距2個字節的地址,因爲這是x86處理器上單詞的大小。 – Michael