我想在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...
它只是重複的號碼。排序後的值甚至不在原始表格中。 我確定問題不在我提交的代碼之外,因爲如果我刪除它,重新編譯該程序就可以完美地重複生成的表。
編輯 非常感謝大家的貢獻。問題不是根據變量的大小來縮放偏移量。表格存儲單詞變量,而我通過字節迭代。
除了您的問題,這可能是您對字長數據進行字節寬訪問的結果,您可以簡化:而不是從表中讀取進行比較,然後再讀取仍在寄存器中的值,只需簡單地重用那一個。保留它在整個排序過程中註冊,除非交換。爲此目的有一個XCHG指令。簡化可以提供幫助,因爲它可以降低複雜性,並且可以通過更少的剩餘指令輕鬆找到缺陷。 –
我通常的建議是採取嬰兒的步驟 - 從2個不正確的數字表開始,並確保您的代碼適用於這些數字。然後改變它,以便它們已經處於有序狀態,並確保其正常工作。然後移動到3個元素,並嘗試所有的排列,並確保排序適用於所有這些。 *然後*您應該決定是跳轉到1024個數字和/或隨機化條目。 –
想想泡沫排序需要在一次通過中實現,而不是「交換」方面,而是「找到最高/最低編號」。 –