【发布时间】:2014-06-09 14:06:35
【问题描述】:
我正在尝试在 16b dos 程序集中实现冒泡排序(我正在使用 NASM)。我的程序成功生成了 1024 个随机 16b 数字的表,现在我必须按降序对它们进行排序,我决定使用冒泡排序,但我交换它们的方式并没有按照我认为的方式工作。这是交换两个数字的代码:
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
它应该只是将“di”指向的数字与表中的下一个数字交换。我很难解释效果,所以看看程序给出的一些输出:
-first few randomly generated numbers: 61923, 48369, 17084, 52802, 49358
-after sorting: 28482, 17007, 16962, 16962, 16962...
它只是重复最后一个数字。排序后的值甚至不在原始表中。 我确信问题不在我提供的代码之外,因为如果我删除它,重新编译程序它会完美地重复生成的表。
编辑 非常感谢所有做出贡献的人。问题是没有根据变量的大小缩放偏移量。当我遍历字节时,表存储单词变量。
【问题讨论】:
-
除了你的问题,这可能是你对字长数据进行字节宽访问的结果,你可以简化:而不是从表中读取进行比较,然后再次读取仍然存在的值在一个寄存器中,只需重复使用那个。除非交换,否则将其保存在整个排序过程中。为此目的有一个 XCHG 指令。简化会有所帮助,因为它降低了复杂性,并且在剩余指令更少时更容易发现错误。
-
我通常的建议是采取小步骤 - 从一个包含 2 个顺序不正确的数字的表格开始,并确保您的代码适用于这些数字。然后对其进行更改,以使它们已经井然有序,并确保其有效。然后移动最多 3 个元素,并尝试所有排列并确保排序适用于所有这些。 那么您应该决定是否跳转到 1024 个数字和/或随机化条目。
-
考虑一下冒泡排序需要一次性实现的目标,而不是“交换”,而是“查找最高/最低数字”。